{"version":3,"file":"bundles/250336982163787015e0/3323.js","mappings":"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","sources":["webpack://element-web/./src/components/views/rooms/CollapsibleButton.tsx","webpack://element-web/./src/components/views/rooms/EmojiButton.tsx","webpack://element-web/./src/components/views/rooms/MessageComposerButtons.tsx","webpack://element-web/./src/stores/OwnProfileStore.ts"],"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\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { useContext } from \"react\";\nimport classNames from \"classnames\";\n\nimport AccessibleButton, { ButtonProps } from \"../elements/AccessibleButton\";\nimport { OverflowMenuContext } from \"./MessageComposerButtons\";\nimport { IconizedContextMenuOption } from \"../context_menus/IconizedContextMenu\";\nimport { Ref } from \"../../../accessibility/roving/types\";\n\ninterface Props extends Omit, \"element\"> {\n inputRef?: Ref;\n title: string;\n iconClassName: string;\n}\n\nexport const CollapsibleButton: React.FC = ({\n title,\n children,\n className,\n iconClassName,\n inputRef,\n ...props\n}) => {\n const inOverflowMenu = !!useContext(OverflowMenuContext);\n if (inOverflowMenu) {\n return ;\n }\n\n return (\n \n {children}\n \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\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport classNames from \"classnames\";\nimport React, { useContext } from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport ContextMenu, { aboveLeftOf, MenuProps, useContextMenu } from \"../../structures/ContextMenu\";\nimport EmojiPicker from \"../emojipicker/EmojiPicker\";\nimport { CollapsibleButton } from \"./CollapsibleButton\";\nimport { OverflowMenuContext } from \"./MessageComposerButtons\";\n\ninterface IEmojiButtonProps {\n addEmoji: (unicode: string) => boolean;\n menuPosition?: MenuProps;\n className?: string;\n}\n\nexport function EmojiButton({ addEmoji, menuPosition, className }: IEmojiButtonProps): JSX.Element {\n const overflowMenuCloser = useContext(OverflowMenuContext);\n const [menuDisplayed, button, openMenu, closeMenu] = useContextMenu();\n\n let contextMenu: React.ReactElement | null = null;\n if (menuDisplayed && button.current) {\n const position = menuPosition ?? aboveLeftOf(button.current.getBoundingClientRect());\n const onFinished = (): void => {\n closeMenu();\n overflowMenuCloser?.();\n };\n\n contextMenu = (\n \n \n \n );\n }\n\n const computedClassName = classNames(\"mx_EmojiButton\", className, {\n mx_EmojiButton_highlight: menuDisplayed,\n });\n\n // TODO: replace ContextMenuTooltipButton with a unified representation of\n // the header buttons and the right panel buttons\n return (\n <>\n \n\n {contextMenu}\n \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\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport classNames from \"classnames\";\nimport { IEventRelation, Room, MatrixClient, THREAD_RELATION_TYPE, M_POLL_START } from \"matrix-js-sdk/src/matrix\";\nimport React, { createContext, ReactElement, ReactNode, useContext, useRef } from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport { CollapsibleButton } from \"./CollapsibleButton\";\nimport { MenuProps } from \"../../structures/ContextMenu\";\nimport dis from \"../../../dispatcher/dispatcher\";\nimport ErrorDialog from \"../dialogs/ErrorDialog\";\nimport { LocationButton } from \"../location\";\nimport Modal from \"../../../Modal\";\nimport PollCreateDialog from \"../elements/PollCreateDialog\";\nimport { MatrixClientPeg } from \"../../../MatrixClientPeg\";\nimport ContentMessages from \"../../../ContentMessages\";\nimport MatrixClientContext from \"../../../contexts/MatrixClientContext\";\nimport { useDispatcher } from \"../../../hooks/useDispatcher\";\nimport { chromeFileInputFix } from \"../../../utils/BrowserWorkarounds\";\nimport IconizedContextMenu, { IconizedContextMenuOptionList } from \"../context_menus/IconizedContextMenu\";\nimport { EmojiButton } from \"./EmojiButton\";\nimport { filterBoolean } from \"../../../utils/arrays\";\nimport { useSettingValue } from \"../../../hooks/useSettings\";\nimport AccessibleButton, { ButtonEvent } from \"../elements/AccessibleButton\";\nimport { useScopedRoomContext } from \"../../../contexts/ScopedRoomContext.tsx\";\n\ninterface IProps {\n addEmoji: (emoji: string) => boolean;\n haveRecording: boolean;\n isMenuOpen: boolean;\n isStickerPickerOpen: boolean;\n menuPosition?: MenuProps;\n onRecordStartEndClick: () => void;\n relation?: IEventRelation;\n setStickerPickerOpen: (isStickerPickerOpen: boolean) => void;\n showLocationButton: boolean;\n showPollsButton: boolean;\n showStickersButton: boolean;\n toggleButtonMenu: () => void;\n isRichTextEnabled: boolean;\n onComposerModeClick: () => void;\n}\n\ntype OverflowMenuCloser = () => void;\nexport const OverflowMenuContext = createContext(null);\n\nconst MessageComposerButtons: React.FC = (props: IProps) => {\n const matrixClient = useContext(MatrixClientContext);\n const { room, narrow } = useScopedRoomContext(\"room\", \"narrow\");\n\n const isWysiwygLabEnabled = useSettingValue(\"feature_wysiwyg_composer\");\n\n if (!matrixClient || !room || props.haveRecording) {\n return null;\n }\n\n let mainButtons: ReactNode[];\n let moreButtons: ReactNode[];\n if (narrow) {\n mainButtons = [\n isWysiwygLabEnabled ? (\n \n ) : (\n emojiButton(props)\n ),\n ];\n moreButtons = [\n uploadButton(), // props passed via UploadButtonContext\n showStickersButton(props),\n voiceRecordingButton(props, narrow),\n props.showPollsButton ? pollButton(room, props.relation) : null,\n showLocationButton(props, room, matrixClient),\n ];\n } else {\n mainButtons = [\n isWysiwygLabEnabled ? (\n \n ) : (\n emojiButton(props)\n ),\n uploadButton(), // props passed via UploadButtonContext\n ];\n moreButtons = [\n showStickersButton(props),\n voiceRecordingButton(props, narrow),\n props.showPollsButton ? pollButton(room, props.relation) : null,\n showLocationButton(props, room, matrixClient),\n ];\n }\n\n mainButtons = filterBoolean(mainButtons);\n moreButtons = filterBoolean(moreButtons);\n\n const moreOptionsClasses = classNames({\n mx_MessageComposer_button: true,\n mx_MessageComposer_buttonMenu: true,\n mx_MessageComposer_closeButtonMenu: props.isMenuOpen,\n });\n\n return (\n \n {mainButtons}\n {moreButtons.length > 0 && (\n \n )}\n {props.isMenuOpen && (\n \n \n {moreButtons}\n \n \n )}\n \n );\n};\n\nfunction emojiButton(props: IProps): ReactElement {\n return (\n \n );\n}\n\nfunction uploadButton(): ReactElement {\n return ;\n}\n\ntype UploadButtonFn = () => void;\nexport const UploadButtonContext = createContext(null);\n\ninterface IUploadButtonProps {\n roomId: string;\n relation?: IEventRelation;\n children: ReactNode;\n}\n\n// We put the file input outside the UploadButton component so that it doesn't get killed when the context menu closes.\nconst UploadButtonContextProvider: React.FC = ({ roomId, relation, children }) => {\n const cli = useContext(MatrixClientContext);\n const roomContext = useScopedRoomContext(\"timelineRenderingType\");\n const uploadInput = useRef(null);\n\n const onUploadClick = (): void => {\n if (cli?.isGuest()) {\n dis.dispatch({ action: \"require_registration\" });\n return;\n }\n uploadInput.current?.click();\n };\n\n useDispatcher(dis, (payload) => {\n if (roomContext.timelineRenderingType === payload.context && payload.action === \"upload_file\") {\n onUploadClick();\n }\n });\n\n const onUploadFileInputChange = (ev: React.ChangeEvent): void => {\n if (ev.target.files?.length === 0) return;\n\n // Take a copy, so we can safely reset the value of the form control\n ContentMessages.sharedInstance().sendContentListToRoom(\n Array.from(ev.target.files!),\n roomId,\n relation,\n cli,\n roomContext.timelineRenderingType,\n );\n\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 const uploadInputStyle = { display: \"none\" };\n return (\n \n {children}\n\n \n \n );\n};\n\n// Must be rendered within an UploadButtonContextProvider\nconst UploadButton: React.FC = () => {\n const overflowMenuCloser = useContext(OverflowMenuContext);\n const uploadButtonFn = useContext(UploadButtonContext);\n\n const onClick = (): void => {\n uploadButtonFn?.();\n overflowMenuCloser?.(); // close overflow menu\n };\n\n return (\n \n );\n};\n\nfunction showStickersButton(props: IProps): ReactElement | null {\n return props.showStickersButton ? (\n props.setStickerPickerOpen(!props.isStickerPickerOpen)}\n title={props.isStickerPickerOpen ? _t(\"composer|close_sticker_picker\") : _t(\"common|sticker\")}\n />\n ) : null;\n}\n\nfunction voiceRecordingButton(props: IProps, narrow: boolean): ReactElement | null {\n // XXX: recording UI does not work well in narrow mode, so hide for now\n return narrow ? null : (\n \n );\n}\n\nfunction pollButton(room: Room, relation?: IEventRelation): ReactElement {\n return ;\n}\n\ninterface IPollButtonProps {\n room: Room;\n relation?: IEventRelation;\n}\n\nclass PollButton extends React.PureComponent {\n public static contextType = OverflowMenuContext;\n declare public context: React.ContextType;\n\n private onCreateClick = (): void => {\n this.context?.(); // close overflow menu\n const canSend = this.props.room.currentState.maySendEvent(\n M_POLL_START.name,\n MatrixClientPeg.safeGet().getSafeUserId(),\n );\n if (!canSend) {\n Modal.createDialog(ErrorDialog, {\n title: _t(\"composer|poll_button_no_perms_title\"),\n description: _t(\"composer|poll_button_no_perms_description\"),\n });\n } else {\n const threadId =\n this.props.relation?.rel_type === THREAD_RELATION_TYPE.name ? this.props.relation.event_id : undefined;\n\n Modal.createDialog(\n PollCreateDialog,\n {\n room: this.props.room,\n threadId,\n },\n \"mx_CompoundDialog\",\n false, // isPriorityModal\n true, // isStaticModal\n );\n }\n };\n\n public render(): React.ReactNode {\n // do not allow sending polls within threads at this time\n if (this.props.relation?.rel_type === THREAD_RELATION_TYPE.name) return null;\n\n return (\n \n );\n }\n}\n\nfunction showLocationButton(props: IProps, room: Room, matrixClient: MatrixClient): ReactElement | null {\n const sender = room.getMember(matrixClient.getSafeUserId());\n\n return props.showLocationButton && sender ? (\n \n ) : null;\n}\n\ninterface WysiwygToggleButtonProps {\n isRichTextEnabled: boolean;\n onClick: (ev: ButtonEvent) => void;\n}\n\nfunction ComposerModeButton({ isRichTextEnabled, onClick }: WysiwygToggleButtonProps): JSX.Element {\n const title = isRichTextEnabled ? _t(\"composer|mode_plain\") : _t(\"composer|mode_rich_text\");\n\n return (\n \n );\n}\n\nexport default MessageComposerButtons;\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { MatrixEvent, RoomStateEvent, MatrixError, User, UserEvent, EventType } from \"matrix-js-sdk/src/matrix\";\nimport { throttle } from \"lodash\";\n\nimport { ActionPayload } from \"../dispatcher/payloads\";\nimport { AsyncStoreWithClient } from \"./AsyncStoreWithClient\";\nimport defaultDispatcher from \"../dispatcher/dispatcher\";\nimport { MatrixClientPeg } from \"../MatrixClientPeg\";\nimport { _t } from \"../languageHandler\";\nimport { mediaFromMxc } from \"../customisations/Media\";\n\ninterface IState {\n displayName?: string;\n avatarUrl?: string;\n fetchedAt?: number;\n}\n\nconst KEY_DISPLAY_NAME = \"mx_profile_displayname\";\nconst KEY_AVATAR_URL = \"mx_profile_avatar_url\";\n\nexport class OwnProfileStore extends AsyncStoreWithClient {\n private static readonly internalInstance = (() => {\n const instance = new OwnProfileStore();\n instance.start();\n return instance;\n })();\n\n private monitoredUser: User | null = null;\n\n public constructor() {\n // seed from localstorage because otherwise we won't get these values until a whole network\n // round-trip after the client is ready, and we often load widgets in that time, and we'd\n // and up passing them an incorrect display name\n super(defaultDispatcher, {\n displayName: window.localStorage.getItem(KEY_DISPLAY_NAME) || undefined,\n avatarUrl: window.localStorage.getItem(KEY_AVATAR_URL) || undefined,\n });\n }\n\n public static get instance(): OwnProfileStore {\n return OwnProfileStore.internalInstance;\n }\n\n /**\n * Gets the display name for the user, or null if not present.\n */\n public get displayName(): string | null {\n if (!this.matrixClient) return this.state.displayName || null;\n\n if (this.matrixClient.isGuest()) {\n return _t(\"common|guest\");\n } else if (this.state.displayName) {\n return this.state.displayName;\n } else {\n return this.matrixClient.getUserId();\n }\n }\n\n public get isProfileInfoFetched(): boolean {\n return !!this.state.fetchedAt;\n }\n\n /**\n * Gets the MXC URI of the user's avatar, or null if not present.\n */\n public get avatarMxc(): string | null {\n return this.state.avatarUrl || null;\n }\n\n /**\n * Gets the user's avatar as an HTTP URL of the given size. If the user's\n * avatar is not present, this returns null.\n * @param size The size of the avatar. If zero, a full res copy of the avatar\n * will be returned as an HTTP URL.\n * @returns The HTTP URL of the user's avatar\n */\n public getHttpAvatarUrl(size = 0): string | null {\n if (!this.avatarMxc) return null;\n const media = mediaFromMxc(this.avatarMxc);\n if (!size || size <= 0) {\n return media.srcHttp;\n } else {\n return media.getSquareThumbnailHttp(size);\n }\n }\n\n protected async onNotReady(): Promise {\n this.onProfileUpdate.cancel();\n if (this.monitoredUser) {\n this.monitoredUser.removeListener(UserEvent.DisplayName, this.onProfileUpdate);\n this.monitoredUser.removeListener(UserEvent.AvatarUrl, this.onProfileUpdate);\n }\n this.matrixClient?.removeListener(RoomStateEvent.Events, this.onStateEvents);\n await this.reset({});\n }\n\n protected async onReady(): Promise {\n if (!this.matrixClient) return;\n const myUserId = this.matrixClient.getSafeUserId();\n this.monitoredUser = this.matrixClient.getUser(myUserId);\n if (this.monitoredUser) {\n this.monitoredUser.on(UserEvent.DisplayName, this.onProfileUpdate);\n this.monitoredUser.on(UserEvent.AvatarUrl, this.onProfileUpdate);\n }\n\n // We also have to listen for membership events for ourselves as the above User events\n // are fired only with presence, which matrix.org (and many others) has disabled.\n this.matrixClient.on(RoomStateEvent.Events, this.onStateEvents);\n\n await this.onProfileUpdate(); // trigger an initial update\n }\n\n protected async onAction(payload: ActionPayload): Promise {\n // we don't actually do anything here\n }\n\n private onProfileUpdate = throttle(\n async (): Promise => {\n if (!this.matrixClient) return;\n // We specifically do not use the User object we stored for profile info as it\n // could easily be wrong (such as per-room instead of global profile).\n\n let profileInfo: { displayname?: string; avatar_url?: string } = {\n displayname: undefined,\n avatar_url: undefined,\n };\n\n try {\n profileInfo = await this.matrixClient.getProfileInfo(this.matrixClient.getSafeUserId());\n } catch (error: unknown) {\n if (!(error instanceof MatrixError) || error.errcode !== \"M_NOT_FOUND\") {\n /**\n * Raise any other error than M_NOT_FOUND.\n * M_NOT_FOUND could occur if there is no user profile.\n * {@link https://spec.matrix.org/v1.7/client-server-api/#get_matrixclientv3profileuserid}\n * We should then assume an empty profile, emit UPDATE_EVENT etc..\n */\n throw error;\n }\n }\n\n if (profileInfo.displayname) {\n window.localStorage.setItem(KEY_DISPLAY_NAME, profileInfo.displayname);\n } else {\n window.localStorage.removeItem(KEY_DISPLAY_NAME);\n }\n\n if (profileInfo.avatar_url) {\n window.localStorage.setItem(KEY_AVATAR_URL, profileInfo.avatar_url);\n } else {\n window.localStorage.removeItem(KEY_AVATAR_URL);\n }\n\n await this.updateState({\n displayName: profileInfo.displayname,\n avatarUrl: profileInfo.avatar_url,\n fetchedAt: Date.now(),\n });\n },\n 200,\n { trailing: true, leading: true },\n );\n\n private onStateEvents = async (ev: MatrixEvent): Promise => {\n const myUserId = MatrixClientPeg.safeGet().getUserId();\n if (ev.getType() === EventType.RoomMember && ev.getSender() === myUserId && ev.getStateKey() === myUserId) {\n await this.onProfileUpdate();\n }\n };\n}\n"],"names":["CollapsibleButton","_ref","title","children","className","iconClassName","inputRef","props","_objectWithoutProperties","_excluded","useContext","OverflowMenuContext","React","IconizedContextMenuOption","_extends","label","AccessibleButton","classNames","ref","EmojiButton","addEmoji","menuPosition","overflowMenuCloser","menuDisplayed","button","openMenu","closeMenu","useContextMenu","contextMenu","current","position","aboveLeftOf","getBoundingClientRect","onFinished","ContextMenu","managed","EmojiPicker","onChoose","computedClassName","mx_EmojiButton_highlight","onClick","_t","createContext","emojiButton","key","uploadButton","UploadButton","UploadButtonContext","UploadButtonContextProvider","roomId","relation","cli","MatrixClientContext","roomContext","useScopedRoomContext","uploadInput","useRef","onUploadClick","_uploadInput$current","isGuest","dis","dispatch","action","click","useDispatcher","payload","timelineRenderingType","context","Provider","value","type","style","display","multiple","chromeFileInputFix","onChange","ev","_ev$target$files","target","files","length","ContentMessages","sharedInstance","sendContentListToRoom","Array","from","uploadButtonFn","showStickersButton","id","setStickerPickerOpen","isStickerPickerOpen","voiceRecordingButton","narrow","onRecordStartEndClick","pollButton","room","PollButton","constructor","args","_defineProperty","_this$context","this","call","currentState","maySendEvent","M_POLL_START","name","MatrixClientPeg","safeGet","getSafeUserId","_this$props$relation","threadId","rel_type","THREAD_RELATION_TYPE","event_id","undefined","Modal","createDialog","PollCreateDialog","ErrorDialog","description","render","_this$props$relation2","onCreateClick","showLocationButton","matrixClient","sender","getMember","LocationButton","ComposerModeButton","isRichTextEnabled","mx_MessageComposer_plain_text","mx_MessageComposer_rich_text","isWysiwygLabEnabled","useSettingValue","haveRecording","mainButtons","moreButtons","onComposerModeClick","showPollsButton","filterBoolean","moreOptionsClasses","mx_MessageComposer_button","mx_MessageComposer_buttonMenu","mx_MessageComposer_closeButtonMenu","isMenuOpen","toggleButtonMenu","IconizedContextMenu","wrapperClassName","compact","IconizedContextMenuOptionList","KEY_DISPLAY_NAME","KEY_AVATAR_URL","OwnProfileStore","AsyncStoreWithClient","super","defaultDispatcher","displayName","window","localStorage","getItem","avatarUrl","throttle","async","profileInfo","displayname","avatar_url","getProfileInfo","error","MatrixError","errcode","setItem","removeItem","updateState","fetchedAt","Date","now","trailing","leading","myUserId","getUserId","getType","EventType","RoomMember","getSender","getStateKey","onProfileUpdate","instance","internalInstance","state","isProfileInfoFetched","avatarMxc","getHttpAvatarUrl","size","media","mediaFromMxc","srcHttp","getSquareThumbnailHttp","onNotReady","_this$matrixClient","cancel","monitoredUser","removeListener","UserEvent","DisplayName","AvatarUrl","RoomStateEvent","Events","onStateEvents","reset","onReady","getUser","on","onAction","_OwnProfileStore","start"],"sourceRoot":""}