跳转至

useAdmin reference(useAdmin 参考文档)

Learn more about the useAdmin hook.

/*
 * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import useSWR, { mutate, useSWRConfig } from "swr";
import type { State } from "swr";
import { useOsdkClient } from "@osdk/react";
import { getCurrent, profilePicture, getBatch } from "@osdk/foundry.admin/User";
import { useCallback } from "react";
import type { User } from "@osdk/foundry.admin";

interface UserDetails {
  [key: string]: User;
}

function useAdmin() {
  const client = useOsdkClient();
  const { cache } = useSWRConfig();

  const getCurrentUserDetails = useCallback(
    async () => {
      const user: User = await getCurrent(client);
      return {
        "currentUser": user
      };
    }, [client]
  );
  const getCurrentProfilePictureUrl: (user: User) => Promise<string> =
    useCallback(
      async (user) => {
        const profilePictureResponse = await profilePicture(client, user.id)
        const blob = await profilePictureResponse.blob();
        return URL.createObjectURL(blob);
      }, [client]
    );

  const { data, isLoading, isValidating, error } = useSWR<UserDetails>(
    "currentUser",
    getCurrentUserDetails,
    { revalidateOnFocus: false }
  );

  const getBatchUserDetails: (userIds: string[]) => Promise<UserDetails> =
    useCallback(async (userIds) => {
        const cachedUsers: UserDetails = {};
        const usersToFetch: string[] = [];

        userIds.forEach((userId) => {
          const cachedUser: State<unknown, unknown> | undefined = cache.get(`user-${userId}`);
          if (cachedUser && cachedUser.data) {
            cachedUsers[userId] = cachedUser.data as User;
          } else {
            usersToFetch.push(userId);
          }
        });

        if (usersToFetch.length > 0) {
          const usersRequest = await getBatch(client, usersToFetch.map((userId) => ({ userId })));
          Object.entries(usersRequest.data).forEach(([userId, user]) => {
            cachedUsers[userId] = user;
            mutate(`user-${userId}`, user, { revalidate: false });
          });
        }
        return cachedUsers;
      }, [cache, client]
    );

  return {
    users: data,
    currentUser: data != null ? data["currentUser"]: undefined,
    isLoading,
    isValidating,
    isError: error,
    getBatchUserDetails,
    getCurrentProfilePictureUrl
  };
}

export default useAdmin;

中文翻译

useAdmin 参考文档

了解更多关于 useAdmin 钩子(Hook)的信息。

/*
 * 版权所有 2025 Palantir Technologies, Inc. 保留所有权利。
 *
 * 根据 Apache 许可证 2.0 版("许可证")授权;
 * 除非遵守许可证,否则您不得使用此文件。
 * 您可以在以下网址获取许可证副本:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * 除非适用法律要求或书面同意,否则根据许可证分发的软件
 * 均按"原样"分发,不附带任何明示或暗示的保证或条件。
 * 有关许可证下的特定语言 governing permissions and
 * 限制,请参阅许可证。
 */

import useSWR, { mutate, useSWRConfig } from "swr";
import type { State } from "swr";
import { useOsdkClient } from "@osdk/react";
import { getCurrent, profilePicture, getBatch } from "@osdk/foundry.admin/User";
import { useCallback } from "react";
import type { User } from "@osdk/foundry.admin";

interface UserDetails {
  [key: string]: User;
}

function useAdmin() {
  const client = useOsdkClient();
  const { cache } = useSWRConfig();

  const getCurrentUserDetails = useCallback(
    async () => {
      const user: User = await getCurrent(client);
      return {
        "currentUser": user
      };
    }, [client]
  );
  const getCurrentProfilePictureUrl: (user: User) => Promise<string> =
    useCallback(
      async (user) => {
        const profilePictureResponse = await profilePicture(client, user.id)
        const blob = await profilePictureResponse.blob();
        return URL.createObjectURL(blob);
      }, [client]
    );

  const { data, isLoading, isValidating, error } = useSWR<UserDetails>(
    "currentUser",
    getCurrentUserDetails,
    { revalidateOnFocus: false }
  );

  const getBatchUserDetails: (userIds: string[]) => Promise<UserDetails> =
    useCallback(async (userIds) => {
        const cachedUsers: UserDetails = {};
        const usersToFetch: string[] = [];

        userIds.forEach((userId) => {
          const cachedUser: State<unknown, unknown> | undefined = cache.get(`user-${userId}`);
          if (cachedUser && cachedUser.data) {
            cachedUsers[userId] = cachedUser.data as User;
          } else {
            usersToFetch.push(userId);
          }
        });

        if (usersToFetch.length > 0) {
          const usersRequest = await getBatch(client, usersToFetch.map((userId) => ({ userId })));
          Object.entries(usersRequest.data).forEach(([userId, user]) => {
            cachedUsers[userId] = user;
            mutate(`user-${userId}`, user, { revalidate: false });
          });
        }
        return cachedUsers;
      }, [cache, client]
    );

  return {
    users: data,
    currentUser: data != null ? data["currentUser"]: undefined,
    isLoading,
    isValidating,
    isError: error,
    getBatchUserDetails,
    getCurrentProfilePictureUrl
  };
}

export default useAdmin;