* Ditch legacy Tooltips in favour of Compound Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove dead code Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Extract markdown CodeBlock into React component Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Upgrade compound Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
134 lines
5.1 KiB
TypeScript
134 lines
5.1 KiB
TypeScript
/*
|
|
Copyright 2024 New Vector Ltd.
|
|
Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
|
Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
|
|
import * as React from "react";
|
|
import { useContext, useState } from "react";
|
|
|
|
import AutoHideScrollbar from "./AutoHideScrollbar";
|
|
import { getHomePageUrl } from "../../utils/pages";
|
|
import { _t, _tDom } from "../../languageHandler";
|
|
import SdkConfig from "../../SdkConfig";
|
|
import dis from "../../dispatcher/dispatcher";
|
|
import { Action } from "../../dispatcher/actions";
|
|
import BaseAvatar from "../views/avatars/BaseAvatar";
|
|
import { OwnProfileStore } from "../../stores/OwnProfileStore";
|
|
import AccessibleButton, { ButtonEvent } from "../views/elements/AccessibleButton";
|
|
import { UPDATE_EVENT } from "../../stores/AsyncStore";
|
|
import { useEventEmitter } from "../../hooks/useEventEmitter";
|
|
import MatrixClientContext, { useMatrixClientContext } from "../../contexts/MatrixClientContext";
|
|
import MiniAvatarUploader, { AVATAR_SIZE } from "../views/elements/MiniAvatarUploader";
|
|
import PosthogTrackers from "../../PosthogTrackers";
|
|
import EmbeddedPage from "./EmbeddedPage";
|
|
|
|
const onClickSendDm = (ev: ButtonEvent): void => {
|
|
PosthogTrackers.trackInteraction("WebHomeCreateChatButton", ev);
|
|
dis.dispatch({ action: "view_create_chat" });
|
|
};
|
|
|
|
const onClickExplore = (ev: ButtonEvent): void => {
|
|
PosthogTrackers.trackInteraction("WebHomeExploreRoomsButton", ev);
|
|
dis.fire(Action.ViewRoomDirectory);
|
|
};
|
|
|
|
const onClickNewRoom = (ev: ButtonEvent): void => {
|
|
PosthogTrackers.trackInteraction("WebHomeCreateRoomButton", ev);
|
|
dis.dispatch({ action: "view_create_room" });
|
|
};
|
|
|
|
interface IProps {
|
|
justRegistered?: boolean;
|
|
}
|
|
|
|
const getOwnProfile = (
|
|
userId: string,
|
|
): {
|
|
displayName: string;
|
|
avatarUrl?: string;
|
|
} => ({
|
|
displayName: OwnProfileStore.instance.displayName || userId,
|
|
avatarUrl: OwnProfileStore.instance.getHttpAvatarUrl(parseInt(AVATAR_SIZE, 10)) ?? undefined,
|
|
});
|
|
|
|
const UserWelcomeTop: React.FC = () => {
|
|
const cli = useContext(MatrixClientContext);
|
|
const userId = cli.getUserId()!;
|
|
const [ownProfile, setOwnProfile] = useState(getOwnProfile(userId));
|
|
useEventEmitter(OwnProfileStore.instance, UPDATE_EVENT, () => {
|
|
setOwnProfile(getOwnProfile(userId));
|
|
});
|
|
|
|
return (
|
|
<div>
|
|
<MiniAvatarUploader
|
|
hasAvatar={!!ownProfile.avatarUrl}
|
|
hasAvatarLabel={_t("onboarding|has_avatar_label")}
|
|
noAvatarLabel={_t("onboarding|no_avatar_label")}
|
|
setAvatarUrl={(url) => cli.setAvatarUrl(url)}
|
|
isUserAvatar
|
|
onClick={(ev) => PosthogTrackers.trackInteraction("WebHomeMiniAvatarUploadButton", ev)}
|
|
>
|
|
<BaseAvatar
|
|
idName={userId}
|
|
name={ownProfile.displayName}
|
|
url={ownProfile.avatarUrl}
|
|
size={AVATAR_SIZE}
|
|
/>
|
|
</MiniAvatarUploader>
|
|
|
|
<h1>{_tDom("onboarding|welcome_user", { name: ownProfile.displayName })}</h1>
|
|
<h2>{_tDom("onboarding|welcome_detail")}</h2>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
const HomePage: React.FC<IProps> = ({ justRegistered = false }) => {
|
|
const cli = useMatrixClientContext();
|
|
const config = SdkConfig.get();
|
|
const pageUrl = getHomePageUrl(config, cli);
|
|
|
|
if (pageUrl) {
|
|
return <EmbeddedPage className="mx_HomePage" url={pageUrl} scrollbar={true} />;
|
|
}
|
|
|
|
let introSection: JSX.Element;
|
|
if (justRegistered || !OwnProfileStore.instance.getHttpAvatarUrl(parseInt(AVATAR_SIZE, 10))) {
|
|
introSection = <UserWelcomeTop />;
|
|
} else {
|
|
const brandingConfig = SdkConfig.getObject("branding");
|
|
const logoUrl = brandingConfig?.get("auth_header_logo_url") ?? "themes/element/img/logos/element-logo.svg";
|
|
|
|
introSection = (
|
|
<React.Fragment>
|
|
<img src={logoUrl} alt={config.brand} />
|
|
<h1>{_tDom("onboarding|intro_welcome", { appName: config.brand })}</h1>
|
|
<h2>{_tDom("onboarding|intro_byline")}</h2>
|
|
</React.Fragment>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<AutoHideScrollbar className="mx_HomePage mx_HomePage_default" element="main">
|
|
<div className="mx_HomePage_default_wrapper">
|
|
{introSection}
|
|
<div className="mx_HomePage_default_buttons">
|
|
<AccessibleButton onClick={onClickSendDm} className="mx_HomePage_button_sendDm">
|
|
{_tDom("onboarding|send_dm")}
|
|
</AccessibleButton>
|
|
<AccessibleButton onClick={onClickExplore} className="mx_HomePage_button_explore">
|
|
{_tDom("onboarding|explore_rooms")}
|
|
</AccessibleButton>
|
|
<AccessibleButton onClick={onClickNewRoom} className="mx_HomePage_button_createGroup">
|
|
{_tDom("onboarding|create_room")}
|
|
</AccessibleButton>
|
|
</div>
|
|
</div>
|
|
</AutoHideScrollbar>
|
|
);
|
|
};
|
|
|
|
export default HomePage;
|