![]() 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":"4446.48b3a9bdca24c9dbd111.js","mappings":"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","sources":["webpack://mattermost-webapp/./src/components/channel_bookmarks/bookmark_icon.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/create_modal_name_input.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/channel_bookmarks_create_modal.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/channel_bookmarks_menu.tsx"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {FileGenericOutlineIcon, BookOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {ChannelBookmark} from '@mattermost/types/channel_bookmarks';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport FileThumbnail from 'components/file_attachment/file_thumbnail';\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\n\nimport {trimmedEmojiName} from 'utils/emoji_utils';\nimport {getImageSrc} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n type: ChannelBookmark['type'];\n emoji?: string;\n imageUrl?: string;\n fileInfo?: FileInfo | FilePreviewInfo;\n size?: 16 | 24;\n}\n\nconst BookmarkIcon = ({\n type,\n emoji,\n imageUrl,\n fileInfo,\n size = 16,\n}: Props) => {\n let icon = type === 'link' ? <BookOutlineIcon size={size}/> : <FileGenericOutlineIcon size={size}/>;\n const emojiName = emoji && trimmedEmojiName(emoji);\n const hasImageProxy = useSelector((state: GlobalState) => getConfig(state).HasImageProxy === 'true');\n\n if (emojiName) {\n icon = (\n <RenderEmoji\n emojiName={emojiName}\n size={size}\n />\n );\n } else if (imageUrl) {\n icon = (\n <BookmarkIconImg\n src={getImageSrc(imageUrl, hasImageProxy)}\n size={size}\n />\n );\n } else if (fileInfo) {\n icon = (\n <FileThumbnail\n fileInfo={fileInfo}\n disablePreview={true}\n />\n );\n }\n\n return (\n <Icon $size={size}>\n {icon}\n </Icon>\n );\n};\n\nexport default BookmarkIcon;\n\nconst Icon = styled.div<{$size: number}>`\n padding: 3px 1px 3px 2px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n\n .file-icon {\n width: ${({$size: size}) => size}px;\n height: ${({$size: size}) => size}px;\n background-size: ${({$size: size}) => size * 0.8}px ${({$size: size}) => size}px;\n margin-top: 1px;\n }\n\n`;\n\nconst BookmarkIconImg = styled.img<{size: number}>`\n width: ${({size}) => size}px;\n height: ${({size}) => size}px;\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport React, {useCallback, useRef} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {ChevronDownIcon} from '@mattermost/compass-icons/components';\nimport type {ChannelBookmark} from '@mattermost/types/channel_bookmarks';\nimport type {Emoji} from '@mattermost/types/emojis';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport Constants, {A11yCustomEventTypes, type A11yFocusEventDetail} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nimport BookmarkIcon from './bookmark_icon';\n\ntype Props = {\n maxLength: number;\n type: ChannelBookmark['type'];\n fileInfo: FileInfo | undefined;\n imageUrl: string | undefined;\n emoji: string | undefined;\n setEmoji: React.Dispatch<React.SetStateAction<string>>;\n placeholder: string | undefined;\n displayName: string | undefined;\n setDisplayName: React.Dispatch<React.SetStateAction<string | undefined>>;\n showEmojiPicker: boolean;\n setShowEmojiPicker: React.Dispatch<React.SetStateAction<boolean>>;\n onAddCustomEmojiClick?: () => void;\n}\nconst CreateModalNameInput = ({\n maxLength,\n type,\n imageUrl,\n fileInfo,\n emoji,\n setEmoji,\n placeholder,\n displayName,\n setDisplayName,\n showEmojiPicker,\n setShowEmojiPicker,\n onAddCustomEmojiClick,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n const targetRef = useRef<HTMLButtonElement>(null);\n const getTargetRef = () => targetRef.current;\n\n const icon = (\n <BookmarkIcon\n type={type}\n size={24}\n emoji={emoji}\n fileInfo={fileInfo}\n imageUrl={imageUrl}\n />\n );\n\n const refocusEmojiButton = () => {\n if (!targetRef.current) {\n return;\n }\n\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: targetRef.current,\n keyboardOnly: true,\n },\n },\n ));\n };\n\n const toggleEmojiPicker = () => setShowEmojiPicker((prev) => !prev);\n\n const handleEmojiClick = (selectedEmoji: Emoji) => {\n setShowEmojiPicker(false);\n const emojiName = ('short_name' in selectedEmoji) ? selectedEmoji.short_name : selectedEmoji.name;\n setEmoji(`:${emojiName}:`);\n refocusEmojiButton();\n };\n\n const handleEmojiClear = () => {\n setEmoji('');\n };\n\n const handleEmojiClose = () => {\n setShowEmojiPicker(false);\n refocusEmojiButton();\n };\n\n const handleInputChange: ComponentProps<typeof Input>['onChange'] = useCallback((e) => {\n setDisplayName(e.currentTarget.value);\n }, []);\n\n const handleEmojiKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (isKeyPressed(e, Constants.KeyCodes.ENTER)) {\n e.stopPropagation();\n }\n };\n\n const handleEmojiResetKeyDown = (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n if (isKeyPressed(e, Constants.KeyCodes.ENTER) || isKeyPressed(e, Constants.KeyCodes.SPACE)) {\n e.stopPropagation();\n handleEmojiClear();\n }\n };\n\n return (\n <>\n <NameWrapper>\n {showEmojiPicker && (\n <EmojiPickerOverlay\n target={getTargetRef}\n show={showEmojiPicker}\n onHide={handleEmojiClose}\n onEmojiClick={handleEmojiClick}\n placement='right'\n onAddCustomEmojiClick={onAddCustomEmojiClick}\n />\n\n )}\n <button\n ref={targetRef}\n type='button'\n onClick={toggleEmojiPicker}\n onKeyDown={handleEmojiKeyDown}\n aria-label={formatMessage({id: 'emoji_picker.emojiPicker.button.ariaLabel', defaultMessage: 'select an emoji'})}\n aria-expanded={showEmojiPicker ? 'true' : 'false'}\n\n className='channelBookmarksMenuButton emoji-picker__container BookmarkCreateModal__emoji-button'\n >\n {icon}\n <ChevronDownIcon size={'12px'}/>\n </button>\n <Input\n maxLength={maxLength}\n type='text'\n name='bookmark-display-name'\n onChange={handleInputChange}\n value={displayName ?? placeholder ?? ''}\n placeholder={placeholder}\n data-testid='titleInput'\n useLegend={false}\n />\n <Clear\n visible={Boolean(emoji)}\n tabIndex={0}\n onClick={handleEmojiClear}\n onKeyDown={handleEmojiResetKeyDown}\n >\n <FormattedMessage\n id='channel_bookmarks.create.title_input.clear_emoji'\n defaultMessage='Remove emoji'\n />\n </Clear>\n </NameWrapper>\n </>\n );\n};\n\nconst Clear = styled.a<{visible: boolean}>`\n font-size: 12px;\n visibility: ${({visible}) => (visible ? 'visible' : 'hidden')};\n`;\n\nconst NameWrapper = styled.div`\n position: relative;\n\n > button {\n position: absolute;\n left: 1px;\n top: 1px;\n z-index: 5;\n width: 57px;\n height: 44px;\n border-radius: 4px 0 0 4px;\n border-right: 1px solid rgba(var(--center-channel-color-rgb), 0.16);\n\n align-items: center;\n justify-content: center;\n gap: 0;\n padding-left: 6px;\n padding-right: 2px;\n\n svg {\n flex-shrink: 0;\n }\n }\n\n .Input_container {\n\n }\n\n .Input_wrapper {\n padding-left: 7rem;\n }\n`;\n\nexport default CreateModalNameInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent, MouseEvent, ReactNode} from 'react';\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {PencilOutlineIcon, CheckIcon} from '@mattermost/compass-icons/components';\nimport {GenericModal} from '@mattermost/components';\nimport type {ChannelBookmark, ChannelBookmarkCreate, ChannelBookmarkPatch} from '@mattermost/types/channel_bookmarks';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFile} from 'mattermost-redux/selectors/entities/files';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport type {UploadFile} from 'actions/file_actions';\nimport {uploadFile} from 'actions/file_actions';\n\nimport FileAttachment from 'components/file_attachment';\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\nimport FileProgressPreview from 'components/file_preview/file_progress_preview';\nimport Input from 'components/widgets/inputs/input/input';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {isValidUrl, parseLink, removeScheme} from 'utils/url';\nimport {generateId} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport './bookmark_create_modal.scss';\n\nimport CreateModalNameInput from './create_modal_name_input';\nimport {useCanUploadFiles} from './utils';\n\nconst MAX_LINK_LENGTH = 1024;\nconst MAX_TITLE_LENGTH = 64;\n\ntype Props = {\n channelId: string;\n bookmarkType?: ChannelBookmark['type'];\n file?: File;\n onExited: () => void;\n onHide: () => void;\n} & ({\n bookmark: ChannelBookmark;\n onConfirm: (data: ChannelBookmarkPatch) => Promise<ActionResult<boolean, any>> | ActionResult<boolean, any>;\n} | {\n bookmark?: never;\n onConfirm: (data: ChannelBookmarkCreate) => Promise<ActionResult<boolean, any>> | ActionResult<boolean, any>;\n});\n\nfunction ChannelBookmarkCreateModal({\n bookmark,\n bookmarkType,\n file: promptedFile,\n channelId,\n onExited,\n onConfirm,\n onHide,\n}: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n // common\n const type = bookmark?.type ?? bookmarkType ?? 'link';\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n const [emoji, setEmoji] = useState(bookmark?.emoji ?? '');\n const [displayName, setDisplayName] = useState<string | undefined>(bookmark?.display_name);\n const [parsedDisplayName, setParsedDisplayName] = useState<string | undefined>();\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState('');\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n if (isKeyPressed(event, Constants.KeyCodes.ESCAPE) && !showEmojiPicker) {\n onHide();\n }\n }, [showEmojiPicker, onHide]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n // type === 'link'\n const icon = bookmark?.image_url;\n const [link, setLinkInner] = useState(bookmark?.link_url ?? '');\n const prevLink = useRef(link);\n const [validatedLink, setValidatedLink] = useState<string>();\n const setLink = useCallback((value: string) => {\n setLinkInner((currentLink) => {\n prevLink.current = currentLink;\n return value;\n });\n if (!value) {\n setValidatedLink(undefined);\n }\n }, []);\n\n const [linkError, {loading: checkingLink, suppressed: linkErrorBypass}] = useBookmarkLinkValidation(link === prevLink.current ? '' : link, (validatedLink, forced) => {\n if (!forced) {\n setValidatedLink(validatedLink);\n }\n const parsed = removeScheme(validatedLink);\n setParsedDisplayName(parsed);\n setDisplayName(parsed);\n });\n\n const handleLinkChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const {value} = e.target;\n setLink(value);\n }, []);\n\n // type === 'file'\n const canUploadFiles = useCanUploadFiles();\n const [pendingFile, setPendingFile] = useState<FilePreviewInfo | null>();\n const [fileError, setFileError] = useState('');\n const [fileId, setFileId] = useState(bookmark?.file_id);\n const uploadRequestRef = useRef<XMLHttpRequest>();\n const fileInfo: FileInfo | undefined = useSelector((state: GlobalState) => (fileId && getFile(state, fileId)) || undefined);\n\n const maxFileSize = useSelector((state: GlobalState) => {\n const config = getConfig(state);\n return parseInt(config.MaxFileSize || '', 10);\n });\n const maxFileSizeMB = maxFileSize / 1048576;\n\n const handleEditFileClick = (e: MouseEvent<HTMLDivElement>) => {\n const innerClick = document.querySelector(`\n .channel-bookmarks-create-modal .post-image__download a,\n .channel-bookmarks-create-modal a.file-preview__remove\n `);\n if (\n innerClick === e.target ||\n innerClick?.contains(e.target as HTMLElement)\n ) {\n return;\n }\n\n fileInputRef.current?.click();\n };\n\n const handleFileChanged = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) {\n return;\n }\n\n doUploadFile(file);\n }, []);\n\n const handleFileRemove = () => {\n setPendingFile(null);\n setFileId(bookmark?.file_id);\n setParsedDisplayName(undefined);\n uploadRequestRef.current?.abort();\n };\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fileInput = (\n <input\n type='file'\n id='bookmark-create-file-input-in-modal'\n className='bookmark-create-file-input'\n ref={fileInputRef}\n onChange={handleFileChanged}\n />\n );\n\n const onProgress: UploadFile['onProgress'] = (preview) => {\n setPendingFile(preview);\n };\n const onSuccess: UploadFile['onSuccess'] = ({file_infos: fileInfos}) => {\n setPendingFile(null);\n const newFile: FileInfo = fileInfos?.[0];\n if (newFile) {\n setFileId(newFile.id);\n }\n setFileError('');\n };\n const onError: UploadFile['onError'] = () => {\n setPendingFile(null);\n setFileError(formatMessage({id: 'file_upload.generic_error_file', defaultMessage: 'There was a problem uploading your file.'}));\n };\n\n const displayNameValue = displayName || parsedDisplayName || (type === 'file' ? fileInfo?.name : bookmark?.link_url) || '';\n\n const doUploadFile = (file: File) => {\n setPendingFile(null);\n setFileId('');\n\n if (file.size > maxFileSize) {\n setFileError(formatMessage({\n id: 'file_upload.fileAbove',\n defaultMessage: 'File above {max}MB could not be uploaded: {filename}',\n }, {max: maxFileSizeMB, filename: file.name}));\n\n return;\n }\n\n if (file.size === 0) {\n setFileError(formatMessage({\n id: 'file_upload.zeroBytesFile',\n defaultMessage: 'You are uploading an empty file: {filename}',\n }, {filename: file.name}));\n\n return;\n }\n\n setFileError('');\n if (displayNameValue === fileInfo?.name) {\n setDisplayName(file.name);\n }\n setParsedDisplayName(file.name);\n\n const clientId = generateId();\n\n uploadRequestRef.current = dispatch(uploadFile({\n file,\n name: file.name,\n type: file.type,\n rootId: '',\n channelId,\n clientId,\n onProgress,\n onSuccess,\n onError,\n }, true)) as unknown as XMLHttpRequest;\n };\n\n useEffect(() => {\n if (promptedFile) {\n doUploadFile(promptedFile);\n }\n }, [promptedFile]);\n\n const handleOnExited = useCallback(() => {\n uploadRequestRef.current?.abort();\n onExited?.();\n }, [onExited]);\n\n // controls logic\n const hasChanges = (() => {\n if (displayNameValue !== bookmark?.display_name) {\n return true;\n }\n\n if ((emoji || bookmark?.emoji) && emoji !== bookmark?.emoji) {\n return true;\n }\n\n if (type === 'file') {\n if (fileId && fileId !== bookmark?.file_id) {\n return true;\n }\n }\n\n if (type === 'link') {\n return Boolean(link && link !== bookmark?.link_url);\n }\n\n return false;\n })();\n const isValid = (() => {\n if (type === 'link') {\n if (!link || linkError) {\n return false;\n }\n if (link && linkErrorBypass) {\n return true;\n }\n\n if (validatedLink || link === bookmark?.link_url) {\n return true;\n }\n }\n\n if (type === 'file') {\n if (!fileInfo || !displayNameValue || fileError) {\n return false;\n }\n\n return true;\n }\n\n return undefined;\n })();\n\n const cancel = useCallback(() => {\n if (type === 'file') {\n uploadRequestRef.current?.abort();\n }\n }, [type]);\n\n const confirm = useCallback(async () => {\n setSaving(true);\n if (type === 'link') {\n const url = validHttpUrl(link);\n\n if (!url) {\n setSaveError(formatMessage(msg.linkInvalid));\n return;\n }\n\n let validLink = url.toString();\n\n if (validLink.endsWith('/')) {\n validLink = validLink.slice(0, -1);\n }\n\n const {data: success} = await onConfirm({\n image_url: icon,\n link_url: validLink,\n emoji,\n display_name: displayNameValue,\n type: 'link',\n });\n\n setSaving(false);\n\n if (success) {\n setSaveError('');\n onHide();\n } else {\n setSaveError(formatMessage(msg.saveError));\n }\n } else if (fileInfo) {\n const {data: success} = await onConfirm({\n file_id: fileInfo.id,\n display_name: displayNameValue,\n type: 'file',\n emoji,\n });\n\n if (success) {\n setSaveError('');\n onHide();\n } else {\n setSaveError(formatMessage(msg.saveError));\n }\n }\n }, [type, link, onConfirm, onHide, fileInfo, displayNameValue, emoji, icon]);\n\n const confirmDisabled = saving || !isValid || !hasChanges;\n\n let linkStatusIndicator;\n if (checkingLink) {\n // loading\n linkStatusIndicator = <LoadingSpinner/>;\n } else if (validatedLink && !linkError) {\n // validated\n linkStatusIndicator = checkedIcon;\n }\n\n let linkMessage = formatMessage(msg.linkInfoMessage);\n if (linkErrorBypass) {\n const url = validHttpUrl(link);\n if (url) {\n linkMessage = formatMessage(msg.invalidLinkMessage, {link: url.toString()});\n }\n }\n\n return (\n <GenericModal\n enforceFocus={!showEmojiPicker}\n keyboardEscape={false}\n className='channel-bookmarks-create-modal'\n modalHeaderText={formatMessage(bookmark ? msg.editHeading : msg.heading)}\n confirmButtonText={formatMessage(bookmark ? msg.saveText : msg.addBookmarkText)}\n handleCancel={cancel}\n handleConfirm={confirm}\n handleEnterKeyPress={(!confirmDisabled && confirm) || undefined}\n onExited={handleOnExited}\n compassDesign={true}\n isConfirmDisabled={confirmDisabled}\n autoCloseOnConfirmButton={false}\n errorText={saveError}\n >\n <>\n {type === 'link' ? (\n <>\n <Input\n maxLength={MAX_LINK_LENGTH}\n type='text'\n name='bookmark-link'\n containerClassName='linkInput'\n placeholder={formatMessage(msg.linkPlaceholder)}\n onChange={handleLinkChange}\n hasError={Boolean(linkError)}\n value={link}\n data-testid='linkInput'\n autoFocus={true}\n addon={linkStatusIndicator}\n customMessage={linkError ? {type: 'error', value: linkError} : {value: linkMessage}}\n />\n </>\n ) : (\n <>\n <FieldLabel>\n <FormattedMessage\n id='channel_bookmarks.create.file_input.label'\n defaultMessage='Attachment'\n />\n </FieldLabel>\n <FileInputContainer\n tabIndex={0}\n role='button'\n disabled={!canUploadFiles}\n onClick={(canUploadFiles && handleEditFileClick) || undefined}\n >\n {!pendingFile && fileInfo && (\n <FileItemContainer>\n <FileAttachment\n key={fileInfo.id}\n fileInfo={fileInfo}\n index={0}\n />\n </FileItemContainer>\n )}\n {pendingFile && (\n <FileProgressPreview\n key={pendingFile.clientId}\n clientId={pendingFile.clientId}\n fileInfo={pendingFile}\n handleRemove={handleFileRemove}\n />\n )}\n {!fileInfo && !pendingFile && (\n <div className='file-preview__container empty'/>\n )}\n <VisualButton>\n <PencilOutlineIcon size={24}/>\n {formatMessage(msg.fileInputEdit)}\n </VisualButton>\n {fileInput}\n </FileInputContainer>\n {fileError && (\n <div className='Input___customMessage Input___error'>\n <i className='icon error icon-alert-circle-outline'/>\n <span>{fileError}</span>\n </div>\n )}\n </>\n\n )}\n\n <TitleWrapper>\n <FieldLabel>\n <FormattedMessage\n id='channel_bookmarks.create.title_input.label'\n defaultMessage='Title'\n />\n </FieldLabel>\n <CreateModalNameInput\n maxLength={MAX_TITLE_LENGTH}\n type={type}\n imageUrl={icon}\n fileInfo={pendingFile || fileInfo}\n emoji={emoji}\n setEmoji={setEmoji}\n displayName={displayName?.substring(0, MAX_TITLE_LENGTH)}\n placeholder={displayNameValue?.substring(0, MAX_TITLE_LENGTH)}\n setDisplayName={setDisplayName}\n onAddCustomEmojiClick={onHide}\n showEmojiPicker={showEmojiPicker}\n setShowEmojiPicker={setShowEmojiPicker}\n />\n </TitleWrapper>\n </>\n </GenericModal>\n );\n}\n\nexport default ChannelBookmarkCreateModal;\n\nconst TitleWrapper = styled.div`\n margin-top: 20px;\n`;\n\nconst CheckWrapper = styled.span`\n padding: 0px 12px;\n display: flex;\n align-items: center;\n`;\n\nconst checkedIcon = (\n <CheckWrapper>\n <CheckIcon\n size={20}\n color='var(--sys-online-indicator)'\n />\n </CheckWrapper>\n);\n\nconst FieldLabel = styled.span`\n display: inline-block;\n margin-bottom: 8px;\n font-family: Open Sans;\n font-size: 14px;\n line-height: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 20px;\n`;\n\nconst VisualButton = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 10px 24px;\n color: rgba(var(--center-channel-color-rgb), 0.56);\n font-size: 11px;\n font-weight: 600;\n font-family: Open Sans;\n`;\n\nconst FileInputContainer = styled.div`\n display: block;\n background: rgba(var(--center-channel-color-rgb), 0.04);\n padding: 12px;\n border-radius: 8px;\n display: flex;\n\n &:hover:not([disabled]) {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n color: rgba(var(--center-channel-color-rgb), 0.72);\n cursor: pointer;\n }\n\n &:disabled {\n cursor: default;\n ${VisualButton} {\n opacity: 0.4;\n }\n }\n\n input[type=\"file\"] {\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n .file-preview__container,\n .file-preview {\n width: auto;\n height: auto;\n flex: 1 1 auto;\n padding: 0;\n\n &.empty {\n border: 2px dashed rgba(var(--center-channel-color-rgb), 0.16);\n border-radius : 4px;\n }\n\n .post-image__column {\n width: 100%;\n margin: 0;\n }\n }\n`;\n\nconst continuableLinkErr = (url: URL, confirm: () => void) => {\n return (\n <FormattedMessage\n id='channel_bookmarks.create.error.invalid_url.continue_anyway'\n defaultMessage='Could not find: {url}. Please enter a valid link, or <Confirm>continue anyway</Confirm>.'\n values={{\n url: url.toString(),\n Confirm: (msg) => (\n <LinkErrContinue\n tabIndex={0}\n onClick={confirm}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n confirm();\n }\n }}\n >\n {msg}\n </LinkErrContinue>\n ),\n }}\n />\n );\n};\n\nconst LinkErrContinue = styled.a`\n color: unset !important;\n text-decoration: underline;\n`;\n\nconst FileItemContainer = styled.div`\n display: flex;\n flex: 1 1 auto;\n\n > div {\n width: 100%;\n margin: 0;\n }\n`;\n\nconst msg = defineMessages({\n heading: {id: 'channel_bookmarks.create.title', defaultMessage: 'Add a bookmark'},\n editHeading: {id: 'channel_bookmarks.create.edit.title', defaultMessage: 'Edit bookmark'},\n linkPlaceholder: {id: 'channel_bookmarks.create.link_placeholder', defaultMessage: 'Link'},\n linkInfoMessage: {id: 'channel_bookmarks.create.link_info', defaultMessage: 'Add a link to any post, file, or any external link'},\n invalidLinkMessage: {id: 'channel_bookmarks.create.error.invalid_url.continuing_anyway', defaultMessage: 'This may not be a valid link: {link}.'},\n addBookmarkText: {id: 'channel_bookmarks.create.confirm_add.button', defaultMessage: 'Add bookmark'},\n saveText: {id: 'channel_bookmarks.create.confirm_save.button', defaultMessage: 'Save bookmark'},\n fileInputEdit: {id: 'channel_bookmarks.create.file_input.edit', defaultMessage: 'Edit'},\n linkInvalid: {id: 'channel_bookmarks.create.error.invalid_url', defaultMessage: 'Please enter a valid link. Could not parse: {link}.'},\n saveError: {id: 'channel_bookmarks.create.error.generic_save', defaultMessage: 'There was an error trying to save the bookmark.'},\n});\n\nconst TYPING_DELAY_MS = 250;\nconst REQUEST_TIMEOUT = 10000;\nexport const useBookmarkLinkValidation = (link: string, onValidated: (validatedLink: string, forced?: boolean) => void) => {\n const {formatMessage} = useIntl();\n\n const [loading, setLoading] = useState<URL>();\n const [error, setError] = useState<ReactNode>();\n const [suppressed, setSuppressed] = useState(false);\n const abort = useRef<AbortController>();\n\n const start = useCallback((url: URL) => {\n setLoading(url);\n setError(undefined);\n setSuppressed(false);\n abort.current = new AbortController();\n return abort.current.signal;\n }, []);\n\n const cancel = useCallback(() => {\n abort.current?.abort('stale request');\n abort.current = undefined;\n setLoading(undefined);\n }, []);\n\n useEffect(() => {\n const handler = setTimeout(async () => {\n cancel();\n if (!link) {\n return;\n }\n\n const url = validHttpUrl(link);\n\n if (!url) {\n setError(formatMessage(msg.linkInvalid, {link}));\n setLoading(undefined);\n return;\n }\n\n const signal = start(url);\n\n try {\n await fetch(url, {\n mode: 'no-cors',\n signal: AbortSignal.any([signal, AbortSignal.timeout(REQUEST_TIMEOUT)]),\n });\n onValidated(link);\n } catch (err) {\n if (signal === abort.current?.signal) {\n setError(continuableLinkErr(url, () => {\n onValidated(link, true);\n setSuppressed(true);\n setError(undefined);\n }));\n }\n } finally {\n setLoading((currentUrl) => {\n if (currentUrl !== url) {\n // trailing effect of cancelled\n return currentUrl;\n }\n\n return undefined;\n });\n }\n }, TYPING_DELAY_MS);\n\n return () => clearTimeout(handler);\n }, [link, start, cancel]);\n\n return [error, {loading: Boolean(loading), suppressed}] as const;\n};\n\nexport const validHttpUrl = (input: string) => {\n const val = parseLink(input);\n\n if (!val || !isValidUrl(val)) {\n return null;\n }\n\n let url;\n try {\n url = new URL(val);\n } catch {\n return null;\n }\n\n return url;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useCallback} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport styled, {css} from 'styled-components';\n\nimport {\n LinkVariantIcon,\n PaperclipIcon,\n PlusIcon,\n} from '@mattermost/compass-icons/components';\nimport type {ChannelBookmarkCreate} from '@mattermost/types/channel_bookmarks';\n\nimport {createBookmark} from 'actions/channel_bookmarks';\nimport {openModal} from 'actions/views/modals';\n\nimport * as Menu from 'components/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport ChannelBookmarkCreateModal from './channel_bookmarks_create_modal';\nimport {MAX_BOOKMARKS_PER_CHANNEL, useChannelBookmarkPermission} from './utils';\n\ntype BookmarksMenuProps = {\n channelId: string;\n hasBookmarks: boolean;\n limitReached: boolean;\n canUploadFiles: boolean;};\nfunction BookmarksMenu({\n channelId,\n hasBookmarks,\n limitReached,\n canUploadFiles,\n}: BookmarksMenuProps) {\n const {formatMessage} = useIntl();\n const showLabel = !hasBookmarks;\n\n const {handleCreateLink, handleCreateFile} = useBookmarkAddActions(channelId);\n const canAdd = useChannelBookmarkPermission(channelId, 'add');\n\n const addBookmarkLabel = formatMessage({id: 'channel_bookmarks.addBookmark', defaultMessage: 'Add a bookmark'});\n\n const addBookmarkLimitReached = formatMessage({id: 'channel_bookmarks.addBookmarkLimitReached', defaultMessage: 'Cannot add more than {limit} bookmarks'}, {limit: MAX_BOOKMARKS_PER_CHANNEL});\n let addBookmarkTooltipText;\n\n if (limitReached) {\n addBookmarkTooltipText = addBookmarkLimitReached;\n } else if (hasBookmarks) {\n addBookmarkTooltipText = addBookmarkLabel;\n }\n\n const addLinkLabel = formatMessage({id: 'channel_bookmarks.addLink', defaultMessage: 'Add a link'});\n const attachFileLabel = formatMessage({id: 'channel_bookmarks.attachFile', defaultMessage: 'Attach a file'});\n\n if (!canAdd) {\n return null;\n }\n\n return (\n <MenuButtonContainer\n withLabel={showLabel}\n >\n <Menu.Container\n anchorOrigin={{vertical: 'bottom', horizontal: 'left'}}\n transformOrigin={{vertical: 'top', horizontal: 'left'}}\n menuButton={{\n id: 'channelBookmarksPlusMenuButton',\n class: classNames('channelBookmarksMenuButton', {withLabel: showLabel, disabled: limitReached}),\n children: (\n <>\n <PlusIcon size={showLabel ? 16 : 18}/>\n {showLabel && <span>{addBookmarkLabel}</span>}\n </>\n ),\n 'aria-label': addBookmarkLabel,\n disabled: limitReached,\n }}\n menu={{\n id: 'channelBookmarksPlusMenuDropdown',\n }}\n menuButtonTooltip={addBookmarkTooltipText ? {\n text: addBookmarkTooltipText,\n } : undefined}\n >\n <Menu.Item\n key='channelBookmarksAddLink'\n id='channelBookmarksAddLink'\n onClick={handleCreateLink}\n leadingElement={<LinkVariantIcon size={18}/>}\n labels={<span>{addLinkLabel}</span>}\n />\n {canUploadFiles && (\n <Menu.Item\n key='channelBookmarksAttachFile'\n id='channelBookmarksAttachFile'\n onClick={handleCreateFile}\n leadingElement={<PaperclipIcon size={18}/>}\n labels={<span>{attachFileLabel}</span>}\n />\n )}\n </Menu.Container>\n </MenuButtonContainer>\n );\n}\n\nexport default memo(BookmarksMenu);\n\nconst MenuButtonContainer = styled.div<{withLabel: boolean}>`\n position: sticky;\n right: 0;\n ${({withLabel}) => !withLabel && css`padding: 0 1rem;`}\n background: linear-gradient(to right, rgba(var(--center-channel-bg-rgb), .16), rgba(var(--center-channel-bg-rgb), 1) 25%);\n`;\n\nexport const useBookmarkAddActions = (channelId: string) => {\n const dispatch = useDispatch();\n\n const handleCreate = useCallback((file?: File) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.CHANNEL_BOOKMARK_CREATE,\n dialogType: ChannelBookmarkCreateModal,\n dialogProps: {\n channelId,\n bookmarkType: file ? 'file' : 'link',\n file,\n onConfirm: async (data: ChannelBookmarkCreate) => dispatch(createBookmark(channelId, data)),\n },\n }));\n }, [channelId, dispatch]);\n\n const handleCreateLink = useCallback(() => {\n handleCreate();\n }, [handleCreate]);\n\n const handleCreateFile = useCallback(() => {\n const input: HTMLInputElement = document.createElement('input');\n input.type = 'file';\n input.id = 'bookmark-create-file-input';\n input.hidden = true;\n\n input.addEventListener('change', () => {\n const file = input.files?.[0];\n if (file) {\n handleCreate(file);\n }\n input.remove();\n });\n input.addEventListener('cancel', input.remove);\n\n document.getElementById('root-portal')?.appendChild(input);\n\n input.click();\n }, [handleCreate]);\n\n return {handleCreateLink, handleCreateFile};\n};\n"],"names":["BookmarkIcon","_ref","type","emoji","imageUrl","fileInfo","size","icon","React","BookOutlineIcon","FileGenericOutlineIcon","emojiName","trimmedEmojiName","hasImageProxy","useSelector","state","getConfig","HasImageProxy","RenderEmoji","BookmarkIconImg","src","getImageSrc","FileThumbnail","disablePreview","Icon","$size","propTypes","_pt","styled","withConfig","displayName","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","CreateModalNameInput","maxLength","setEmoji","placeholder","setDisplayName","showEmojiPicker","setShowEmojiPicker","onAddCustomEmojiClick","formatMessage","useIntl","targetRef","useRef","refocusEmojiButton","current","document","dispatchEvent","CustomEvent","A11yCustomEventTypes","FOCUS","detail","target","keyboardOnly","handleEmojiClear","handleInputChange","useCallback","e","currentTarget","value","NameWrapper","EmojiPickerOverlay","getTargetRef","show","onHide","handleEmojiClose","onEmojiClick","selectedEmoji","short_name","name","concat","placement","ref","onClick","toggleEmojiPicker","prev","onKeyDown","isKeyPressed","Constants","KeyCodes","ENTER","stopPropagation","id","defaultMessage","className","ChevronDownIcon","Input","onChange","useLegend","Clear","visible","Boolean","tabIndex","SPACE","FormattedMessage","isRequired","ChannelBookmarkCreateModal","_bookmark$type","_bookmark$emoji","_bookmark$link_url","bookmark","bookmarkType","file","promptedFile","channelId","onExited","onConfirm","dispatch","useDispatch","useState","display_name","parsedDisplayName","setParsedDisplayName","saving","setSaving","saveError","setSaveError","handleKeyDown","event","ESCAPE","useEffect","addEventListener","removeEventListener","image_url","link","setLinkInner","link_url","prevLink","validatedLink","setValidatedLink","setLink","currentLink","undefined","linkError","loading","checkingLink","suppressed","linkErrorBypass","useBookmarkLinkValidation","forced","parsed","removeScheme","handleLinkChange","canUploadFiles","useCanUploadFiles","pendingFile","setPendingFile","fileError","setFileError","fileId","setFileId","file_id","uploadRequestRef","getFile","maxFileSize","config","parseInt","MaxFileSize","maxFileSizeMB","handleFileChanged","_e$target$files","files","doUploadFile","fileInputRef","fileInput","onProgress","preview","onSuccess","file_infos","fileInfos","newFile","onError","displayNameValue","max","filename","clientId","generateId","uploadFile","rootId","handleOnExited","_uploadRequestRef$cur2","abort","hasChanges","isValid","cancel","_uploadRequestRef$cur3","confirm","async","url","validHttpUrl","msg","linkInvalid","validLink","toString","endsWith","slice","data","success","confirmDisabled","linkStatusIndicator","LoadingSpinner","checkedIcon","linkMessage","linkInfoMessage","invalidLinkMessage","GenericModal","enforceFocus","keyboardEscape","modalHeaderText","editHeading","heading","confirmButtonText","saveText","addBookmarkText","handleCancel","handleConfirm","handleEnterKeyPress","compassDesign","isConfirmDisabled","autoCloseOnConfirmButton","errorText","containerClassName","linkPlaceholder","hasError","autoFocus","addon","customMessage","FieldLabel","FileInputContainer","role","disabled","_fileInputRef$current","innerClick","querySelector","contains","click","FileItemContainer","FileAttachment","key","index","FileProgressPreview","handleRemove","handleFileRemove","_uploadRequestRef$cur","VisualButton","PencilOutlineIcon","fileInputEdit","TitleWrapper","substring","CheckWrapper","CheckIcon","color","LinkErrContinue","defineMessages","onValidated","setLoading","error","setError","setSuppressed","start","AbortController","signal","_abort$current","handler","setTimeout","fetch","mode","AbortSignal","any","timeout","err","_abort$current2","continuableLinkErr","values","Confirm","currentUrl","clearTimeout","input","val","parseLink","isValidUrl","URL","_unused","BookmarksMenu","hasBookmarks","limitReached","showLabel","handleCreateLink","handleCreateFile","useBookmarkAddActions","canAdd","useChannelBookmarkPermission","addBookmarkLabel","addBookmarkLimitReached","limit","MAX_BOOKMARKS_PER_CHANNEL","addBookmarkTooltipText","addLinkLabel","attachFileLabel","MenuButtonContainer","withLabel","Menu","anchorOrigin","vertical","horizontal","transformOrigin","menuButton","class","classNames","children","PlusIcon","menu","menuButtonTooltip","text","leadingElement","LinkVariantIcon","labels","PaperclipIcon","memo","css","handleCreate","openModal","modalId","ModalIdentifiers","CHANNEL_BOOKMARK_CREATE","dialogType","dialogProps","createBookmark","_document$getElementB","createElement","hidden","_input$files","remove","getElementById","appendChild"],"sourceRoot":""}