generated from nhcarrigan/template
feat: Multiple Features, Accessibility, Security, and UX Improvements #59
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user