This commit is contained in:
2026-04-02 23:44:24 +03:30
parent 9af6f7f36f
commit 76fd2a29f8
27 changed files with 632 additions and 294 deletions
+105
View File
@@ -0,0 +1,105 @@
"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,
};
};