"use client";
import { useMemo } from "react";
import { ApiDataInterface } from "../../core/interfaces/ApiDataInterface";
import { ApiRequestDataTypeInterface } from "../../core/interfaces/ApiRequestDataTypeInterface";
import { JsonApiHydratedDataInterface } from "../../core/interfaces/JsonApiHydratedDataInterface";
import { RehydrationFactory } from "../../core/factories/RehydrationFactory";
/**
* Hook to rehydrate server-passed data into typed objects.
* Use this when passing data from server components to client components.
*
* @example
* ```tsx
* // In server component
* const article = await ArticleService.findOne(id);
* return ;
*
* // In client component
* function ArticleDetails({ data }: { data: JsonApiHydratedDataInterface }) {
* const article = useRehydration(Modules.Article, data);
* return {article.title}
;
* }
* ```
*/
export function useRehydration(
classKey: ApiRequestDataTypeInterface,
data: JsonApiHydratedDataInterface | null | undefined,
): T | null {
return useMemo(() => {
if (!data) return null;
return RehydrationFactory.rehydrate(classKey, data);
}, [classKey, data]);
}
/**
* Hook to rehydrate a list of server-passed data into typed objects.
*/
export function useRehydrationList(
classKey: ApiRequestDataTypeInterface,
data: JsonApiHydratedDataInterface[] | null | undefined,
): T[] {
return useMemo(() => {
if (!data || data.length === 0) return [];
return RehydrationFactory.rehydrateList(classKey, data);
}, [classKey, data]);
}