fix(review): #90 photo strip — blob: URL for Primary photo, checkerboard thumbs
Bug #1: the first/Primary (calibration) photo rendered broken because its in-memory capture Blob was assigned to <img src> directly (String(Blob)= "object Blob"). resolvePhotoUrl() now mints a blob: object URL (revoked on unload) and falls back to the stored photo endpoint when there is no blob. Bug #2: strip thumbnails used a flat dark bg; now carry the gray checkerboard from the Capture lineup (MeasurePanel) so transparent inventory PNGs read the same on both screens. Also harden missingMinimums to filter kept internally (pre-existing test 7 failed on the clean base because it passed un-kept items).
This commit is contained in:
@@ -42,7 +42,8 @@ export function moveItem<T>(arr: T[], from: number, to: number): T[] {
|
||||
* clean calibration photo and one dimension-overlay copy. Returns the missing
|
||||
* role(s) so the UI can name them in a nudge.
|
||||
*/
|
||||
export function missingMinimums(kept: LineupItem[]): PhotoRole[] {
|
||||
export function missingMinimums(items: LineupItem[]): PhotoRole[] {
|
||||
const kept = items.filter((it) => it.kept);
|
||||
const missing: PhotoRole[] = [];
|
||||
if (!kept.some((it) => it.role === 'calibration')) missing.push('calibration');
|
||||
if (!kept.some((it) => it.role === 'overlay')) missing.push('overlay');
|
||||
@@ -60,3 +61,22 @@ export function roleLabel(role: PhotoRole): string {
|
||||
if (role === 'overlay') return 'its dimension-overlay copy';
|
||||
return 'a batch photo';
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the <img> src for a strip photo. The in-memory capture blob (fresh
|
||||
* photo) must become a `blob:` object URL — assigning a raw Blob (or
|
||||
* `String(blob)` = "object Blob") to `src` renders a broken image. That was
|
||||
* bug #1: the first/Primary (calibration) photo is the one carrying a blob.
|
||||
* When there is no usable blob, fall back to the stored photo endpoint.
|
||||
*
|
||||
* Pure + injectable: `createObjectUrl` defaults to `URL.createObjectURL` so it
|
||||
* is unit-testable without a real DOM/Blob.
|
||||
*/
|
||||
export function resolvePhotoUrl(
|
||||
blob: Blob | null,
|
||||
endpoint: string,
|
||||
createObjectUrl: (b: Blob) => string = (b) => URL.createObjectURL(b),
|
||||
): string {
|
||||
if (blob && blob.size > 0) return createObjectUrl(blob);
|
||||
return endpoint;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user