46 lines · 1.7 KB · TypeScript
RawDownload
import { useAtomValue } from "@effect/atom-react";import { createAssetEnvironmentAtoms, resolveAssetUrl } from "@t3tools/client-runtime/state/assets";import type { AssetResource, EnvironmentId } from "@t3tools/contracts";import { AsyncResult, Atom } from "effect/unstable/reactivity"; import { connectionAtomRuntime } from "../connection/runtime";import { usePreparedConnection } from "./session"; export const assetEnvironment = createAssetEnvironmentAtoms(connectionAtomRuntime); const EMPTY_ASSET_URL_ATOM = Atom.make(AsyncResult.initial<never, never>(false)).pipe(  Atom.withLabel("mobile-asset-url:empty"),); export type AssetUrlState =  | { readonly _tag: "Loading" }  | { readonly _tag: "Failure" }  | { readonly _tag: "Success"; readonly url: string }; 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 } }),  );  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 };} export function useAssetUrl(  environmentId: EnvironmentId | null,  resource: AssetResource | null,): string | null {  const state = useAssetUrlState(environmentId, resource);  return state._tag === "Success" ? state.url : null;}