enableDownvotes,
enableNsfw,
getCommentParentId,
- getRoleLabelPill,
myAuth,
myAuthRequired,
setIsoData,
getQueryParams,
getQueryString,
numToSI,
+ randomStr,
} from "@utils/helpers";
import { canMod, isAdmin, isBanned } from "@utils/roles";
import type { QueryParams } from "@utils/types";
import { Icon, Spinner } from "../common/icon";
import { MomentTime } from "../common/moment-time";
import { SortSelect } from "../common/sort-select";
+import { UserBadges } from "../common/user-badges";
import { CommunityLink } from "../community/community-link";
import { PersonDetails } from "./person-details";
import { PersonListing } from "./person-listing";
async fetchUserData() {
const { page, sort, view } = getProfileQueryParams();
- this.setState({ personRes: { state: "empty" } });
+ this.setState({ personRes: { state: "loading" } });
this.setState({
personRes: await HttpService.client.getPersonDetails({
username: this.props.match.params.username,
<HtmlTags
title={this.documentTitle}
path={this.context.router.route.match.url}
+ canonicalPath={personRes.person_view.person.actor_id}
description={personRes.person_view.person.bio}
image={personRes.person_view.person.avatar}
/>
get viewRadios() {
return (
- <div className="btn-group btn-group-toggle flex-wrap mb-2">
+ <div className="btn-group btn-group-toggle flex-wrap mb-2" role="group">
{this.getRadio(PersonDetailsView.Overview)}
{this.getRadio(PersonDetailsView.Comments)}
{this.getRadio(PersonDetailsView.Posts)}
getRadio(view: PersonDetailsView) {
const { view: urlView } = getProfileQueryParams();
const active = view === urlView;
+ const radioId = randomStr();
return (
- <label
- className={classNames("btn btn-outline-secondary pointer", {
- active,
- })}
- >
+ <>
<input
+ id={radioId}
type="radio"
className="btn-check"
value={view}
checked={active}
onChange={linkEvent(this, this.handleViewChange)}
/>
- {I18NextService.i18n.t(view.toLowerCase() as NoOptionI18nKeys)}
- </label>
+ <label
+ htmlFor={radioId}
+ className={classNames("btn btn-outline-secondary pointer", {
+ active,
+ })}
+ >
+ {I18NextService.i18n.t(view.toLowerCase() as NoOptionI18nKeys)}
+ </label>
+ </>
);
}
hideAvatar
/>
</li>
- {isBanned(pv.person) && (
- <li className="list-inline-item">
- {getRoleLabelPill({
- label: I18NextService.i18n.t("banned"),
- tooltip: I18NextService.i18n.t("banned"),
- classes: "text-bg-danger",
- shrink: false,
- })}
- </li>
- )}
- {pv.person.deleted && (
- <li className="list-inline-item">
- {getRoleLabelPill({
- label: I18NextService.i18n.t("deleted"),
- tooltip: I18NextService.i18n.t("deleted"),
- classes: "text-bg-danger",
- shrink: false,
- })}
- </li>
- )}
- {pv.person.admin && (
- <li className="list-inline-item">
- {getRoleLabelPill({
- label: I18NextService.i18n.t("admin"),
- tooltip: I18NextService.i18n.t("admin"),
- shrink: false,
- })}
- </li>
- )}
- {pv.person.bot_account && (
- <li className="list-inline-item">
- {getRoleLabelPill({
- label: I18NextService.i18n
- .t("bot_account")
- .toLowerCase(),
- tooltip: I18NextService.i18n.t("bot_account"),
- shrink: false,
- })}
- </li>
- )}
+ <li className="list-inline-item">
+ <UserBadges
+ classNames="ms-1"
+ isBanned={isBanned(pv.person)}
+ isDeleted={pv.person.deleted}
+ isAdmin={pv.person.admin}
+ isBot={pv.person.bot_account}
+ />
+ </li>
</ul>
</div>
{this.banDialog(pv)}