feat: Multiple Features, Accessibility, Security, and UX Improvements #59

Merged
naomi merged 27 commits from feat/polish into main 2026-02-20 01:51:25 -08:00
2 changed files with 14 additions and 11 deletions
Showing only changes of commit 391ea6d9f6 - Show all commits
+5 -6
View File
@@ -7,10 +7,9 @@
import type { import type {
Activity, Activity,
ActivityFeedResponse, ActivityFeedResponse,
ActivityType,
ActivityUser, ActivityUser,
} from "@library/shared-types"; } from "@library/shared-types";
import { ACHIEVEMENTS } from "@library/shared-types"; import { ACHIEVEMENTS, ActivityType } from "@library/shared-types";
import { prisma } from "../lib/prisma"; import { prisma } from "../lib/prisma";
export class ActivityService { export class ActivityService {
@@ -89,7 +88,7 @@ export class ActivityService {
return suggestions.map((suggestion) => ({ return suggestions.map((suggestion) => ({
id: `suggestion-${suggestion.id}`, id: `suggestion-${suggestion.id}`,
type: "SUGGESTION" as const, type: ActivityType.suggestion,
user: suggestion.user as ActivityUser, user: suggestion.user as ActivityUser,
entityType: suggestion.entityType, entityType: suggestion.entityType,
suggestionTitle: suggestion.title, suggestionTitle: suggestion.title,
@@ -139,7 +138,7 @@ export class ActivityService {
); );
return { return {
id: `like-${like.id}`, id: `like-${like.id}`,
type: "LIKE" as const, type: ActivityType.like,
user: like.user as ActivityUser, user: like.user as ActivityUser,
entityType: like.entityType, entityType: like.entityType,
entityId: like.entityId, entityId: like.entityId,
@@ -229,7 +228,7 @@ export class ActivityService {
return { return {
id: `comment-${comment.id}`, id: `comment-${comment.id}`,
type: "COMMENT" as const, type: ActivityType.comment,
user: comment.user as ActivityUser, user: comment.user as ActivityUser,
entityType, entityType,
entityId, entityId,
@@ -282,7 +281,7 @@ export class ActivityService {
const achievement = ACHIEVEMENTS[ua.achievementKey]; const achievement = ACHIEVEMENTS[ua.achievementKey];
return { return {
id: `achievement-${ua.id}`, id: `achievement-${ua.id}`,
type: "ACHIEVEMENT" as const, type: ActivityType.achievement,
user: ua.user as ActivityUser, user: ua.user as ActivityUser,
achievementKey: ua.achievementKey, achievementKey: ua.achievementKey,
achievementName: achievement.title, achievementName: achievement.title,
@@ -7,7 +7,8 @@
import { Component, OnInit, inject, signal } from '@angular/core'; import { Component, OnInit, inject, signal } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { RouterLink } from '@angular/router'; import { RouterLink } from '@angular/router';
import type { Activity, ActivityType } from '@library/shared-types'; import type { Activity } from '@library/shared-types';
import { ActivityType } from '@library/shared-types';
import { ActivityService } from '../../services/activity.service'; import { ActivityService } from '../../services/activity.service';
@Component({ @Component({
@@ -64,7 +65,7 @@ import { ActivityService } from '../../services/activity.service';
<div class="activity-content"> <div class="activity-content">
@switch (activity.type) { @switch (activity.type) {
@case ('SUGGESTION') { @case (ActivityType.suggestion) {
<div class="activity-suggestion"> <div class="activity-suggestion">
<span class="activity-icon">πŸ’‘</span> <span class="activity-icon">πŸ’‘</span>
<span class="activity-text"> <span class="activity-text">
@@ -76,7 +77,7 @@ import { ActivityService } from '../../services/activity.service';
</span> </span>
</div> </div>
} }
@case ('LIKE') { @case (ActivityType.like) {
<div class="activity-like"> <div class="activity-like">
<span class="activity-icon">❀️</span> <span class="activity-icon">❀️</span>
<span class="activity-text"> <span class="activity-text">
@@ -87,7 +88,7 @@ import { ActivityService } from '../../services/activity.service';
</span> </span>
</div> </div>
} }
@case ('COMMENT') { @case (ActivityType.comment) {
<div class="activity-comment"> <div class="activity-comment">
<span class="activity-icon">πŸ’¬</span> <span class="activity-icon">πŸ’¬</span>
<span class="activity-text"> <span class="activity-text">
@@ -99,7 +100,7 @@ import { ActivityService } from '../../services/activity.service';
<p class="comment-preview">"{{ activity.commentPreview }}"</p> <p class="comment-preview">"{{ activity.commentPreview }}"</p>
</div> </div>
} }
@case ('ACHIEVEMENT') { @case (ActivityType.achievement) {
<div class="activity-achievement"> <div class="activity-achievement">
<span class="activity-icon">{{ activity.achievementIcon }}</span> <span class="activity-icon">{{ activity.achievementIcon }}</span>
<span class="activity-text"> <span class="activity-text">
@@ -360,6 +361,9 @@ import { ActivityService } from '../../services/activity.service';
export class ActivityFeedComponent implements OnInit { export class ActivityFeedComponent implements OnInit {
private activityService = inject(ActivityService); private activityService = inject(ActivityService);
// Make ActivityType accessible in template
ActivityType = ActivityType;
activities = signal<Activity[]>([]); activities = signal<Activity[]>([]);
loading = signal(true); loading = signal(true);
loadingMore = signal(false); loadingMore = signal(false);