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<void> { 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<AssetResource>,): ReadonlyArray<string | null> { 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], );}
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<void> {
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<AssetResource>,
): ReadonlyArray<string | null> {
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],
);
}