Use forwardRef in Avatar components to allow use with Compound Tooltips (#12063)
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
parent
3acd648ed3
commit
22c511414b
3 changed files with 22 additions and 24 deletions
|
@ -17,7 +17,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useCallback, useContext, useEffect, useState } from "react";
|
import React, { forwardRef, useCallback, useContext, useEffect, useState } from "react";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { ClientEvent } from "matrix-js-sdk/src/matrix";
|
import { ClientEvent } from "matrix-js-sdk/src/matrix";
|
||||||
import { Avatar } from "@vector-im/compound-web";
|
import { Avatar } from "@vector-im/compound-web";
|
||||||
|
@ -38,7 +38,6 @@ interface IProps {
|
||||||
type?: React.ComponentProps<typeof Avatar>["type"];
|
type?: React.ComponentProps<typeof Avatar>["type"];
|
||||||
size: string;
|
size: string;
|
||||||
onClick?: (ev: ButtonEvent) => void;
|
onClick?: (ev: ButtonEvent) => void;
|
||||||
inputRef?: React.RefObject<HTMLSpanElement>;
|
|
||||||
className?: string;
|
className?: string;
|
||||||
tabIndex?: number;
|
tabIndex?: number;
|
||||||
altText?: string;
|
altText?: string;
|
||||||
|
@ -95,7 +94,7 @@ const useImageUrl = ({ url, urls }: { url?: string | null; urls?: string[] }): [
|
||||||
return [imageUrl, onError];
|
return [imageUrl, onError];
|
||||||
};
|
};
|
||||||
|
|
||||||
const BaseAvatar: React.FC<IProps> = (props) => {
|
const BaseAvatar = forwardRef<HTMLElement, IProps>((props, ref) => {
|
||||||
const {
|
const {
|
||||||
name,
|
name,
|
||||||
idName,
|
idName,
|
||||||
|
@ -104,7 +103,6 @@ const BaseAvatar: React.FC<IProps> = (props) => {
|
||||||
urls,
|
urls,
|
||||||
size = "40px",
|
size = "40px",
|
||||||
onClick,
|
onClick,
|
||||||
inputRef,
|
|
||||||
className,
|
className,
|
||||||
type = "round",
|
type = "round",
|
||||||
altText = _t("common|avatar"),
|
altText = _t("common|avatar"),
|
||||||
|
@ -127,7 +125,7 @@ const BaseAvatar: React.FC<IProps> = (props) => {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Avatar
|
<Avatar
|
||||||
ref={inputRef}
|
ref={ref}
|
||||||
src={imageUrl}
|
src={imageUrl}
|
||||||
id={idName ?? ""}
|
id={idName ?? ""}
|
||||||
name={name ?? ""}
|
name={name ?? ""}
|
||||||
|
@ -143,7 +141,7 @@ const BaseAvatar: React.FC<IProps> = (props) => {
|
||||||
data-testid="avatar-img"
|
data-testid="avatar-img"
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
});
|
||||||
|
|
||||||
export default BaseAvatar;
|
export default BaseAvatar;
|
||||||
export type BaseAvatarType = React.FC<IProps>;
|
export type BaseAvatarType = React.FC<IProps>;
|
||||||
|
|
|
@ -15,7 +15,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { ReactNode, useContext } from "react";
|
import React, { forwardRef, ReactNode, Ref, useContext } from "react";
|
||||||
import { RoomMember, ResizeMethod } from "matrix-js-sdk/src/matrix";
|
import { RoomMember, ResizeMethod } from "matrix-js-sdk/src/matrix";
|
||||||
|
|
||||||
import dis from "../../../dispatcher/dispatcher";
|
import dis from "../../../dispatcher/dispatcher";
|
||||||
|
@ -42,7 +42,8 @@ interface IProps extends Omit<React.ComponentProps<typeof BaseAvatar>, "name" |
|
||||||
children?: ReactNode;
|
children?: ReactNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function MemberAvatar({
|
function MemberAvatar(
|
||||||
|
{
|
||||||
size,
|
size,
|
||||||
resizeMethod = "crop",
|
resizeMethod = "crop",
|
||||||
viewUserOnClick,
|
viewUserOnClick,
|
||||||
|
@ -51,7 +52,9 @@ export default function MemberAvatar({
|
||||||
hideTitle,
|
hideTitle,
|
||||||
member: propsMember,
|
member: propsMember,
|
||||||
...props
|
...props
|
||||||
}: IProps): JSX.Element {
|
}: IProps,
|
||||||
|
ref: Ref<HTMLElement>,
|
||||||
|
): JSX.Element {
|
||||||
const card = useContext(CardContext);
|
const card = useContext(CardContext);
|
||||||
|
|
||||||
const member = useRoomMemberProfile({
|
const member = useRoomMemberProfile({
|
||||||
|
@ -100,12 +103,9 @@ export default function MemberAvatar({
|
||||||
: props.onClick
|
: props.onClick
|
||||||
}
|
}
|
||||||
altText={_t("common|user_avatar")}
|
altText={_t("common|user_avatar")}
|
||||||
|
ref={ref}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export class LegacyMemberAvatar extends React.Component<IProps> {
|
export default forwardRef(MemberAvatar);
|
||||||
public render(): React.ReactNode {
|
|
||||||
return <MemberAvatar {...this.props}>{this.props.children}</MemberAvatar>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ import { logger } from "matrix-js-sdk/src/logger";
|
||||||
|
|
||||||
import NodeAnimator from "../../../NodeAnimator";
|
import NodeAnimator from "../../../NodeAnimator";
|
||||||
import { toPx } from "../../../utils/units";
|
import { toPx } from "../../../utils/units";
|
||||||
import { LegacyMemberAvatar as MemberAvatar } from "../avatars/MemberAvatar";
|
import MemberAvatar from "../avatars/MemberAvatar";
|
||||||
import { READ_AVATAR_SIZE } from "./ReadReceiptGroup";
|
import { READ_AVATAR_SIZE } from "./ReadReceiptGroup";
|
||||||
|
|
||||||
export interface IReadReceiptInfo {
|
export interface IReadReceiptInfo {
|
||||||
|
@ -216,7 +216,7 @@ export default class ReadReceiptMarker extends React.PureComponent<IProps, IStat
|
||||||
aria-live="off"
|
aria-live="off"
|
||||||
size="14px"
|
size="14px"
|
||||||
style={style}
|
style={style}
|
||||||
inputRef={this.avatar as RefObject<HTMLImageElement>}
|
ref={this.avatar}
|
||||||
hideTitle
|
hideTitle
|
||||||
tabIndex={-1}
|
tabIndex={-1}
|
||||||
/>
|
/>
|
||||||
|
|
Loading…
Reference in a new issue