Fix upload button & shortcut not working for narrow composer mode (#7894)
This commit is contained in:
parent
4629d1e4f6
commit
5167b30ee6
1 changed files with 32 additions and 20 deletions
|
@ -70,7 +70,7 @@ const MessageComposerButtons: React.FC<IProps> = (props: IProps) => {
|
||||||
emojiButton(props),
|
emojiButton(props),
|
||||||
];
|
];
|
||||||
moreButtons = [
|
moreButtons = [
|
||||||
uploadButton(props, roomId),
|
uploadButton(), // props passed via UploadButtonContext
|
||||||
showStickersButton(props),
|
showStickersButton(props),
|
||||||
voiceRecordingButton(props, narrow),
|
voiceRecordingButton(props, narrow),
|
||||||
pollButton(room, props.relation),
|
pollButton(room, props.relation),
|
||||||
|
@ -79,7 +79,7 @@ const MessageComposerButtons: React.FC<IProps> = (props: IProps) => {
|
||||||
} else {
|
} else {
|
||||||
mainButtons = [
|
mainButtons = [
|
||||||
emojiButton(props),
|
emojiButton(props),
|
||||||
uploadButton(props, roomId),
|
uploadButton(), // props passed via UploadButtonContext
|
||||||
];
|
];
|
||||||
moreButtons = [
|
moreButtons = [
|
||||||
showStickersButton(props),
|
showStickersButton(props),
|
||||||
|
@ -98,7 +98,7 @@ const MessageComposerButtons: React.FC<IProps> = (props: IProps) => {
|
||||||
mx_MessageComposer_closeButtonMenu: props.isMenuOpen,
|
mx_MessageComposer_closeButtonMenu: props.isMenuOpen,
|
||||||
});
|
});
|
||||||
|
|
||||||
return <>
|
return <UploadButtonContextProvider roomId={roomId} relation={props.relation}>
|
||||||
{ mainButtons }
|
{ mainButtons }
|
||||||
<AccessibleTooltipButton
|
<AccessibleTooltipButton
|
||||||
className={moreOptionsClasses}
|
className={moreOptionsClasses}
|
||||||
|
@ -116,7 +116,7 @@ const MessageComposerButtons: React.FC<IProps> = (props: IProps) => {
|
||||||
</OverflowMenuContext.Provider>
|
</OverflowMenuContext.Provider>
|
||||||
</ContextMenu>
|
</ContextMenu>
|
||||||
) }
|
) }
|
||||||
</>;
|
</UploadButtonContextProvider>;
|
||||||
};
|
};
|
||||||
|
|
||||||
function emojiButton(props: IProps): ReactElement {
|
function emojiButton(props: IProps): ReactElement {
|
||||||
|
@ -175,23 +175,22 @@ const EmojiButton: React.FC<IEmojiButtonProps> = ({ addEmoji, menuPosition }) =>
|
||||||
</React.Fragment>;
|
</React.Fragment>;
|
||||||
};
|
};
|
||||||
|
|
||||||
function uploadButton(props: IProps, roomId: string): ReactElement {
|
function uploadButton(): ReactElement {
|
||||||
return <UploadButton
|
return <UploadButton key="controls_upload" />;
|
||||||
key="controls_upload"
|
|
||||||
roomId={roomId}
|
|
||||||
relation={props.relation}
|
|
||||||
/>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UploadButtonFn = () => void;
|
||||||
|
export const UploadButtonContext = createContext<UploadButtonFn | null>(null);
|
||||||
|
|
||||||
interface IUploadButtonProps {
|
interface IUploadButtonProps {
|
||||||
roomId: string;
|
roomId: string;
|
||||||
relation?: IEventRelation | null;
|
relation?: IEventRelation | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const UploadButton = ({ roomId, relation }: IUploadButtonProps) => {
|
// We put the file input outside the UploadButton component so that it doesn't get killed when the context menu closes.
|
||||||
|
const UploadButtonContextProvider: React.FC<IUploadButtonProps> = ({ roomId, relation, children }) => {
|
||||||
const cli = useContext(MatrixClientContext);
|
const cli = useContext(MatrixClientContext);
|
||||||
const roomContext = useContext(RoomContext);
|
const roomContext = useContext(RoomContext);
|
||||||
const overflowMenuCloser = useContext(OverflowMenuContext);
|
|
||||||
const uploadInput = useRef<HTMLInputElement>();
|
const uploadInput = useRef<HTMLInputElement>();
|
||||||
|
|
||||||
const onUploadClick = () => {
|
const onUploadClick = () => {
|
||||||
|
@ -200,7 +199,6 @@ const UploadButton = ({ roomId, relation }: IUploadButtonProps) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uploadInput.current?.click();
|
uploadInput.current?.click();
|
||||||
overflowMenuCloser?.(); // close overflow menu
|
|
||||||
};
|
};
|
||||||
|
|
||||||
useDispatcher(dis, payload => {
|
useDispatcher(dis, payload => {
|
||||||
|
@ -229,12 +227,9 @@ const UploadButton = ({ roomId, relation }: IUploadButtonProps) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const uploadInputStyle = { display: 'none' };
|
const uploadInputStyle = { display: 'none' };
|
||||||
return <>
|
return <UploadButtonContext.Provider value={onUploadClick}>
|
||||||
<CollapsibleButton
|
{ children }
|
||||||
className="mx_MessageComposer_button mx_MessageComposer_upload"
|
|
||||||
onClick={onUploadClick}
|
|
||||||
title={_t('Attachment')}
|
|
||||||
/>
|
|
||||||
<input
|
<input
|
||||||
ref={uploadInput}
|
ref={uploadInput}
|
||||||
type="file"
|
type="file"
|
||||||
|
@ -242,7 +237,24 @@ const UploadButton = ({ roomId, relation }: IUploadButtonProps) => {
|
||||||
multiple
|
multiple
|
||||||
onChange={onUploadFileInputChange}
|
onChange={onUploadFileInputChange}
|
||||||
/>
|
/>
|
||||||
</>;
|
</UploadButtonContext.Provider>;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Must be rendered within an UploadButtonContextProvider
|
||||||
|
const UploadButton = () => {
|
||||||
|
const overflowMenuCloser = useContext(OverflowMenuContext);
|
||||||
|
const uploadButtonFn = useContext(UploadButtonContext);
|
||||||
|
|
||||||
|
const onClick = () => {
|
||||||
|
uploadButtonFn?.();
|
||||||
|
overflowMenuCloser?.(); // close overflow menu
|
||||||
|
};
|
||||||
|
|
||||||
|
return <CollapsibleButton
|
||||||
|
className="mx_MessageComposer_button mx_MessageComposer_upload"
|
||||||
|
onClick={onClick}
|
||||||
|
title={_t('Attachment')}
|
||||||
|
/>;
|
||||||
};
|
};
|
||||||
|
|
||||||
function showStickersButton(props: IProps): ReactElement {
|
function showStickersButton(props: IProps): ReactElement {
|
||||||
|
|
Loading…
Reference in a new issue