shoc-frontend-new/src/domain/work-orders/utils/partition-slide-over-media.ts
Codex Review Integration 8774b2e0a6 fix(work-orders): render PM extra media in the gallery (SH-371)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 15:23:24 -03:00

54 lines
2 KiB
TypeScript

import type { MediaFile } from "@/domain/work-orders/types/work-order-media";
const COMPLETION_PURPOSES = new Set(["Before", "After", "Completion"]);
export type MediaSurfaceOwnership = {
completionOwnedIds: ReadonlySet<string>;
extraOwnedIds: ReadonlySet<string>;
};
const EMPTY_OWNERSHIP: MediaSurfaceOwnership = {
completionOwnedIds: new Set(),
extraOwnedIds: new Set(),
};
/** Only Reactive and Emergency work orders render a media gallery on the Completion tab. */
export function hasCompletionMediaGallery(type: string | null | undefined): boolean {
return type === "Emergency" || type === "Reactive";
}
function isPhotoOrVideo(item: MediaFile): boolean {
return item.fileType === "image" || item.fileType === "video";
}
function isInFlight(item: MediaFile): boolean {
return item.uploadStatus === "uploading" || item.uploadStatus === "failed";
}
/** Extra photo/video from Completion Doc POST (no category) until Extra is chosen. */
export function isCompletionSurfaceMedia(
item: MediaFile,
ownership: MediaSurfaceOwnership = EMPTY_OWNERSHIP,
completionHasGallery = true,
): boolean {
if (isInFlight(item)) return true;
if (COMPLETION_PURPOSES.has(item.purpose ?? "")) return true;
if (!completionHasGallery && item.purpose === "Extra") return false;
if (ownership.completionOwnedIds.has(item.id)) return true;
if (ownership.extraOwnedIds.has(item.id)) return false;
return item.purpose === "Extra" && isPhotoOrVideo(item);
}
/** Without a Completion gallery, every Extra item (including photos/videos) belongs to Extras. */
export function isExtrasSurfaceMedia(
item: MediaFile,
ownership: MediaSurfaceOwnership = EMPTY_OWNERSHIP,
completionHasGallery = true,
): boolean {
if (item.purpose === "Aveta") return true;
if (item.purpose !== "Extra") return false;
if (!completionHasGallery) return true;
if (ownership.completionOwnedIds.has(item.id)) return false;
if (ownership.extraOwnedIds.has(item.id)) return true;
return !isPhotoOrVideo(item);
}