跳转至

useCodingTask reference(useCodingTask 参考文档)

Learn more about the useCodingTask 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 { useCallback, useEffect, useState } from "react";
import useSWR from "swr";
import { useOsdkClient } from "@osdk/react";
import { ITask } from "./useTasks";
import { osdkCodingTask } from "@avanced-to-do-application/sdk";
import type { User } from "@osdk/foundry.admin";
import type { ObjectMetadata } from "@osdk/client";

interface CodingTaskEnriched {
  osdkCodingTask: osdkCodingTask.OsdkInstance;
  createdBy: User;
  assignedTo: User;
}

function useCodingTask(task: ITask) {
    const client = useOsdkClient();
    const [metadata, setMetadata] = useState<ObjectMetadata>();

    // Define the fetcher using useCallback.
    const fetcher = useCallback(async () => {
        // We are using $as to pivot to the osdkCodingTask interface implementation.
        // Note that this is possible because we used `$includeAllBaseObjectProperties: true` when fetching the task in useTasks.
        const codingTask: osdkCodingTask.OsdkInstance = task.osdkTask.$as(osdkCodingTask);
        const codingTaskEnriched: CodingTaskEnriched = {
            osdkCodingTask: codingTask,
            createdBy: task.createdBy,
            assignedTo: task.assignedTo,
        };
        return codingTaskEnriched;
    }, [task]);

    // Only pass the fetcher if the data is not already cached.
    const { data, error, isValidating } = useSWR<CodingTaskEnriched>(
    task.osdkTask.$primaryKey as string,
    fetcher,
    {
        revalidateOnFocus: false,
        revalidateOnReconnect: false,
    }
    );

    // This shows how we read the object type metadata and use the property display name from the ontology.
    const getObjectTypeMetadata = useCallback(async () => {
        const objectTypeMetadata = await client.fetchMetadata(osdkCodingTask);
        setMetadata(objectTypeMetadata);
    }, [client]);

    useEffect(() => {
        getObjectTypeMetadata();
    }, [getObjectTypeMetadata]);


    return {
    codingTask: data,
    isLoading: !data && !error,
    isValidating,
    isError: error,
    metadata,
    };
}

export default useCodingTask;

中文翻译

useCodingTask 参考文档

详细了解 useCodingTask 钩子(Hook)。

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

import { useCallback, useEffect, useState } from "react";
import useSWR from "swr";
import { useOsdkClient } from "@osdk/react";
import { ITask } from "./useTasks";
import { osdkCodingTask } from "@avanced-to-do-application/sdk";
import type { User } from "@osdk/foundry.admin";
import type { ObjectMetadata } from "@osdk/client";

interface CodingTaskEnriched {
  osdkCodingTask: osdkCodingTask.OsdkInstance;
  createdBy: User;
  assignedTo: User;
}

function useCodingTask(task: ITask) {
    const client = useOsdkClient();
    const [metadata, setMetadata] = useState<ObjectMetadata>();

    // 使用 useCallback 定义数据获取器(fetcher)。
    const fetcher = useCallback(async () => {
        // 我们使用 $as 来切换到 osdkCodingTask 接口实现。
        // 请注意,这是可行的,因为我们在 useTasks 中获取任务时使用了 `$includeAllBaseObjectProperties: true`。
        const codingTask: osdkCodingTask.OsdkInstance = task.osdkTask.$as(osdkCodingTask);
        const codingTaskEnriched: CodingTaskEnriched = {
            osdkCodingTask: codingTask,
            createdBy: task.createdBy,
            assignedTo: task.assignedTo,
        };
        return codingTaskEnriched;
    }, [task]);

    // 仅在数据尚未缓存时传递数据获取器(fetcher)。
    const { data, error, isValidating } = useSWR<CodingTaskEnriched>(
    task.osdkTask.$primaryKey as string,
    fetcher,
    {
        revalidateOnFocus: false,
        revalidateOnReconnect: false,
    }
    );

    // 以下代码展示了如何读取对象类型元数据(Object Type Metadata)并使用本体论(Ontology)中的属性显示名称。
    const getObjectTypeMetadata = useCallback(async () => {
        const objectTypeMetadata = await client.fetchMetadata(osdkCodingTask);
        setMetadata(objectTypeMetadata);
    }, [client]);

    useEffect(() => {
        getObjectTypeMetadata();
    }, [getObjectTypeMetadata]);


    return {
    codingTask: data,
    isLoading: !data && !error,
    isValidating,
    isError: error,
    metadata,
    };
}

export default useCodingTask;