106 lines
2.4 KiB
TypeScript
106 lines
2.4 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";
|
|
|
|
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(() => {
|
|
setFarmHubState(getStoredFarmHub());
|
|
}, []);
|
|
|
|
const setFarmHub = useCallback((data: FarmHubInfo | null) => {
|
|
if (typeof window === "undefined") return;
|
|
|
|
if (data === null) {
|
|
localStorage.removeItem(FARM_HUB_STORAGE_KEY);
|
|
setFarmHubState(null);
|
|
return;
|
|
}
|
|
|
|
const normalized = normalizeFarmHub(data);
|
|
|
|
if (!normalized) {
|
|
return;
|
|
}
|
|
|
|
localStorage.setItem(FARM_HUB_STORAGE_KEY, JSON.stringify(normalized));
|
|
setFarmHubState(normalized);
|
|
}, []);
|
|
|
|
const getFarmUuid = useCallback(() => {
|
|
return farmHub?.farm_uuid ?? getStoredFarmUuid();
|
|
}, [farmHub]);
|
|
|
|
return {
|
|
farmHub,
|
|
hasFarmHub: farmHub !== null,
|
|
setFarmHub,
|
|
getFarmUuid,
|
|
};
|
|
};
|