import { useAtomValue } from "@effect/atom-react"; import { type AssetUrlState, assetUrlStateFromResult, EMPTY_ASSET_URL_ATOM, resolveAssetUrl, } from "@t3tools/client-runtime/state/assets"; import { squashAtomCommandFailure } from "@t3tools/client-runtime/state/runtime"; import type { AssetResource, EnvironmentId } from "@t3tools/contracts"; import { AsyncResult } from "effect/unstable/reactivity"; import { useCallback, useMemo } from "react"; import { assetEnvironment } from "~/state/assets"; import { usePreparedConnection } from "~/state/session"; import { useAtomQueryRunner } from "~/state/use-atom-query-runner"; export { resolveAssetUrl, type AssetUrlState } from "@t3tools/client-runtime/state/assets"; export function useAssetUrlState( environmentId: EnvironmentId | null, resource: AssetResource | null, ): AssetUrlState { const preparedConnection = usePreparedConnection(environmentId); const result = useAtomValue( environmentId === null || resource === null ? EMPTY_ASSET_URL_ATOM : assetEnvironment.createUrl({ environmentId, input: { resource } }), ); return assetUrlStateFromResult( result, preparedConnection._tag === "Some" ? preparedConnection.value.httpBaseUrl : null, ); } export function useAssetUrlRefresh( environmentId: EnvironmentId | null, resource: AssetResource | null, ): () => Promise { const refresh = useAtomQueryRunner(assetEnvironment.createUrl, { reportFailure: false, refresh: true, }); return useCallback(async () => { if (environmentId === null || resource === null) return; const result = await refresh({ environmentId, input: { resource } }); if (result._tag === "Failure") throw squashAtomCommandFailure(result); }, [environmentId, resource, refresh]); } 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], ); }