···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344+import { ReportableType } from 'interfaces/reportable';
45import * as React from 'react';
56import { trans } from 'utils/lang';
66-import { ReportableType, reportableTypeToGroupKey, showReportForm } from './report-form';
77+import { reportableTypeToGroupKey, showReportForm } from './report-form';
7889type ReactButton = React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
910type ReactButtonWithoutRef = Pick<ReactButton, Exclude<keyof ReactButton, 'ref'>>;
+16-3
resources/js/components/user-card-tooltip.tsx
···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344+import Reportable from 'interfaces/reportable';
45import UserJson from 'interfaces/user-json';
56import { route } from 'laroute';
67import * as _ from 'lodash';
···8687 card.classList.remove('js-react--user-card');
8788 card.classList.add('js-react--user-card-tooltip');
8889 card.dataset.lookup = userId;
8989- if (element.dataset.tooltipPosition != null) {
9090- card.dataset.tooltipPosition = element.dataset.tooltipPosition;
9090+ for (const [key, value] of Object.entries(element.dataset)) {
9191+ card.dataset[key] = value;
9192 }
92939394 $(element).qtip(createTooltipOptions(card));
···214215 state: Readonly<State> = {};
215216 private readonly contextActiveKeyDidChange = contextActiveKeyDidChange.bind(this);
216217218218+ private get reportable() {
219219+ const dataString = this.props.container.dataset.reportable;
220220+221221+ return dataString == null
222222+ ? undefined
223223+ : JSON.parse(dataString) as Reportable;
224224+ }
225225+217226 componentDidMount() {
218227 this.getUser().then((user) => {
219228 this.setState({ user });
···237246 <TooltipContext.Provider value={this.props.container}>
238247 <ContainerContext.Provider value={{ activeKeyDidChange: this.activeKeyDidChange }}>
239248 <KeyContext.Provider value={this.props.lookup}>
240240- <UserCard activated={activated} user={this.state.user} />
249249+ <UserCard
250250+ activated={activated}
251251+ reportable={this.reportable}
252252+ user={this.state.user}
253253+ />
241254 </KeyContext.Provider>
242255 </ContainerContext.Provider>
243256 </TooltipContext.Provider>
+4-2
resources/js/components/user-card.tsx
···3344import BlockButton from 'components/block-button';
55import FriendButton from 'components/friend-button';
66+import Reportable from 'interfaces/reportable';
67import UserJson from 'interfaces/user-json';
78import { route } from 'laroute';
89import * as _ from 'lodash';
···3031 activated: boolean;
3132 mode: ViewMode;
3233 modifiers?: Modifiers;
3434+ reportable?: Reportable;
3335 user?: UserJson | null;
3436}
3537···304306 className='simple-menu__item'
305307 icon
306308 onFormOpen={dismiss}
307307- reportableId={this.user.id.toString()}
308308- reportableType='user'
309309+ reportableId={this.props.reportable?.id ?? this.user.id.toString()}
310310+ reportableType={this.props.reportable?.type ?? 'user'}
309311 user={this.user}
310312 />
311313 </div>
+3
resources/js/components/user-link.tsx
···11// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22// See the LICENCE file in the repository root for full licence text.
3344+import Reportable from 'interfaces/reportable';
45import Ruleset from 'interfaces/ruleset';
56import UserJson from 'interfaces/user-json';
67import { route } from 'laroute';
···1011 children?: React.ReactNode;
1112 className?: string;
1213 mode?: Ruleset;
1414+ reportable?: Reportable;
1315 tooltipPosition?: string;
1416 user: Partial<Pick<UserJson, 'id' | 'username'>>;
1517}
···2830 return (
2931 <a
3032 className={className}
3333+ data-reportable={JSON.stringify(this.props.reportable)}
3134 data-tooltip-position={this.props.tooltipPosition}
3235 data-user-id={this.props.user.id}
3336 href={href}
+20
resources/js/interfaces/reportable.ts
···11+// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
22+// See the LICENCE file in the repository root for full licence text.
33+44+export type ReportableType =
55+ | 'beatmapset'
66+ | 'beatmapset_discussion_post'
77+ | 'comment'
88+ | 'forum_post'
99+ | 'message'
1010+ | 'score_best_fruits'
1111+ | 'score_best_mania'
1212+ | 'score_best_osu'
1313+ | 'score_best_taiko'
1414+ | 'solo_score'
1515+ | 'user';
1616+1717+export default interface Reportable {
1818+ id: string;
1919+ type: ReportableType;
2020+}