검증게시판 기능 추가

This commit is contained in:
Macbook
2026-05-27 15:41:19 +09:00
parent 7a0af36b9b
commit 63693d47c0
57 changed files with 4480 additions and 14 deletions
@@ -0,0 +1,63 @@
import type { VerificationIssueStage } from './verificationBoardStages';
export const VERIFICATION_ISSUE_EVENT_TOPIC = '/sub/verification-issues/events';
export type VerificationIssueEventType = 'CREATED' | 'STAGE_CHANGED';
export interface VerificationIssueEventDto {
eventType: VerificationIssueEventType;
issueId: number;
title: string;
stage: VerificationIssueStage;
previousStage?: VerificationIssueStage | null;
updatedAt?: string;
sourceDeviceId?: string | null;
}
export interface VerificationIssueToastItem {
id: string;
issueId: number;
title: string;
stage: VerificationIssueStage;
previousStage?: VerificationIssueStage | null;
eventType: VerificationIssueEventType;
}
export function getVerificationDeviceId(): string {
let id = localStorage.getItem('gc_device_id');
if (!id) {
id = crypto.randomUUID();
localStorage.setItem('gc_device_id', id);
}
return id;
}
export function parseVerificationIssueEvent(raw: string): VerificationIssueEventDto | null {
try {
const data = JSON.parse(raw) as VerificationIssueEventDto;
if (data.issueId == null || !data.eventType || !data.title) return null;
if (data.eventType !== 'CREATED' && data.eventType !== 'STAGE_CHANGED') return null;
return data;
} catch {
return null;
}
}
export function shouldShowVerificationIssueEvent(event: VerificationIssueEventDto): boolean {
const localDevice = getVerificationDeviceId();
if (event.sourceDeviceId && event.sourceDeviceId === localDevice) {
return false;
}
return true;
}
export function eventToToast(event: VerificationIssueEventDto): VerificationIssueToastItem {
return {
id: `${event.eventType}-${event.issueId}-${event.updatedAt ?? Date.now()}`,
issueId: event.issueId,
title: event.title,
stage: event.stage,
previousStage: event.previousStage,
eventType: event.eventType,
};
}