use AWS for placeholder images in production

This commit is contained in:
Justin Edmund 2025-12-13 23:26:35 -08:00
parent 9c69db640e
commit 9429ccff53
2 changed files with 19 additions and 10 deletions

View file

@ -42,10 +42,18 @@ export function getBasePath(): string {
/** /**
* Gets the placeholder image for a given type and variant * Gets the placeholder image for a given type and variant
* Placeholders are always served locally * Uses AWS S3/CDN in production, local path in development
*/ */
export function getPlaceholderImage(type: ResourceType, variant: ImageVariant): string { export function getPlaceholderImage(type: ResourceType, variant: ImageVariant): string {
return `/images/placeholders/placeholder-${type}-${variant}.png` return `${getBasePath()}/placeholders/placeholder-${type}-${variant}.png`
}
/**
* Gets a generic placeholder image (weapon-grid variant)
* Used as fallback for misc image types that don't have specific placeholders
*/
export function getGenericPlaceholder(): string {
return `${getBasePath()}/placeholders/placeholder-weapon-grid.png`
} }
/** /**
@ -257,7 +265,7 @@ export function getJobSkillIcon(slug: string | undefined): string {
* Get accessory square image URL * Get accessory square image URL
*/ */
export function getAccessoryImage(granblueId: string | undefined): string { export function getAccessoryImage(granblueId: string | undefined): string {
if (!granblueId) return '/images/placeholders/placeholder-weapon-grid.png' if (!granblueId) return getGenericPlaceholder()
return `${getBasePath()}/accessory-square/${granblueId}.jpg` return `${getBasePath()}/accessory-square/${granblueId}.jpg`
} }
@ -376,7 +384,7 @@ export function getArtifactImage(
granblueId: string | number | null | undefined, granblueId: string | number | null | undefined,
variant: ArtifactImageVariant = 'square' variant: ArtifactImageVariant = 'square'
): string { ): string {
if (!granblueId) return '/images/placeholders/placeholder-weapon-grid.png' if (!granblueId) return getGenericPlaceholder()
const directory = `artifact-${variant}` const directory = `artifact-${variant}`
return `${getBasePath()}/${directory}/${granblueId}.jpg` return `${getBasePath()}/${directory}/${granblueId}.jpg`
} }
@ -387,7 +395,7 @@ export function getArtifactImage(
* Get guidebook image URL * Get guidebook image URL
*/ */
export function getGuidebookImage(granblueId: string | number | undefined): string { export function getGuidebookImage(granblueId: string | number | undefined): string {
if (!granblueId) return '/images/placeholders/placeholder-weapon-grid.png' if (!granblueId) return getGenericPlaceholder()
return `${getBasePath()}/guidebooks/book_${granblueId}.png` return `${getBasePath()}/guidebooks/book_${granblueId}.png`
} }
@ -395,6 +403,6 @@ export function getGuidebookImage(granblueId: string | number | undefined): stri
* Get raid image URL * Get raid image URL
*/ */
export function getRaidImage(slug: string | undefined): string { export function getRaidImage(slug: string | undefined): string {
if (!slug) return '/images/placeholders/placeholder-weapon-grid.png' if (!slug) return getGenericPlaceholder()
return `${getBasePath()}/raids/${slug}.png` return `${getBasePath()}/raids/${slug}.png`
} }

View file

@ -8,6 +8,7 @@
import type { Job, JobSkill } from '$lib/types/api/entities' import type { Job, JobSkill } from '$lib/types/api/entities'
import type { JobSkillList } from '$lib/types/api/party' import type { JobSkillList } from '$lib/types/api/party'
import { getImageBaseUrl } from '$lib/api/adapters/config' import { getImageBaseUrl } from '$lib/api/adapters/config'
import { getGenericPlaceholder } from './images'
/** /**
* Gets the base path for images * Gets the base path for images
@ -32,7 +33,7 @@ export enum Gender {
*/ */
export function getJobPortraitUrl(job: Job | undefined, gender: Gender = Gender.Gran): string { export function getJobPortraitUrl(job: Job | undefined, gender: Gender = Gender.Gran): string {
if (!job) { if (!job) {
return '/images/placeholders/placeholder-weapon-grid.png' return getGenericPlaceholder()
} }
// Convert job name to slug format (lowercase, spaces to hyphens) // Convert job name to slug format (lowercase, spaces to hyphens)
@ -48,7 +49,7 @@ export function getJobPortraitUrl(job: Job | undefined, gender: Gender = Gender.
*/ */
export function getJobFullImageUrl(job: Job | undefined, gender: Gender = Gender.Gran): string { export function getJobFullImageUrl(job: Job | undefined, gender: Gender = Gender.Gran): string {
if (!job) { if (!job) {
return '/images/placeholders/placeholder-weapon-grid.png' return getGenericPlaceholder()
} }
const genderSuffix = gender === Gender.Djeeta ? 'b' : 'a' const genderSuffix = gender === Gender.Djeeta ? 'b' : 'a'
@ -62,7 +63,7 @@ export function getJobFullImageUrl(job: Job | undefined, gender: Gender = Gender
*/ */
export function getJobIconUrl(granblueId: string | undefined): string { export function getJobIconUrl(granblueId: string | undefined): string {
if (!granblueId) { if (!granblueId) {
return '/images/placeholders/placeholder-weapon-grid.png' return getGenericPlaceholder()
} }
return `${getBasePath()}/job-icons/${granblueId}.png` return `${getBasePath()}/job-icons/${granblueId}.png`
@ -74,7 +75,7 @@ export function getJobIconUrl(granblueId: string | undefined): string {
*/ */
export function getJobWideImageUrl(job: Job | undefined, gender: Gender = Gender.Gran): string { export function getJobWideImageUrl(job: Job | undefined, gender: Gender = Gender.Gran): string {
if (!job) { if (!job) {
return '/images/placeholders/placeholder-weapon-grid.png' return getGenericPlaceholder()
} }
const genderSuffix = gender === Gender.Djeeta ? 'b' : 'a' const genderSuffix = gender === Gender.Djeeta ? 'b' : 'a'