71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
import { useCallback, useEffect, useState } from "react";
|
|
import { useSearchParams } from "react-router-dom";
|
|
import type { ApiSettings } from "../../../types";
|
|
import {
|
|
getCampaignWorkspace
|
|
} from "../../../api/campaigns";
|
|
import type { CampaignWorkspaceData } from "../utils/campaignView";
|
|
|
|
const initialData: CampaignWorkspaceData = {
|
|
campaign: null,
|
|
versions: [],
|
|
currentVersion: null,
|
|
summary: null
|
|
};
|
|
|
|
type UseCampaignWorkspaceDataOptions = {
|
|
includeCurrentVersion?: boolean;
|
|
includeSummary?: boolean;
|
|
includeVersions?: boolean;
|
|
};
|
|
|
|
export function useCampaignWorkspaceData(
|
|
settings: ApiSettings,
|
|
campaignId: string,
|
|
options: UseCampaignWorkspaceDataOptions = {}
|
|
) {
|
|
const {
|
|
includeCurrentVersion = true,
|
|
includeSummary = false,
|
|
includeVersions = false
|
|
} = options;
|
|
const [searchParams] = useSearchParams();
|
|
const selectedVersionId = searchParams.get("version");
|
|
const [data, setData] = useState<CampaignWorkspaceData>(initialData);
|
|
const [loading, setLoading] = useState(false);
|
|
const [error, setError] = useState("");
|
|
|
|
const reload = useCallback(async () => {
|
|
if (!campaignId) return;
|
|
setLoading(true);
|
|
setError("");
|
|
try {
|
|
const shouldLoadVersions = includeCurrentVersion || includeVersions;
|
|
const response = await getCampaignWorkspace(settings, campaignId, {
|
|
versionId: selectedVersionId,
|
|
includeCurrentVersion,
|
|
includeSummary,
|
|
includeVersions: shouldLoadVersions,
|
|
});
|
|
|
|
setData({
|
|
campaign: response.campaign,
|
|
versions: response.versions,
|
|
currentVersion: response.current_version,
|
|
summary: response.summary
|
|
});
|
|
} catch (err) {
|
|
setData(initialData);
|
|
setError(err instanceof Error ? err.message : String(err));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [settings, campaignId, includeCurrentVersion, includeSummary, includeVersions, selectedVersionId]);
|
|
|
|
useEffect(() => {
|
|
reload();
|
|
}, [reload]);
|
|
|
|
return { data, loading, error, reload, setError };
|
|
}
|