generated from nhcarrigan/template
feat: Multiple Features, Accessibility, Security, and UX Improvements #59
@@ -58,6 +58,7 @@ import { ApiService } from '../../services/api.service';
|
|||||||
class="dropdown-menu"
|
class="dropdown-menu"
|
||||||
role="menu"
|
role="menu"
|
||||||
aria-label="User menu"
|
aria-label="User menu"
|
||||||
|
tabindex="-1"
|
||||||
(keydown.escape)="closeDropdown()"
|
(keydown.escape)="closeDropdown()"
|
||||||
>
|
>
|
||||||
<a [routerLink]="['/profile', user.slug || user.id]" class="dropdown-item" role="menuitem" (click)="closeDropdown()">My Profile</a>
|
<a [routerLink]="['/profile', user.slug || user.id]" class="dropdown-item" role="menuitem" (click)="closeDropdown()">My Profile</a>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -21,50 +21,50 @@ export enum AchievementTier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface AchievementRequirements {
|
export interface AchievementRequirements {
|
||||||
count?: number;
|
count?: number;
|
||||||
rate?: number;
|
rate?: number;
|
||||||
streak?: number;
|
streak?: number;
|
||||||
diversity?: boolean;
|
diversity?: boolean;
|
||||||
uniqueItems?: number;
|
uniqueItems?: number;
|
||||||
dayRange?: number;
|
dayRange?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AchievementDefinition {
|
export interface AchievementDefinition {
|
||||||
key: string;
|
key: string;
|
||||||
title: string;
|
title: string;
|
||||||
description: string;
|
description: string;
|
||||||
category: AchievementCategory;
|
category: AchievementCategory;
|
||||||
tier: AchievementTier;
|
tier: AchievementTier;
|
||||||
icon: string;
|
icon: string;
|
||||||
points: number;
|
points: number;
|
||||||
requirements: AchievementRequirements;
|
requirements: AchievementRequirements;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UserAchievement {
|
export interface UserAchievement {
|
||||||
id: string;
|
id: string;
|
||||||
userId: string;
|
userId: string;
|
||||||
achievementKey: string;
|
achievementKey: string;
|
||||||
progress: number;
|
progress: number;
|
||||||
earned: boolean;
|
earned: boolean;
|
||||||
earnedAt?: Date;
|
earnedAt?: Date;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AchievementProgress {
|
export interface AchievementProgress {
|
||||||
definition: AchievementDefinition;
|
definition: AchievementDefinition;
|
||||||
progress: number;
|
progress: number;
|
||||||
earned: boolean;
|
earned: boolean;
|
||||||
earnedAt?: Date;
|
earnedAt?: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UserAchievementSummary {
|
export interface UserAchievementSummary {
|
||||||
totalPoints: number;
|
totalPoints: number;
|
||||||
totalEarned: number;
|
totalEarned: number;
|
||||||
recentAchievements: AchievementProgress[];
|
recentAchievements: Array<AchievementProgress>;
|
||||||
progressByCategory: {
|
progressByCategory: Array<{
|
||||||
category: AchievementCategory;
|
category: AchievementCategory;
|
||||||
earned: number;
|
earned: number;
|
||||||
total: number;
|
total: number;
|
||||||
}[];
|
}>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,39 +30,39 @@ interface BaseActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface SuggestionActivity extends BaseActivity {
|
interface SuggestionActivity extends BaseActivity {
|
||||||
type: ActivityType.suggestion;
|
type: ActivityType.suggestion;
|
||||||
entityType: string;
|
entityType: string;
|
||||||
suggestionTitle: string;
|
suggestionTitle: string;
|
||||||
status: string;
|
status: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LikeActivity extends BaseActivity {
|
interface LikeActivity extends BaseActivity {
|
||||||
type: ActivityType.like;
|
type: ActivityType.like;
|
||||||
entityType: string;
|
entityType: string;
|
||||||
entityId: string;
|
entityId: string;
|
||||||
entityTitle: string;
|
entityTitle: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface CommentActivity extends BaseActivity {
|
interface CommentActivity extends BaseActivity {
|
||||||
type: ActivityType.comment;
|
type: ActivityType.comment;
|
||||||
entityType: string;
|
entityType: string;
|
||||||
entityId: string;
|
entityId: string;
|
||||||
entityTitle: string;
|
entityTitle: string;
|
||||||
commentPreview: string;
|
commentPreview: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface AchievementActivity extends BaseActivity {
|
interface AchievementActivity extends BaseActivity {
|
||||||
type: ActivityType.achievement;
|
type: ActivityType.achievement;
|
||||||
achievementKey: string;
|
achievementKey: string;
|
||||||
achievementName: string;
|
achievementName: string;
|
||||||
achievementIcon: string;
|
achievementIcon: string;
|
||||||
achievementPoints: number;
|
achievementPoints: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
type Activity = SuggestionActivity | LikeActivity | CommentActivity | AchievementActivity;
|
type Activity = SuggestionActivity | LikeActivity | CommentActivity | AchievementActivity;
|
||||||
|
|
||||||
interface ActivityFeedResponse {
|
interface ActivityFeedResponse {
|
||||||
activities: Activity[];
|
activities: Array<Activity>;
|
||||||
total: number;
|
total: number;
|
||||||
hasMore: boolean;
|
hasMore: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ interface User {
|
|||||||
isAdmin: boolean;
|
isAdmin: boolean;
|
||||||
isBanned: boolean;
|
isBanned: boolean;
|
||||||
inDiscord: boolean;
|
inDiscord: boolean;
|
||||||
isVip: boolean;
|
isVip: boolean;
|
||||||
isMod: boolean;
|
isMod: boolean;
|
||||||
isStaff: boolean;
|
isStaff: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface JwtPayload {
|
interface JwtPayload {
|
||||||
|
|||||||
@@ -4,34 +4,34 @@
|
|||||||
* @author Naomi Carrigan
|
* @author Naomi Carrigan
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { PrimaryBadge } from "./auth.types";
|
import type { PrimaryBadge } from "./auth.types";
|
||||||
|
|
||||||
interface CommentUser {
|
interface CommentUser {
|
||||||
id: string;
|
id: string;
|
||||||
username: string;
|
username: string;
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
primaryBadge?: PrimaryBadge;
|
primaryBadge?: PrimaryBadge;
|
||||||
inDiscord?: boolean;
|
inDiscord?: boolean;
|
||||||
isVip?: boolean;
|
isVip?: boolean;
|
||||||
isMod?: boolean;
|
isMod?: boolean;
|
||||||
isStaff?: boolean;
|
isStaff?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Comment {
|
interface Comment {
|
||||||
id: string;
|
id: string;
|
||||||
content: string;
|
content: string;
|
||||||
rawContent?: string;
|
rawContent?: string;
|
||||||
userId: string;
|
userId: string;
|
||||||
user: CommentUser;
|
user: CommentUser;
|
||||||
gameId?: string;
|
gameId?: string;
|
||||||
bookId?: string;
|
bookId?: string;
|
||||||
musicId?: string;
|
musicId?: string;
|
||||||
artId?: string;
|
artId?: string;
|
||||||
showId?: string;
|
showId?: string;
|
||||||
mangaId?: string;
|
mangaId?: string;
|
||||||
hasPendingReports?: boolean;
|
hasPendingReports?: boolean;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface CreateCommentDto {
|
interface CreateCommentDto {
|
||||||
|
|||||||
@@ -5,21 +5,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
interface LeaderboardUser {
|
interface LeaderboardUser {
|
||||||
id: string;
|
id: string;
|
||||||
username: string;
|
username: string;
|
||||||
slug: string | null;
|
slug: string | null;
|
||||||
avatar: string | null;
|
avatar: string | null;
|
||||||
primaryBadge: string | null;
|
primaryBadge: string | null;
|
||||||
isVip: boolean;
|
isVip: boolean;
|
||||||
isMod: boolean;
|
isMod: boolean;
|
||||||
isStaff: boolean;
|
isStaff: boolean;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SuggestionsLeaderboard extends LeaderboardUser {
|
interface SuggestionsLeaderboard extends LeaderboardUser {
|
||||||
totalSuggestions: number;
|
totalSuggestions: number;
|
||||||
acceptedSuggestions: number;
|
acceptedSuggestions: number;
|
||||||
acceptanceRate: number;
|
acceptanceRate: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LikesLeaderboard extends LeaderboardUser {
|
interface LikesLeaderboard extends LeaderboardUser {
|
||||||
@@ -31,20 +31,20 @@ interface CommentsLeaderboard extends LeaderboardUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface OverallLeaderboard extends LeaderboardUser {
|
interface OverallLeaderboard extends LeaderboardUser {
|
||||||
totalSuggestions: number;
|
totalSuggestions: number;
|
||||||
totalLikes: number;
|
totalLikes: number;
|
||||||
totalComments: number;
|
totalComments: number;
|
||||||
achievementCount: number;
|
achievementCount: number;
|
||||||
achievementPoints: number;
|
achievementPoints: number;
|
||||||
currentStreak: number;
|
currentStreak: number;
|
||||||
diversityScore: number;
|
diversityScore: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LeaderboardResponse {
|
interface LeaderboardResponse {
|
||||||
topSuggestions: SuggestionsLeaderboard[];
|
topSuggestions: Array<SuggestionsLeaderboard>;
|
||||||
topLikes: LikesLeaderboard[];
|
topLikes: Array<LikesLeaderboard>;
|
||||||
topComments: CommentsLeaderboard[];
|
topComments: Array<CommentsLeaderboard>;
|
||||||
topOverall: OverallLeaderboard[];
|
topOverall: Array<OverallLeaderboard>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
|||||||
@@ -74,10 +74,10 @@ export interface CommentReport {
|
|||||||
|
|
||||||
export interface CommentReportWithDetails extends CommentReport {
|
export interface CommentReportWithDetails extends CommentReport {
|
||||||
reportedComment: {
|
reportedComment: {
|
||||||
id: string;
|
id: string;
|
||||||
content: string;
|
content: string;
|
||||||
rawContent?: string;
|
rawContent?: string;
|
||||||
userId: string;
|
userId: string;
|
||||||
user: {
|
user: {
|
||||||
id: string;
|
id: string;
|
||||||
username: string;
|
username: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user