Преглед изворни кода

RHL-024 refactor(search): implement useSearchBranches hook for fetching branch list

Code_Uwe пре 3 недеља
родитељ
комит
2388e98e9b
1 измењених фајлова са 73 додато и 0 уклоњено
  1. 73 0
      lib/frontend/search/useSearchBranches.js

+ 73 - 0
lib/frontend/search/useSearchBranches.js

@@ -0,0 +1,73 @@
+"use client";
+
+import React from "react";
+import { getBranches } from "@/lib/frontend/apiClient";
+
+export const BRANCH_LIST_STATE = Object.freeze({
+	IDLE: "idle",
+	LOADING: "loading",
+	READY: "ready",
+	ERROR: "error",
+});
+
+/**
+ * useSearchBranches
+ *
+ * Purpose:
+ * - Fetch the list of branches for admin/dev users (used by the Search multi-select UI).
+ *
+ * UX policy:
+ * - Fail open: if loading fails, the rest of the Search UI must still work.
+ * - Branch users never need this list.
+ *
+ * @param {{ enabled: boolean }} args
+ * @returns {{ status: "idle"|"loading"|"ready"|"error", branches: string[]|null, retry: () => void }}
+ */
+export function useSearchBranches({ enabled }) {
+	const [status, setStatus] = React.useState(
+		enabled ? BRANCH_LIST_STATE.LOADING : BRANCH_LIST_STATE.IDLE
+	);
+	const [branches, setBranches] = React.useState(null);
+
+	const [retryTick, setRetryTick] = React.useState(0);
+
+	const retry = React.useCallback(() => {
+		setRetryTick((n) => n + 1);
+	}, []);
+
+	React.useEffect(() => {
+		if (!enabled) {
+			setStatus(BRANCH_LIST_STATE.IDLE);
+			setBranches(null);
+			return;
+		}
+
+		let cancelled = false;
+
+		setStatus(BRANCH_LIST_STATE.LOADING);
+		setBranches(null);
+
+		(async () => {
+			try {
+				const res = await getBranches();
+				if (cancelled) return;
+
+				const list = Array.isArray(res?.branches) ? res.branches : [];
+				setBranches(list);
+				setStatus(BRANCH_LIST_STATE.READY);
+			} catch (err) {
+				if (cancelled) return;
+
+				console.error("[useSearchBranches] getBranches failed:", err);
+				setBranches(null);
+				setStatus(BRANCH_LIST_STATE.ERROR);
+			}
+		})();
+
+		return () => {
+			cancelled = true;
+		};
+	}, [enabled, retryTick]);
+
+	return { status, branches, retry };
+}