ユースケース開発React アプリケーションのためのOSDKチュートリアル:高度なToDoアプリケーションUseTasksリファレンス

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

useTasks リファレンス

useTasks フックについて詳しくはこちら。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 /* * Copyright 2025 Palantir Technologies, Inc. すべての権利を留保します。 * * Apache License バージョン 2.0(以下「ライセンス」)に基づいてライセンスされます。 * ライセンスに準拠する場合を除き、このファイルを使用することはできません。 * ライセンスの写しは、次の URL から入手できます。 * * http://www.apache.org/licenses/LICENSE-2.0 * * 適用される法律で義務付けられる場合、または書面による合意がある場合を除き、 * ライセンスに基づいて配布されるソフトウェアは「現状有姿」で配布され、 * 明示的か黙示的かを問わず、いかなる種類の保証も条件も付されません。 * 許可に関する具体的な規定およびライセンスに基づく * 制限については、ライセンスを参照してください。 */ import useSWR from "swr"; import { useOsdkClient } from "@osdk/react"; import { OsdkITask } from "@advanced-to-do-application/sdk"; import { IProject } from "./useProjects"; import { useCallback, useEffect, useState } from "react"; import useAdmin from "./useAdmin"; import _ from "lodash"; import type { User } from "@osdk/foundry.admin"; import type { InterfaceMetadata } from "@osdk/api"; export interface ITask { osdkTask: OsdkITask.OsdkInstance; createdBy: User; assignedTo: User; } function useTasks(project: IProject) { const client = useOsdkClient(); const [metadata, setMetadata] = useState<InterfaceMetadata>(); const { getBatchUserDetails } = useAdmin(); // `$includeAllBaseObjectProperties: true,` は、インターフェースの実装を通じてオブジェクトを取得していても、 // ベースオブジェクトのすべてのプロパティを取得することを意味します。$as を使用してベースオブジェクトにピボットするときに、再取得する必要はありません。 const fetcher = useCallback(async () => { const tasksPage = await client(OsdkITask).where({ projectId: { $eq: project.$primaryKey }, }).fetchPage({ $includeAllBaseObjectProperties: true, $orderBy: { "dueDate": "desc", "status": "asc" }, }); // createdBy フィールドのユーザー詳細を取得します。 const createdByIds = _.compact(_.uniq(tasksPage.data.map((task) => task.createdBy))); const createdByUserList = await getBatchUserDetails(createdByIds); // assignedTo フィールドのユーザー詳細を取得します。 const assignedToIds = _.compact(_.uniq(tasksPage.data.map((task) => task.assignedTo))); const assignedToUserList = await getBatchUserDetails(assignedToIds); const tasksList: ITask[] = tasksPage.data.map((task) => ({ osdkTask: task, assignedTo: assignedToUserList[task.assignedTo as string], createdBy: createdByUserList[task.createdBy as string], })); return tasksList; }, [getBatchUserDetails, project.$primaryKey, client]); const { data, isLoading, isValidating, error, mutate } = useSWR<ITask[]>( ["tasks", project.$primaryKey], fetcher, { revalidateOnFocus: false } ); // オブジェクトタイプのメタデータを読み取り、オントロジーのプロパティ表示名を使用する方法を示します。 const getObjectTypeMetadata = useCallback(async () => { const objectTypeMetadata = await client.fetchMetadata(OsdkITask); setMetadata(objectTypeMetadata); }, [client]); useEffect(() => { getObjectTypeMetadata(); }, [getObjectTypeMetadata]); useEffect(() => { // リアルタイムの更新を受信するために、オブジェクトセットを購読します。 const subscription = client(OsdkITask) .where({ projectId: { $eq: project.$primaryKey }, }) .subscribe( { onChange(update) { if (update.state === "ADDED_OR_UPDATED") { // オブジェクトが更新されたか、オブジェクトセットにオブジェクトが追加されました。 const currentObject = data?.find((task) => task.osdkTask.$primaryKey === update.object.$primaryKey); if (currentObject !== undefined) { // createdBy フィールドと assignedTo フィールドのユーザー詳細を取得します。 getBatchUserDetails(_.compact([update.object.createdBy, update.object.assignedTo])).then((userList) => { const updatedObject: ITask = { osdkTask: update.object, assignedTo: userList[update.object.assignedTo as string], createdBy: userList[update.object.createdBy as string], }; // データ内のオブジェクトを新しいオブジェクトに置き換えて、取得せずに変更します。 mutate((currentData: ITask[] | undefined) => { if (!currentData) return []; return currentData.map((task) => task.osdkTask.$primaryKey === update.object.$primaryKey ? updatedObject : task); }, { revalidate: false }); }); } } else if (update.state === "REMOVED") { // データからオブジェクトを取り除いて、取得せずに変更します。 mutate((currentData: ITask[] | undefined) => { if (!currentData) return []; return currentData.filter((task) => task.osdkTask.$primaryKey !== update.object.$primaryKey); }, { revalidate: false }); } }, onSuccessfulSubscription() { // 購読が成功したため、更新の受信が見込まれます。 }, onError(err) { // 購読でエラーが発生したため、以降の更新は受信されません。 console.error(err); }, onOutOfDate() { // すべての変更を追跡できませんでした。セット内のオブジェクトを再読み込みしてください。 }, }, ); return () => { subscription.unsubscribe(); }; },[data, getBatchUserDetails, mutate, project.$primaryKey, client]); return { tasks: data ?? [], isLoading, isValidating, isError: error, metadata, }; } export default useTasks;