注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
useLearningTask フックは、高度な To-Do アプリケーションで学習タスクデータを取得および管理する機能を提供するカスタム React フックです。基本的なタスクデータに、ユーザー情報、メディアコンテンツ、メタデータを追加します。
このフックは、さまざまなメディアの種類やバイナリコンテンツを処理するパターンを使用し、Result 型によるエラー処理と Blob URL のリソース管理を示します。アプリケーションのオントロジーとシームレスに統合しながら、コンポーネントにシンプルなインターフェースを提供します。
useCallback を使用して関数をメモ化し、不要な再レンダリングを防止useAdmin を通じたバッチリクエストでユーザーデータを効率的に取得useLearningTask の構造Copied!1 2 3 4 5 6 7interface LearningTaskEnriched { osdkLearningTask: osdkLearningTask.OsdkInstance; mediaUrl: string; createdBy: User; assignedTo: User; mediaType: SupportedMediaType; }
このインターフェースは、SDK の学習タスクインスタンスに、ユーザーオブジェクト、メディアコンテンツの URL、検出されたメディアの種類を組み合わせ、コンポーネント用の包括的なデータ構造を作成します。
useLearningTask フックは、SWR のデータ取得機能と、次の処理を行うカスタム取得関数を使用します。
fetchOneWithErrors を使用して特定の学習タスクをクエリし、堅牢なエラー処理を実現しますmediaReference が存在する場合は、バイナリコンテンツを取得して Blob URL を作成しますcontentUrl が存在する場合は、外部リンクとして使用しますLearningTaskEnriched 構造にまとめますCopied!1 2 3 4 5 6const fetcher = useCallback(async () => { const learningTaskResult = await client(osdkLearningTask).fetchOneWithErrors(task.osdkTask.$primaryKey as string); // エラー処理とデータ処理 // ... return learningTaskEnriched; }, [client, task.osdkTask.$primaryKey, getBatchUserDetails]);
このフックには、MIME タイプからメディアの種類を特定するヘルパー関数が含まれています。
Copied!1 2 3 4 5 6 7 8const getMediaTypeFromMimeType = (mimeType: string): SupportedMediaType => { if (/application\/pdf/.test(mimeType)) { return SupportedMediaType.PDF; } else if (/image\/(jpeg|png|gif)/.test(mimeType)) { return SupportedMediaType.IMAGE; } // ...その他の種類の検出 };
このユーティリティは正規表現を使用して MIME タイプを一般的なメディア形式と照合し、さまざまな種類の学習コンテンツを一貫した方法で分類します。
useLearningTask フックは、次の構造を持つオブジェクトを返します。
Copied!1 2 3 4 5 6 7{ learningTask: LearningTaskEnriched | undefined; // 情報が付加された学習タスク(読み込まれていない場合は undefined) isLoading: boolean; // 初回のデータ読み込み中は true isValidating: boolean; // バックグラウンドでの再検証中は true isError: any; // リクエストに失敗した場合のエラーオブジェクト metadata: ObjectMetadata | undefined; // 学習タスクのオブジェクトタイプに関するメタデータ }
useLearningTask フックは、さまざまな種類のメディアを表す文字列リテラルの共用体型を定義します。
Copied!1 2 3 4 5 6 7 8 9export const SupportedMediaType = { PDF: "PDF", IMAGE: "IMAGE", LINK: "LINK", VIDEO: "VIDEO", NONE: "NONE" } as const; export type SupportedMediaType = typeof SupportedMediaType[keyof typeof SupportedMediaType];
このフックは、エラー処理にオントロジー SDK の Result 型を使用します。
Copied!1 2 3 4 5 6 7const learningTaskResult: Result<Osdk.Instance<osdkLearningTask>> = await client(osdkLearningTask).fetchOneWithErrors(task.osdkTask.$primaryKey as string); if (learningTaskResult.error) { throw new Error(learningTaskResult.error.message); } const learningTask = learningTaskResult.value;
このパターンは次の処理を行います。
このフックは、メディアコンテンツの Blob URL を管理します。
Copied!1 2 3const response = await learningTask.mediaReference.fetchContents(); const blob: Blob | undefined = await response.blob(); const mediaUrl = blob ? URL.createObjectURL(blob) : "";
このパターンは次の処理を行います。
次の外部パッケージを useLearningTask フックと併用できます。
用途: データ取得、キャッシュ、状態管理 利点:
用途: バックエンドのデータサービスとやり取りするためのオントロジー SDK クライアント 利点:
useOsdkClient などのフックを公開します用途: 事前定義されたデータ型を持つ、アプリケーション固有の SDK 利点:
osdkLearningTask)を含みます用途: ユーザーデータ型用の Foundry Admin SDK
利点:
createdBy フィールドと assignedTo フィールドで使用する User 型を提供します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 88import useLearningTask, { SupportedMediaType } from '../dataServices/useLearningTask'; import type { ITask } from '../dataServices/useTasks'; function LearningTaskViewer({ task }: { task: ITask }) { const { learningTask, isLoading, isError, metadata } = useLearningTask(task); if (isLoading) return <div>Loading learning materials...</div>; if (isError) return <div>Error loading content: {isError.message}</div>; if (!learningTask) return <div>No learning content available</div>; // メディアの種類に応じて適切に表示します const renderMedia = () => { switch (learningTask.mediaType) { case SupportedMediaType.PDF: return ( <div className="pdf-viewer"> <iframe src={`${learningTask.mediaUrl}#toolbar=0`} title="PDF Content" width="100%" height="500px" /> </div> ); case SupportedMediaType.IMAGE: return ( <div className="image-viewer"> <img src={learningTask.mediaUrl} alt="Learning content" className="learning-image" /> </div> ); case SupportedMediaType.VIDEO: return ( <div className="video-player"> <video src={learningTask.mediaUrl} controls width="100%" /> </div> ); case SupportedMediaType.LINK: return ( <div className="external-link"> <a href={learningTask.mediaUrl} target="_blank" rel="noopener noreferrer" > Open learning resource </a> </div> ); default: return <div>No media content available</div>; } }; return ( <div className="learning-task-viewer"> <h2>{learningTask.osdkLearningTask.title}</h2> <div className="content-section"> <div className="content-type-badge">{learningTask.mediaType}</div> {renderMedia()} </div> <div className="description-section"> <h3>Description</h3> <p>{learningTask.osdkLearningTask.description || "No description provided"}</p> </div> <div className="people-section"> <div className="assigned-to"> <span>Assigned to: </span> <span>{learningTask.assignedTo?.username ?? "Unassigned"}</span> </div> <div className="created-by"> <span>Created by: </span> <span>{learningTask.createdBy?.username ?? "Unknown"}</span> </div> </div> </div> ); }
useLearningTask フックを使用する前に、次のシナリオと制限事項を考慮してください。
URL.revokeObjectURL() で解放してください。NONE ですが、一部の特殊なメディア形式には適切でない場合があります。