跳转至

useProjects reference(useProjects 参考文档)

Learn more about the useProjects 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 { AdvanceTodoProject } from "@advanced-to-do-application/sdk";
import { useCallback } from "react";
import useSWR from "swr";
import { useOsdkClient } from "@osdk/react";
import type { Osdk, PropertyKeys } from "@osdk/client";

export type IProject = Osdk.Instance<AdvanceTodoProject, never, PropertyKeys<AdvanceTodoProject>> & {
  numberOfTasks: number,
  numberOfCompletedTasks: number,
  numberOfInProgressTasks: number,
  numberOfNotStartedTasks: number,
}

function useProjects() {
  const client = useOsdkClient();
  const fetcher = useCallback(async () => {
    // We are using runtime-derived properties (RDP) on the concrete links as an example.
    // In the future, we might convert this to operate on the interface so the project does not need to know about the concrete links.
    const projectsPage = await client(AdvanceTodoProject)
            .withProperties({
        "numberOfCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").aggregate("$count"),
        "numberOfCompletedCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").where({
            "status": { $eq: "COMPLETED" },
            }).aggregate("$count"),
        "numberOfInProgressCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").where({
            "status": { $eq: "IN PROGRESS" },
            }).aggregate("$count"),
        "numberOfNotStartedCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").where({
            "status": { $eq: "NOT STARTED" },
            }).aggregate("$count"),
        "numberOfLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").aggregate("$count"),
        "numberOfCompletedLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").where({
            "status": { $eq: "COMPLETED" },
            }).aggregate("$count"),
        "numberOfInProgressLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").where({
            "status": { $eq: "IN PROGRESS" },
            }).aggregate("$count"),
        "numberOfNotStartedLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").where({
            "status": { $eq: "NOT STARTED" },
            }).aggregate("$count")
        })
      .fetchPage();
      const projects: IProject[] = projectsPage.data.map((project) => {
        return {
        ...project,
        numberOfTasks: Number(project.numberOfCodingTasks) + Number(project.numberOfLearningTasks),
        numberOfCompletedTasks: Number(project.numberOfCompletedCodingTasks) + Number(project.numberOfCompletedLearningTasks),
        numberOfInProgressTasks: Number(project.numberOfInProgressCodingTasks) + Number(project.numberOfInProgressLearningTasks),
        numberOfNotStartedTasks: Number(project.numberOfNotStartedCodingTasks) + Number(project.numberOfNotStartedLearningTasks),
      }});
      return projects;
    }, [client]);
  const { data, isLoading, isValidating, error } = useSWR<IProject[]>(
    "projects",
    fetcher,
    { revalidateOnFocus: false }
  );

  return {
    projects: data ?? [],
    isLoading,
    isValidating,
    isError: error,
  };
}

export default useProjects;

中文翻译

useProjects 参考文档

了解更多关于 useProjects 钩子(hook)的信息。

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

import { AdvanceTodoProject } from "@advanced-to-do-application/sdk";
import { useCallback } from "react";
import useSWR from "swr";
import { useOsdkClient } from "@osdk/react";
import type { Osdk, PropertyKeys } from "@osdk/client";

export type IProject = Osdk.Instance<AdvanceTodoProject, never, PropertyKeys<AdvanceTodoProject>> & {
  numberOfTasks: number,
  numberOfCompletedTasks: number,
  numberOfInProgressTasks: number,
  numberOfNotStartedTasks: number,
}

function useProjects() {
  const client = useOsdkClient();
  const fetcher = useCallback(async () => {
    // 我们以具体链接上的运行时派生属性(RDP)为例。
    // 未来,我们可能会将其转换为在接口上操作,这样项目就不需要了解具体链接。
    const projectsPage = await client(AdvanceTodoProject)
            .withProperties({
        "numberOfCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").aggregate("$count"),
        "numberOfCompletedCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").where({
            "status": { $eq: "COMPLETED" },
            }).aggregate("$count"),
        "numberOfInProgressCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").where({
            "status": { $eq: "IN PROGRESS" },
            }).aggregate("$count"),
        "numberOfNotStartedCodingTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("codingTasks").where({
            "status": { $eq: "NOT STARTED" },
            }).aggregate("$count"),
        "numberOfLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").aggregate("$count"),
        "numberOfCompletedLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").where({
            "status": { $eq: "COMPLETED" },
            }).aggregate("$count"),
        "numberOfInProgressLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").where({
            "status": { $eq: "IN PROGRESS" },
            }).aggregate("$count"),
        "numberOfNotStartedLearningTasks": (baseObjectSet) =>
          baseObjectSet.pivotTo("learningTasks").where({
            "status": { $eq: "NOT STARTED" },
            }).aggregate("$count")
        })
      .fetchPage();
      const projects: IProject[] = projectsPage.data.map((project) => {
        return {
        ...project,
        numberOfTasks: Number(project.numberOfCodingTasks) + Number(project.numberOfLearningTasks),
        numberOfCompletedTasks: Number(project.numberOfCompletedCodingTasks) + Number(project.numberOfCompletedLearningTasks),
        numberOfInProgressTasks: Number(project.numberOfInProgressCodingTasks) + Number(project.numberOfInProgressLearningTasks),
        numberOfNotStartedTasks: Number(project.numberOfNotStartedCodingTasks) + Number(project.numberOfNotStartedLearningTasks),
      }});
      return projects;
    }, [client]);
  const { data, isLoading, isValidating, error } = useSWR<IProject[]>(
    "projects",
    fetcher,
    { revalidateOnFocus: false }
  );

  return {
    projects: data ?? [],
    isLoading,
    isValidating,
    isError: error,
  };
}

export default useProjects;