import { Asset, Resource } from "@noya-app/noya-schemas"; import type { NoyaManager } from "./NoyaManager"; import { getResourceTransformUrl } from "./ResourceManager"; export type ResourceUrlOptions = { inputs?: Record; }; export function getResourceUrl( idOrStableId: string, resources: Resource[], assets: Asset[], options?: ResourceUrlOptions ): string | undefined { const resource = resources.find( (item) => item.id === idOrStableId || item.stableId === idOrStableId ); if (!resource) return undefined; if (resource.transformUrl) { if (options?.inputs !== undefined) { return getResourceTransformUrl(resource, { format: "image", inputs: options.inputs, }); } return ( resource.url ?? getResourceTransformUrl(resource, { format: "image", }) ); } if (resource.type !== "asset") return resource.url; const asset = assets.find( (item) => item.id === resource.assetId || item.stableId === resource.assetId ); return asset?.url ?? resource.url; } export async function resolveResource( idOrStableId: string, noyaManager: NoyaManager ) { let resources = noyaManager.resourceManager.optimisticResources$.get(); let resource = resources.find( (item) => item.id === idOrStableId || item.stableId === idOrStableId ); if (!resource) { const refreshedResources = await noyaManager.resourceManager.listResources(); noyaManager.resourceManager.setResources(refreshedResources); resources = noyaManager.resourceManager.optimisticResources$.get(); resource = resources.find( (item) => item.id === idOrStableId || item.stableId === idOrStableId ); } if (!resource) { throw new Error(`Resource not found: ${idOrStableId}`); } const asset = resource.type === "asset" ? noyaManager.assetManager.read(resource.assetId) : undefined; const url = getResourceUrl( resource.stableId, resources, noyaManager.assetManager.assets$.get() ); if (!url) { throw new Error(`Resource URL not found: ${idOrStableId}`); } return { asset, resource, url }; }