Files
Frontend/src/hooks/useFarmHub.ts
T
2026-04-11 03:50:23 +03:30

130 lines
3.1 KiB
TypeScript

"use client";
import { useCallback, useEffect, useState } from "react";
export const FARM_HUB_STORAGE_KEY = "farm_hub";
const LEGACY_SENSOR_HUB_STORAGE_KEY = "sensor_hub";
const FARM_HUB_UPDATED_EVENT = "farm-hub-updated";
export interface FarmHubInfo {
farm_uuid: string;
id?: string;
name?: string;
is_active?: boolean;
[key: string]: unknown;
}
export interface UseFarmHubReturn {
farmHub: FarmHubInfo | null;
hasFarmHub: boolean;
setFarmHub: (data: FarmHubInfo | null) => void;
getFarmUuid: () => string | null;
}
const normalizeFarmHub = (raw: unknown): FarmHubInfo | null => {
if (!raw || typeof raw !== "object") {
return null;
}
const candidate = raw as Record<string, unknown>;
const farmUuid =
typeof candidate.farm_uuid === "string"
? candidate.farm_uuid
: typeof candidate.id === "string"
? candidate.id
: null;
if (!farmUuid) {
return null;
}
return {
...candidate,
farm_uuid: farmUuid,
id: typeof candidate.id === "string" ? candidate.id : farmUuid,
} as FarmHubInfo;
};
const parseFarmHub = (raw: string | null): FarmHubInfo | null => {
if (!raw) return null;
try {
return normalizeFarmHub(JSON.parse(raw));
} catch {
return null;
}
};
export const getStoredFarmHub = (): FarmHubInfo | null => {
if (typeof window === "undefined") return null;
return (
parseFarmHub(localStorage.getItem(FARM_HUB_STORAGE_KEY)) ??
parseFarmHub(localStorage.getItem(LEGACY_SENSOR_HUB_STORAGE_KEY))
);
};
export const getStoredFarmUuid = (): string | null =>
getStoredFarmHub()?.farm_uuid ?? null;
export const useFarmHub = (): UseFarmHubReturn => {
const [farmHub, setFarmHubState] = useState<FarmHubInfo | null>(null);
useEffect(() => {
const syncFarmHub = () => {
setFarmHubState(getStoredFarmHub());
};
const handleStorage = (event: StorageEvent) => {
if (
event.key === null ||
event.key === FARM_HUB_STORAGE_KEY ||
event.key === LEGACY_SENSOR_HUB_STORAGE_KEY
) {
syncFarmHub();
}
};
syncFarmHub();
window.addEventListener("storage", handleStorage);
window.addEventListener(FARM_HUB_UPDATED_EVENT, syncFarmHub);
return () => {
window.removeEventListener("storage", handleStorage);
window.removeEventListener(FARM_HUB_UPDATED_EVENT, syncFarmHub);
};
}, []);
const setFarmHub = useCallback((data: FarmHubInfo | null) => {
if (typeof window === "undefined") return;
if (data === null) {
localStorage.removeItem(FARM_HUB_STORAGE_KEY);
setFarmHubState(null);
window.dispatchEvent(new Event(FARM_HUB_UPDATED_EVENT));
return;
}
const normalized = normalizeFarmHub(data);
if (!normalized) {
return;
}
localStorage.setItem(FARM_HUB_STORAGE_KEY, JSON.stringify(normalized));
setFarmHubState(normalized);
window.dispatchEvent(new Event(FARM_HUB_UPDATED_EVENT));
}, []);
const getFarmUuid = useCallback(() => {
return farmHub?.farm_uuid ?? getStoredFarmUuid();
}, [farmHub]);
return {
farmHub,
hasFarmHub: farmHub !== null,
setFarmHub,
getFarmUuid,
};
};