UPDATE
This commit is contained in:
@@ -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,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user