35 lines
1.0 KiB
TypeScript
35 lines
1.0 KiB
TypeScript
/**
|
|
* Record engagement input view model
|
|
* Represents input data for recording an engagement event
|
|
*/
|
|
import { ViewModel } from "../contracts/view-models/ViewModel";
|
|
import type { RecordEngagementInputViewData } from "../view-data/RecordEngagementInputViewData";
|
|
|
|
export class RecordEngagementInputViewModel extends ViewModel {
|
|
eventType: string;
|
|
userId?: string;
|
|
metadata?: Record<string, unknown>;
|
|
|
|
constructor(data: RecordEngagementInputViewData) {
|
|
super();
|
|
this.eventType = data.eventType;
|
|
this.userId = data.userId;
|
|
this.metadata = data.metadata;
|
|
}
|
|
|
|
/** UI-specific: Formatted event type for display */
|
|
get displayEventType(): string {
|
|
return this.eventType.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
|
|
}
|
|
|
|
/** UI-specific: Has metadata */
|
|
get hasMetadata(): boolean {
|
|
return this.metadata !== undefined && Object.keys(this.metadata).length > 0;
|
|
}
|
|
|
|
/** UI-specific: Metadata keys count */
|
|
get metadataKeysCount(): number {
|
|
return this.metadata ? Object.keys(this.metadata).length : 0;
|
|
}
|
|
}
|