41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import type { MediaViewData } from '@/lib/view-data/MediaViewData';
|
|
|
|
import { ViewModel } from "../contracts/view-models/ViewModel";
|
|
|
|
type MediaAssetViewData = MediaViewData['assets'][number];
|
|
|
|
/**
|
|
* Media View Model
|
|
*
|
|
* Client-only ViewModel created from ViewData (never DTO).
|
|
* Represents a single media asset card in the UI.
|
|
*/
|
|
export class MediaViewModel extends ViewModel {
|
|
id: string;
|
|
src: string;
|
|
title: string;
|
|
category: string;
|
|
date?: string;
|
|
dimensions?: string;
|
|
|
|
constructor(viewData: MediaAssetViewData) {
|
|
super();
|
|
this.id = viewData.id;
|
|
this.src = viewData.src;
|
|
this.title = viewData.title;
|
|
this.category = viewData.category;
|
|
if (viewData.date !== undefined) this.date = viewData.date;
|
|
if (viewData.dimensions !== undefined) this.dimensions = viewData.dimensions;
|
|
}
|
|
|
|
/** UI-specific: Combined subtitle used by MediaCard */
|
|
get subtitle(): string {
|
|
return `${this.category}${this.dimensions ? ` • ${this.dimensions}` : ''}`;
|
|
}
|
|
|
|
/** UI-specific: Whether any metadata is present */
|
|
get hasMetadata(): boolean {
|
|
return !!this.date || !!this.dimensions;
|
|
}
|
|
}
|