import { useAtomValue } from "@effect/atom-react"; import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; import type { AssetResource, EnvironmentId } from "@t3tools/contracts"; import { AsyncResult } from "effect/unstable/reactivity"; import { useMemo } from "react"; import { assetEnvironment } from "~/state/assets"; import { usePreparedConnection } from "~/state/session"; export { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; export type AssetUrlState = | { readonly _tag: "Loading" } | { readonly _tag: "Failure" } | { readonly _tag: "Success"; readonly url: string; readonly sourcePath?: string }; export function useAssetUrlState( environmentId: EnvironmentId, resource: AssetResource, ): AssetUrlState { const preparedConnection = usePreparedConnection(environmentId); const result = useAtomValue( assetEnvironment.createUrl({ environmentId, input: { resource }, }), ); if (result._tag === "Failure") { return { _tag: "Failure" }; } if (preparedConnection._tag === "None" || result._tag !== "Success") { return { _tag: "Loading" }; } const url = resolveAssetUrl(preparedConnection.value.httpBaseUrl, result.value.relativeUrl); return url === null ? { _tag: "Failure" } : { _tag: "Success", url, ...(result.value.sourcePath !== undefined ? { sourcePath: result.value.sourcePath } : {}), }; } export function useAssetUrl(environmentId: EnvironmentId, resource: AssetResource): string | null { const result = useAssetUrlState(environmentId, resource); if (result._tag !== "Success") { return null; } return result.url; } export function useAssetUrls( environmentId: EnvironmentId, resources: ReadonlyArray, ): ReadonlyArray { const preparedConnection = usePreparedConnection(environmentId); const results = useAtomValue( assetEnvironment.createUrls({ environmentId, resources, }), ); return useMemo( () => preparedConnection._tag === "None" ? resources.map(() => null) : results.map((result) => AsyncResult.isSuccess(result) ? resolveAssetUrl(preparedConnection.value.httpBaseUrl, result.value.relativeUrl) : null, ), [preparedConnection, resources, results], ); }