74 lines · 2.3 KB · TypeScript
RawDownload
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<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],  );}