import { jsxs as I, jsx as a, Fragment as Z } from "react/jsx-runtime"; import { useState as v, useRef as N, useEffect as C, useCallback as E, createContext as $, useMemo as _, useContext as P } from "react"; import { HStack as k, IconButton as K, Button as R, Input as L, Text as S, Spinner as ee } from "@chakra-ui/react"; import { IoChevronForwardOutline as O, IoChevronBackOutline as W } from "react-icons/io5"; import te from "keycloak-js"; import { useQuery as ne } from "@tanstack/react-query"; import re from "axios"; const De = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => String(e).replace(/\d/g, (t) => "۰۱۲۳۴۵۶۷۸۹"[Number(t)]), D = (e) => String(e).replace(/[۰-۹]/g, (n) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(n))), Ke = ({ currentPage: e, totalPages: t, totalCount: n, onPageChange: l }) => { const [c, s] = v(p(e)), [i, o] = v(!1), [d, u] = v(null), b = N(null), y = [.../* @__PURE__ */ new Set([1, e, t])].filter( (r) => r >= 1 && r <= t ); C(() => { if (d !== null) { e === d && (u(null), o(!1), s(p(e))); return; } i || s(p(e)); }, [e, i, d]), C(() => { if (!i || !c || d !== null) return; const r = parseInt(D(c), 10); if (isNaN(r)) return; const h = setTimeout(() => { var w; const m = Math.min(Math.max(r, 1), t); m !== e ? (u(m), s(p(m)), l(m)) : (o(!1), s(p(e))), (w = b.current) == null || w.blur(); }, 1e3); return () => clearTimeout(h); }, [ c, i, d, t, e, l ]); const A = () => { var m, w; const r = parseInt(D(c), 10); if (isNaN(r)) { s(p(e)), o(!1), u(null), (m = b.current) == null || m.blur(); return; } const h = Math.min(Math.max(r, 1), t); h !== e ? (u(h), s(p(h)), l(h)) : (s(p(e)), o(!1), u(null)), (w = b.current) == null || w.blur(); }; return t === 0 || !n ? null : /* @__PURE__ */ I( k, { justifyContent: "space-around", backgroundColor: "white", py: "10px", px: "16px", rounded: "lg", border: "1px", borderColor: "blue.200", w: "100%", children: [ /* @__PURE__ */ I(k, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ /* @__PURE__ */ a( K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, onClick: () => l(e - 1), isDisabled: e === 1, icon: /* @__PURE__ */ a(O, {}), "aria-label": "صفحه قبلی" } ), y.map((r) => /* @__PURE__ */ a( R, { size: "md", px: 2, bg: e === r ? "#4B49AC" : "#e6e6f1", color: e === r ? "#e6e6f1" : "#4B49AC", _hover: { bg: e === r ? "#4B49AC" : "#cbcbe8" }, onClick: () => l(r), variant: "soft", children: p(r) }, r )), /* @__PURE__ */ a( K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, onClick: () => l(e + 1), isDisabled: e === t, icon: /* @__PURE__ */ a(W, {}), "aria-label": "صفحه بعدی" } ), /* @__PURE__ */ a( L, { ref: b, type: "text", inputMode: "numeric", placeholder: "صفحه", w: "56px", value: c, onFocus: () => { o(!0), u(null), s(""); }, onChange: (r) => { const h = r.target.value, m = D(h).replace(/\D/g, ""); s(p(m)); }, onBlur: () => { c || (s(p(e)), o(!1), u(null)); }, onKeyDown: (r) => { r.key === "Enter" && A(); }, textAlign: "center", color: "#1D2939", px: 1, minW: 0, dir: "ltr" } ) ] }), /* @__PURE__ */ I(k, { spacing: 2, children: [ /* @__PURE__ */ a(S, { w: "auto", fontWeight: "bold", whiteSpace: "nowrap", children: "تعداد کل:" }), /* @__PURE__ */ a(S, { children: p(n) }) ] }) ] } ); }, Ne = ({ currentPage: e, totalPages: t, totalCount: n, onPageChange: l }) => { const [c, s] = v(p(e)), [i, o] = v(!1), [d, u] = v(null), b = N(null), y = Array.from( /* @__PURE__ */ new Set([1, e, e + 1, t]) ).filter((r) => r >= 1 && r <= t).sort((r, h) => r - h); C(() => { if (d !== null) { e === d && (u(null), o(!1), s(p(e))); return; } i || s(p(e)); }, [e, i, d]), C(() => { if (!i || !c || d !== null) return; const r = parseInt(D(c), 10); if (isNaN(r)) return; const h = setTimeout(() => { var w; const m = Math.min(Math.max(r, 1), t); m !== e ? (u(m), s(p(m)), l(m)) : (o(!1), s(p(e))), (w = b.current) == null || w.blur(); }, 1e3); return () => clearTimeout(h); }, [ c, i, d, t, e, l ]); const A = () => { var m, w; const r = parseInt(D(c), 10); if (isNaN(r)) { s(p(e)), o(!1), u(null), (m = b.current) == null || m.blur(); return; } const h = Math.min(Math.max(r, 1), t); h !== e ? (u(h), s(p(h)), l(h)) : (s(p(e)), o(!1), u(null)), (w = b.current) == null || w.blur(); }; return t === 0 || !n ? null : /* @__PURE__ */ I( k, { justifyContent: "space-around", backgroundColor: "white", py: "10px", px: "16px", rounded: "lg", border: "1px", borderColor: "blue.200", w: "100%", children: [ /* @__PURE__ */ I(k, { spacing: 2, whiteSpace: "nowrap", children: [ /* @__PURE__ */ a(S, { fontWeight: "bold", children: "صفحه" }), /* @__PURE__ */ a(S, { children: p(e) }), /* @__PURE__ */ a(S, { fontWeight: "bold", children: "از" }), /* @__PURE__ */ a(S, { children: p(t) }) ] }), /* @__PURE__ */ I(k, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ /* @__PURE__ */ a( K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, onClick: () => l(e - 1), isDisabled: e === 1, icon: /* @__PURE__ */ a(O, {}), "aria-label": "صفحه قبلی" } ), y.map((r) => /* @__PURE__ */ a( R, { size: "md", bg: e === r ? "#4B49AC" : "#e6e6f1", color: e === r ? "#e6e6f1" : "#4B49AC", _hover: { bg: e === r ? "#4B49AC" : "#cbcbe8" }, onClick: () => l(r), variant: "soft", children: p(r) }, r )), /* @__PURE__ */ a( K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, onClick: () => l(e + 1), isDisabled: e === t, icon: /* @__PURE__ */ a(W, {}), "aria-label": "صفحه بعدی" } ), /* @__PURE__ */ a( L, { ref: b, type: "text", inputMode: "numeric", placeholder: "صفحه", w: "100px", value: c, onFocus: () => { o(!0), u(null), s(""); }, onChange: (r) => { const h = r.target.value, m = D(h).replace(/\D/g, ""); s(p(m)); }, onBlur: () => { c || (s(p(e)), o(!1), u(null)); }, onKeyDown: (r) => { r.key === "Enter" && A(); }, textAlign: "center", color: "#1D2939", px: 1, minW: 0, dir: "ltr" } ) ] }), /* @__PURE__ */ I(k, { spacing: 2, whiteSpace: "nowrap", children: [ /* @__PURE__ */ a(S, { fontWeight: "bold", children: "تعداد کل:" }), /* @__PURE__ */ a(S, { children: p(n) }) ] }) ] } ); }, Te = ({ currentPage: e, totalPages: t, totalCount: n, onPageChange: l }) => { const [c, s] = v(""), [i, o] = v(!1), [d, u] = v(null), b = N(null), y = d ?? e, A = E( (x) => { const B = Math.min(Math.max(x, 1), t); o(!1), s(""), u(null), B !== e && l(B); }, [e, t, l] ), r = E(() => { if (!c) { o(!1), s(""), u(null); return; } const x = parseInt(D(c), 10); if (isNaN(x)) { o(!1), s(""), u(null); return; } const B = Math.min(Math.max(x, 1), t); o(!1), s(""), B !== e ? (u(B), l(B)) : u(null); }, [c, e, t, l]); C(() => { var x; i && ((x = b.current) == null || x.focus()); }, [i]), C(() => { d !== null && e === d && u(null); }, [e, d]), C(() => { if (!i || !c) return; const x = setTimeout(() => { r(); }, 1e3); return () => clearTimeout(x); }, [c, i, r]); const h = () => { u(null), s(""), o(!0); }, m = (x, B = !1) => /* @__PURE__ */ a( R, { size: "md", bg: B ? "#4B49AC" : "#e6e6f1", color: B ? "#e6e6f1" : "#4B49AC", _hover: { bg: B ? "#4B49AC" : "#cbcbe8" }, onClick: B ? h : () => A(x), variant: "soft", children: p(x) }, x ); if (t === 0 || !n) return null; const w = t > 1 && y !== 1, g = t > 1 && y !== t; return /* @__PURE__ */ a( k, { justifyContent: "center", backgroundColor: "white", py: "10px", px: "16px", rounded: "lg", border: "1px", borderColor: "blue.200", w: "100%", children: /* @__PURE__ */ I(k, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ /* @__PURE__ */ a( K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, onClick: () => A(y - 1), isDisabled: y === 1, icon: /* @__PURE__ */ a(O, {}), "aria-label": "صفحه قبلی" } ), w && m(1), i ? /* @__PURE__ */ a( L, { ref: b, type: "text", inputMode: "numeric", placeholder: "صفحه", w: "48px", value: c, onChange: (x) => { const B = x.target.value, X = D(B).replace(/\D/g, ""); s(p(X)); }, onBlur: () => { c ? r() : (s(""), o(!1), u(null)); }, onKeyDown: (x) => { x.key === "Enter" && r(), x.key === "Escape" && (s(""), o(!1), u(null)); }, textAlign: "center", color: "#1D2939", px: 1, minW: 0, dir: "ltr" } ) : m(y, !0), g && m(t), /* @__PURE__ */ a( K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, onClick: () => A(y + 1), isDisabled: y === t, icon: /* @__PURE__ */ a(W, {}), "aria-label": "صفحه بعدی" } ) ] }) } ); }; let V = null, f = null, F = null, j = !1; const ie = $(null), oe = ({ url: e, realm: t, clientId: n }) => (f || (f = new te({ url: e, realm: t, clientId: n })), f), se = (e) => (V = e, V), le = () => j, G = () => !!(f != null && f.authenticated), T = () => (f == null ? void 0 : f.token) ?? null, q = async (e = 30) => f ? f.updateToken(e) : !1, H = (e) => f == null ? void 0 : f.logout(e), _e = (e) => f == null ? void 0 : f.login(e), J = ({ config: e, initOptions: t = {} } = {}) => { const n = e ?? V; if (!(n != null && n.url) || !(n != null && n.realm) || !(n != null && n.clientId)) throw new Error("Keycloak config is required."); se(n); const l = oe(n); return F || (F = l.init({ onLoad: "login-required", checkLoginIframe: !1, flow: "implicit", ...t }).then((c) => (j = !0, c)).catch((c) => { throw j = !0, c; })), F; }, ce = ({ children: e, config: t, initOptions: n, loading: l = null }) => { const [c, s] = v(!1), [i, o] = v(!1), [d, u] = v(null), b = N(!1), y = E(() => { f && (o(!!f.authenticated), u(f.token ?? null)); }, []); C(() => (b.current = !0, J({ config: t, initOptions: n }).then((w) => { b.current && (o(!!w), u((f == null ? void 0 : f.token) ?? null), s(!0)); }).catch(() => { b.current && (o(!1), u(null), s(!0)); }), () => { b.current = !1; }), [t, n]); const A = E(() => f == null ? void 0 : f.login(), []), r = E((w) => f == null ? void 0 : f.logout(w), []), h = E( async (w = 30) => { if (!f) return !1; const g = await f.updateToken(w); return y(), g; }, [y] ), m = _( () => ({ initialized: c, authenticated: i, token: d, login: A, logout: r, updateToken: h }), [c, i, d, A, r, h] ); return c ? /* @__PURE__ */ a(ie.Provider, { value: m, children: e }) : l; }, Q = $(null), M = "permissions", ue = (e) => (e == null ? void 0 : e.storageKey) || M, ae = ({ user: e = null, children: t, config: n, loading: l = /* @__PURE__ */ a("div", { children: "Loading permissions..." }), errorFallback: c = /* @__PURE__ */ a("div", { children: "Error loading permissions" }) }) => { const s = ue(n), [i, o] = v( () => de(s) ), { data: d, isLoading: u, error: b } = be(n), y = d ?? i; C(() => { d && (fe(s, d), o(d)); }, [d, s]); const A = _( () => pe(y), [y] ), r = E( (w = "") => he(A, w), [A] ), h = E((w = "") => !r(w), [r]), m = _( () => ({ user: e, can: r, cannot: h, permissions: y, isLoading: u, error: b }), [e, r, h, y, u, b] ); return b && !y ? c : u && !y ? l : /* @__PURE__ */ a(Q.Provider, { value: m, children: t }); }, de = (e = M) => { if (!(typeof window > "u")) try { const t = localStorage.getItem(e); return t ? JSON.parse(t) : void 0; } catch { return; } }, fe = (e = M, t) => { if (!(typeof window > "u")) try { localStorage.setItem(e, JSON.stringify(t)); } catch { } }, ze = (e = M) => { if (!(typeof window > "u")) try { localStorage.removeItem(e); } catch { } }, pe = (e) => e ? new Set(e.map((t) => t.name)) : /* @__PURE__ */ new Set(), he = (e, t = "") => { if (!t) return !1; if (e.has(t) || [...e].some((l) => l.startsWith(t))) return !0; let n = t; for (; n.includes(":"); ) if (n = n.slice(0, n.lastIndexOf(":")), e.has(`${n}:*`)) return !0; return !1; }, Y = { all: ["permissions"], list: (e) => [...Y.all, e] }, me = async (e) => { if (!(e != null && e.url) || !(e != null && e.clientId)) throw new Error("Permission config requires url and clientId."); const t = T(), n = new URL(e.url); n.searchParams.set("client_id", e.clientId); const l = await fetch(n.toString(), { method: "GET", headers: { ...t ? { Authorization: `Bearer ${t}` } : {} } }); if (!l.ok) throw new Error("Failed to load permissions"); return l.json(); }, U = () => { const e = P(Q); if (!e) throw new Error("usePermission must be used within PermissionProvider"); return e; }, be = (e) => ne({ queryKey: Y.list(e == null ? void 0 : e.clientId), queryFn: () => me(e), enabled: !!(e != null && e.url) && !!(e != null && e.clientId) && G(), staleTime: 1 / 0, refetchOnWindowFocus: !1, refetchOnReconnect: !1 }), Me = ({ perm: e, children: t, fallback: n = /* @__PURE__ */ a("div", { children: "You are not allowed to do this" }) }) => { const { can: l } = U(); return l(e) ? t : n; }, ge = ({ children: e }) => { const { can: t, permissions: n } = U(); return n && t("admin") ? e : null; }, Fe = ({ children: e }) => { const { can: t, isLoading: n } = U(); return C(() => { n || t("panel_access") || H(); }, [n, t]), e; }; let z = null; const we = (e) => { const { api: t } = e, n = re.create({ baseURL: t.baseUrl }), l = async () => { (!le() || !G()) && await J(); }, c = async (i) => { await l(); let o = T(); if (o) { try { await q(5), o = T(); } catch { } i.headers = { ...i.headers, Authorization: `Bearer ${o}` }; } return i; }, s = async (i) => { var d; const o = i.config; if (((d = i == null ? void 0 : i.response) == null ? void 0 : d.status) === 401 && !(o != null && o._retry)) { o._retry = !0; try { await q(30); const u = T(); return o.headers = { ...o.headers, Authorization: `Bearer ${u}` }, n(o); } catch { H({ redirectUri: window.location.origin }); } } return Promise.reject(i); }; return n.interceptors.request.use(c), n.interceptors.response.use( (i) => i, s ), { api: n }; }, ye = (e) => (z = we(e), z), xe = () => { if (!z) throw new Error("api is not configured. Call configureApi(config) first."); return z.api; }, Ve = new Proxy( {}, { get(e, t) { return xe()[t]; } } ); function ve() { const [e, t] = v(!1), n = N(null); return C(() => { if (process.env.NODE_ENV !== "production") return; let l; const c = async () => { const i = await fetch(`/version.json?t=${Date.now()}`, { cache: "no-store" }); if (!i.ok) throw new Error(`Failed to fetch version: ${i.status}`); const o = await i.json(); return String(o.version); }; return (async () => { try { n.current = await c(), l = setInterval(async () => { try { const i = await c(); n.current && i !== n.current && (t(!0), clearInterval(l)); } catch (i) { console.error("Update check failed:", i); } }, 3e4); } catch (i) { console.error("Initial version fetch failed:", i); } })(), () => { l && clearInterval(l); }; }, []), e ? /* @__PURE__ */ a( "div", { style: { position: "fixed", bottom: "16px", right: "16px", background: "#111", color: "#fff", padding: "12px 16px", borderRadius: "8px", zIndex: 9999, cursor: "pointer" }, onClick: () => window.location.reload(), children: "نسخه جدید سامانه در دسترس است" } ) : null; } function je({ children: e, apiBaseUrl: t, keycloakClientId: n, permissionClientId: l, loading: c = /* @__PURE__ */ a(ee, {}), updateChecker: s = !0, updateCheckerProps: i, keycloakUrl: o = "https://auth.ibagher.ir", keycloakRealm: d = "bi", permissionUrl: u = "https://api.d.aiengines.ir/user_api/v1/permissions/list" }) { const b = _( () => ({ api: { baseUrl: t }, keycloak: { url: o, realm: d, clientId: n }, permission: { url: u, clientId: l } }), [ t, n, l, o, d, u ] ); return C(() => { ye(b); }, [b]), /* @__PURE__ */ I(Z, { children: [ s && /* @__PURE__ */ a(ve, { ...i }), /* @__PURE__ */ a(ce, { config: b.keycloak, loading: c, children: /* @__PURE__ */ a(ae, { config: b.permission, loading: c, children: e }) }) ] }); } export { ge as AdminGuard, je as BiProvider, Me as Can, ce as KeycloakProvider, Ke as LightPagination, Ne as Pagination, Fe as PanelAccessGuard, ae as PermissionProvider, Te as SimplePagination, Ve as api, he as checkPermission, ze as clearCachedPermissions, ye as configureApi, we as createApi, pe as createPermissionSet, xe as getApi, de as getCachedPermissions, T as getKeycloakToken, me as getPermissions, J as initKeycloak, G as isKeycloakAuthenticated, le as isKeycloakInitialized, _e as loginKeycloak, H as logoutKeycloak, Y as permissionKeys, fe as setCachedPermissions, D as toEnDigits, p as toFaDigits, De as toFaNumber, q as updateKeycloakToken, U as usePermission, be as usePermissionsQuery };