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;