|
@@ -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 };
|
|
|
|
|
+}
|