HyperView / frontend /src /components /useLabelLegend.ts
morozovdd's picture
feat: add HyperView app for space
23680f2
import { useMemo } from "react";
import type { DatasetInfo, EmbeddingsData } from "@/types";
import {
MAX_DISTINCT_LABEL_COLORS,
buildLabelColorMap,
buildLabelCounts,
buildLabelUniverse,
buildLabelsInfo,
buildLegendLabels,
getDistinctLabelCount,
} from "@/lib/labelLegend";
interface UseLabelLegendArgs {
datasetInfo: DatasetInfo | null;
embeddings: EmbeddingsData | null;
labelSearch?: string;
labelFilter?: string | null;
}
export function useLabelLegend({
datasetInfo,
embeddings,
labelSearch = "",
labelFilter = null,
}: UseLabelLegendArgs) {
const labelCounts = useMemo(() => buildLabelCounts(embeddings), [embeddings]);
const labelUniverse = useMemo(
() => buildLabelUniverse(datasetInfo?.labels ?? [], embeddings?.labels ?? null),
[datasetInfo?.labels, embeddings?.labels]
);
const distinctLabelCount = useMemo(() => {
const fromCounts = getDistinctLabelCount(labelCounts);
if (fromCounts > 0) return fromCounts;
let n = labelUniverse.length;
if (labelUniverse.includes("undefined")) n -= 1;
return n;
}, [labelCounts, labelUniverse]);
const distinctColoringDisabled = distinctLabelCount > MAX_DISTINCT_LABEL_COLORS;
const labelsInfo = useMemo(
() =>
buildLabelsInfo({
datasetLabels: datasetInfo?.labels ?? [],
embeddings,
distinctColoringDisabled,
labelFilter,
}),
[datasetInfo?.labels, embeddings, distinctColoringDisabled, labelFilter]
);
const labelColorMap = useMemo(
() =>
buildLabelColorMap({
labelsInfo,
labelUniverse,
distinctColoringDisabled,
labelFilter,
}),
[labelsInfo, labelUniverse, distinctColoringDisabled, labelFilter]
);
const legendLabels = useMemo(
() =>
buildLegendLabels({
labelUniverse,
labelCounts,
query: labelSearch,
}),
[labelUniverse, labelCounts, labelSearch]
);
return {
labelCounts,
labelUniverse,
distinctLabelCount,
distinctColoringDisabled,
labelsInfo,
labelColorMap,
legendLabels,
};
}