diff --git a/dist/index.js b/dist/index.js index 599f4b8..07f7019 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,55 +1,55 @@ -import { jsxs as B, 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 z, useContext as P } from "react"; -import { HStack as I, IconButton as D, Button as L, Input as U, Text as S, Spinner as ee } from "@chakra-ui/react"; -import { IoChevronForwardOutline as g, IoChevronBackOutline as O } from "react-icons/io5"; +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 Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => String(e).replace(/\d/g, (t) => "۰۱۲۳۴۵۶۷۸۹"[Number(t)]), K = (e) => String(e).replace(/[۰-۹]/g, (n) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(n))), Ke = ({ +const Ee = (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))), De = ({ currentPage: e, totalPages: t, totalCount: n, - onPageChange: s + onPageChange: l }) => { - const [c, l] = v(p(e)), [i, o] = v(!1), [f, u] = v(null), w = N(null), y = [.../* @__PURE__ */ new Set([1, e, t])].filter( + const [u, s] = v(p(e)), [i, o] = v(!1), [d, c] = v(null), b = N(null), y = [.../* @__PURE__ */ new Set([1, e, t])].filter( (r) => r >= 1 && r <= t ); C(() => { - if (f !== null) { - e === f && (u(null), o(!1), l(p(e))); + if (d !== null) { + e === d && (c(null), o(!1), s(p(e))); return; } - i || l(p(e)); - }, [e, i, f]), C(() => { - if (!i || !c || f !== null) return; - const r = parseInt(K(c), 10); + i || s(p(e)); + }, [e, i, d]), C(() => { + if (!i || !u || d !== null) return; + const r = parseInt(D(u), 10); if (isNaN(r)) return; const h = setTimeout(() => { - var b; + var w; const m = Math.min(Math.max(r, 1), t); - m !== e ? (u(m), l(p(m)), s(m)) : (o(!1), l(p(e))), (b = w.current) == null || b.blur(); + m !== e ? (c(m), s(p(m)), l(m)) : (o(!1), s(p(e))), (w = b.current) == null || w.blur(); }, 1e3); return () => clearTimeout(h); }, [ - c, + u, i, - f, + d, t, e, - s + l ]); const A = () => { - var m, b; - const r = parseInt(K(c), 10); + var m, w; + const r = parseInt(D(u), 10); if (isNaN(r)) { - l(p(e)), o(!1), u(null), (m = w.current) == null || m.blur(); + s(p(e)), o(!1), c(null), (m = b.current) == null || m.blur(); return; } const h = Math.min(Math.max(r, 1), t); - h !== e ? (u(h), l(p(h)), s(h)) : (l(p(e)), o(!1), u(null)), (b = w.current) == null || b.blur(); + h !== e ? (c(h), s(p(h)), l(h)) : (s(p(e)), o(!1), c(null)), (w = b.current) == null || w.blur(); }; - return t === 0 || !n ? null : /* @__PURE__ */ B( - I, + return t === 0 || !n ? null : /* @__PURE__ */ I( + k, { justifyContent: "space-around", backgroundColor: "white", @@ -60,65 +60,65 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S borderColor: "blue.200", w: "100%", children: [ - /* @__PURE__ */ B(I, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ + /* @__PURE__ */ I(k, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ /* @__PURE__ */ a( - D, + K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, - onClick: () => s(e - 1), + onClick: () => l(e - 1), isDisabled: e === 1, - icon: /* @__PURE__ */ a(g, {}), + icon: /* @__PURE__ */ a(O, {}), "aria-label": "صفحه قبلی" } ), y.map((r) => /* @__PURE__ */ a( - L, + R, { size: "md", px: 2, bg: e === r ? "#4B49AC" : "#e6e6f1", color: e === r ? "#e6e6f1" : "#4B49AC", _hover: { bg: e === r ? "#4B49AC" : "#cbcbe8" }, - onClick: () => s(r), + onClick: () => l(r), variant: "soft", children: p(r) }, r )), /* @__PURE__ */ a( - D, + K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, - onClick: () => s(e + 1), + onClick: () => l(e + 1), isDisabled: e === t, - icon: /* @__PURE__ */ a(O, {}), + icon: /* @__PURE__ */ a(W, {}), "aria-label": "صفحه بعدی" } ), /* @__PURE__ */ a( - U, + L, { - ref: w, + ref: b, type: "text", inputMode: "numeric", placeholder: "صفحه", w: "56px", - value: c, + value: u, onFocus: () => { - o(!0), u(null), l(""); + o(!0), c(null), s(""); }, onChange: (r) => { - const h = r.target.value, m = K(h).replace(/\D/g, ""); - l(p(m)); + const h = r.target.value, m = D(h).replace(/\D/g, ""); + s(p(m)); }, onBlur: () => { - c || (l(p(e)), o(!1), u(null)); + u || (s(p(e)), o(!1), c(null)); }, onKeyDown: (r) => { r.key === "Enter" && A(); @@ -131,58 +131,58 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S } ) ] }), - /* @__PURE__ */ B(I, { spacing: 2, children: [ + /* @__PURE__ */ I(k, { spacing: 2, children: [ /* @__PURE__ */ a(S, { w: "auto", fontWeight: "bold", whiteSpace: "nowrap", children: "تعداد کل:" }), /* @__PURE__ */ a(S, { children: p(n) }) ] }) ] } ); -}, De = ({ +}, Ke = ({ currentPage: e, totalPages: t, totalCount: n, - onPageChange: s + onPageChange: l }) => { - const [c, l] = v(p(e)), [i, o] = v(!1), [f, u] = v(null), w = N(null), y = Array.from( + const [u, s] = v(p(e)), [i, o] = v(!1), [d, c] = 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 (f !== null) { - e === f && (u(null), o(!1), l(p(e))); + if (d !== null) { + e === d && (c(null), o(!1), s(p(e))); return; } - i || l(p(e)); - }, [e, i, f]), C(() => { - if (!i || !c || f !== null) return; - const r = parseInt(K(c), 10); + i || s(p(e)); + }, [e, i, d]), C(() => { + if (!i || !u || d !== null) return; + const r = parseInt(D(u), 10); if (isNaN(r)) return; const h = setTimeout(() => { - var b; + var w; const m = Math.min(Math.max(r, 1), t); - m !== e ? (u(m), l(p(m)), s(m)) : (o(!1), l(p(e))), (b = w.current) == null || b.blur(); + m !== e ? (c(m), s(p(m)), l(m)) : (o(!1), s(p(e))), (w = b.current) == null || w.blur(); }, 1e3); return () => clearTimeout(h); }, [ - c, + u, i, - f, + d, t, e, - s + l ]); const A = () => { - var m, b; - const r = parseInt(K(c), 10); + var m, w; + const r = parseInt(D(u), 10); if (isNaN(r)) { - l(p(e)), o(!1), u(null), (m = w.current) == null || m.blur(); + s(p(e)), o(!1), c(null), (m = b.current) == null || m.blur(); return; } const h = Math.min(Math.max(r, 1), t); - h !== e ? (u(h), l(p(h)), s(h)) : (l(p(e)), o(!1), u(null)), (b = w.current) == null || b.blur(); + h !== e ? (c(h), s(p(h)), l(h)) : (s(p(e)), o(!1), c(null)), (w = b.current) == null || w.blur(); }; - return t === 0 || !n ? null : /* @__PURE__ */ B( - I, + return t === 0 || !n ? null : /* @__PURE__ */ I( + k, { justifyContent: "space-around", backgroundColor: "white", @@ -193,70 +193,70 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S borderColor: "blue.200", w: "100%", children: [ - /* @__PURE__ */ B(I, { spacing: 2, whiteSpace: "nowrap", 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__ */ B(I, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ + /* @__PURE__ */ I(k, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ /* @__PURE__ */ a( - D, + K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, - onClick: () => s(e - 1), + onClick: () => l(e - 1), isDisabled: e === 1, - icon: /* @__PURE__ */ a(g, {}), + icon: /* @__PURE__ */ a(O, {}), "aria-label": "صفحه قبلی" } ), y.map((r) => /* @__PURE__ */ a( - L, + R, { size: "md", bg: e === r ? "#4B49AC" : "#e6e6f1", color: e === r ? "#e6e6f1" : "#4B49AC", _hover: { bg: e === r ? "#4B49AC" : "#cbcbe8" }, - onClick: () => s(r), + onClick: () => l(r), variant: "soft", children: p(r) }, r )), /* @__PURE__ */ a( - D, + K, { size: "md", bg: "#e6e6f1", color: "#4B49AC", _hover: { bg: "#cbcbe8" }, - onClick: () => s(e + 1), + onClick: () => l(e + 1), isDisabled: e === t, - icon: /* @__PURE__ */ a(O, {}), + icon: /* @__PURE__ */ a(W, {}), "aria-label": "صفحه بعدی" } ), /* @__PURE__ */ a( - U, + L, { - ref: w, + ref: b, type: "text", inputMode: "numeric", placeholder: "صفحه", w: "100px", - value: c, + value: u, onFocus: () => { - o(!0), u(null), l(""); + o(!0), c(null), s(""); }, onChange: (r) => { - const h = r.target.value, m = K(h).replace(/\D/g, ""); - l(p(m)); + const h = r.target.value, m = D(h).replace(/\D/g, ""); + s(p(m)); }, onBlur: () => { - c || (l(p(e)), o(!1), u(null)); + u || (s(p(e)), o(!1), c(null)); }, onKeyDown: (r) => { r.key === "Enter" && A(); @@ -269,7 +269,7 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S } ) ] }), - /* @__PURE__ */ B(I, { spacing: 2, whiteSpace: "nowrap", children: [ + /* @__PURE__ */ I(k, { spacing: 2, whiteSpace: "nowrap", children: [ /* @__PURE__ */ a(S, { fontWeight: "bold", children: "تعداد کل:" }), /* @__PURE__ */ a(S, { children: p(n) }) ] }) @@ -280,58 +280,58 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S currentPage: e, totalPages: t, totalCount: n, - onPageChange: s + onPageChange: l }) => { - const [c, l] = v(""), [i, o] = v(!1), [f, u] = v(null), w = N(null), y = f ?? e, A = E( + const [u, s] = v(""), [i, o] = v(!1), [d, c] = v(null), b = N(null), y = d ?? e, A = E( (x) => { - const k = Math.min(Math.max(x, 1), t); - o(!1), l(""), u(null), k !== e && s(k); + const B = Math.min(Math.max(x, 1), t); + o(!1), s(""), c(null), B !== e && l(B); }, - [e, t, s] + [e, t, l] ), r = E(() => { - if (!c) { - o(!1), l(""), u(null); + if (!u) { + o(!1), s(""), c(null); return; } - const x = parseInt(K(c), 10); + const x = parseInt(D(u), 10); if (isNaN(x)) { - o(!1), l(""), u(null); + o(!1), s(""), c(null); return; } - const k = Math.min(Math.max(x, 1), t); - o(!1), l(""), k !== e ? (u(k), s(k)) : u(null); - }, [c, e, t, s]); + const B = Math.min(Math.max(x, 1), t); + o(!1), s(""), B !== e ? (c(B), l(B)) : c(null); + }, [u, e, t, l]); C(() => { var x; - i && ((x = w.current) == null || x.focus()); + i && ((x = b.current) == null || x.focus()); }, [i]), C(() => { - f !== null && e === f && u(null); - }, [e, f]), C(() => { - if (!i || !c) return; + d !== null && e === d && c(null); + }, [e, d]), C(() => { + if (!i || !u) return; const x = setTimeout(() => { r(); }, 1e3); return () => clearTimeout(x); - }, [c, i, r]); + }, [u, i, r]); const h = () => { - u(null), l(""), o(!0); - }, m = (x, k = !1) => /* @__PURE__ */ a( - L, + c(null), s(""), o(!0); + }, m = (x, B = !1) => /* @__PURE__ */ a( + R, { size: "md", - bg: k ? "#4B49AC" : "#e6e6f1", - color: k ? "#e6e6f1" : "#4B49AC", - _hover: { bg: k ? "#4B49AC" : "#cbcbe8" }, - onClick: k ? h : () => A(x), + 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 b = t > 1 && y !== 1, F = t > 1 && y !== t; + const w = t > 1 && y !== 1, g = t > 1 && y !== t; return /* @__PURE__ */ a( - I, + k, { justifyContent: "center", backgroundColor: "white", @@ -341,9 +341,9 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S border: "1px", borderColor: "blue.200", w: "100%", - children: /* @__PURE__ */ B(I, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ + children: /* @__PURE__ */ I(k, { spacing: 2, alignItems: "center", justifyContent: "center", children: [ /* @__PURE__ */ a( - D, + K, { size: "md", bg: "#e6e6f1", @@ -351,29 +351,29 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S _hover: { bg: "#cbcbe8" }, onClick: () => A(y - 1), isDisabled: y === 1, - icon: /* @__PURE__ */ a(g, {}), + icon: /* @__PURE__ */ a(O, {}), "aria-label": "صفحه قبلی" } ), - b && m(1), + w && m(1), i ? /* @__PURE__ */ a( - U, + L, { - ref: w, + ref: b, type: "text", inputMode: "numeric", placeholder: "صفحه", w: "48px", - value: c, + value: u, onChange: (x) => { - const k = x.target.value, X = K(k).replace(/\D/g, ""); - l(p(X)); + const B = x.target.value, X = D(B).replace(/\D/g, ""); + s(p(X)); }, onBlur: () => { - c ? r() : (l(""), o(!1), u(null)); + u ? r() : (s(""), o(!1), c(null)); }, onKeyDown: (x) => { - x.key === "Enter" && r(), x.key === "Escape" && (l(""), o(!1), u(null)); + x.key === "Enter" && r(), x.key === "Escape" && (s(""), o(!1), c(null)); }, textAlign: "center", color: "#1D2939", @@ -382,9 +382,9 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S dir: "ltr" } ) : m(y, !0), - F && m(t), + g && m(t), /* @__PURE__ */ a( - D, + K, { size: "md", bg: "#e6e6f1", @@ -392,7 +392,7 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S _hover: { bg: "#cbcbe8" }, onClick: () => A(y + 1), isDisabled: y === t, - icon: /* @__PURE__ */ a(O, {}), + icon: /* @__PURE__ */ a(W, {}), "aria-label": "صفحه بعدی" } ) @@ -400,91 +400,91 @@ const Ee = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), p = (e) => S } ); }; -let R = null, d = null, V = null, j = !1; -const ie = $(null), oe = ({ url: e, realm: t, clientId: n }) => (d || (d = new te({ +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 -})), d), se = (e) => (R = e, R), le = () => j, G = () => !!(d != null && d.authenticated), T = () => (d == null ? void 0 : d.token) ?? null, q = async (e = 30) => d ? d.updateToken(e) : !1, H = (e) => d == null ? void 0 : d.logout(e), Te = (e) => d == null ? void 0 : d.login(e), J = ({ config: e, initOptions: t = {} } = {}) => { - const n = e ?? R; +})), 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), Te = (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 s = oe(n); - return V || (V = s.init({ + 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; - })), V; + }).then((u) => (j = !0, u)).catch((u) => { + throw j = !0, u; + })), F; }, ce = ({ children: e, config: t, initOptions: n, - loading: s = null + loading: l = null }) => { - const [c, l] = v(!1), [i, o] = v(!1), [f, u] = v(null), w = N(!1), y = E(() => { - d && (o(!!d.authenticated), u(d.token ?? null)); + const [u, s] = v(!1), [i, o] = v(!1), [d, c] = v(null), b = N(!1), y = E(() => { + f && (o(!!f.authenticated), c(f.token ?? null)); }, []); - C(() => (w.current = !0, J({ config: t, initOptions: n }).then((b) => { - w.current && (o(!!b), u((d == null ? void 0 : d.token) ?? null), l(!0)); + C(() => (b.current = !0, J({ config: t, initOptions: n }).then((w) => { + b.current && (o(!!w), c((f == null ? void 0 : f.token) ?? null), s(!0)); }).catch(() => { - w.current && (o(!1), u(null), l(!0)); + b.current && (o(!1), c(null), s(!0)); }), () => { - w.current = !1; + b.current = !1; }), [t, n]); - const A = E(() => d == null ? void 0 : d.login(), []), r = E((b) => d == null ? void 0 : d.logout(b), []), h = E( - async (b = 30) => { - if (!d) return !1; - const F = await d.updateToken(b); - return y(), F; + 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 = z( + ), m = _( () => ({ - initialized: c, + initialized: u, authenticated: i, - token: f, + token: d, login: A, logout: r, updateToken: h }), - [c, i, f, A, r, h] + [u, i, d, A, r, h] ); - return c ? /* @__PURE__ */ a(ie.Provider, { value: m, children: e }) : s; -}, Q = $(null), M = "permissions", ue = (e) => (e == null ? void 0 : e.storageKey) || M, ze = ({ + return u ? /* @__PURE__ */ a(ie.Provider, { value: m, children: e }) : l; +}, Q = $(null), M = "permissions", ue = (e) => (e == null ? void 0 : e.storageKey) || M, _e = ({ user: e = null, children: t, config: n, - loading: s = /* @__PURE__ */ a("div", { children: "Loading permissions..." }), - errorFallback: c = /* @__PURE__ */ a("div", { children: "Error loading permissions" }) + loading: l = /* @__PURE__ */ a("div", { children: "Loading permissions..." }), + errorFallback: u = /* @__PURE__ */ a("div", { children: "Error loading permissions" }) }) => { - const l = ue(n), [i, o] = v( - () => ae(l) - ), { data: f, isLoading: u, error: w } = me(n), y = f ?? i; + const s = ue(n), [i, o] = v( + () => ae(s) + ), { data: d, isLoading: c, error: b } = me(n), y = d ?? i; C(() => { - f && (de(l, f), o(f)); - }, [f, l]); - const A = z( + d && (de(s, d), o(d)); + }, [d, s]); + const A = _( () => fe(y), [y] ), r = E( - (b = "") => pe(A, b), + (w = "") => pe(A, w), [A] - ), h = E((b = "") => !r(b), [r]), m = z( + ), h = E((w = "") => !r(w), [r]), m = _( () => ({ user: e, can: r, cannot: h, permissions: y, - isLoading: u, - error: w + isLoading: c, + error: b }), - [e, r, h, y, u, w] + [e, r, h, y, c, b] ); - return w && !y ? c : u && !y ? s : /* @__PURE__ */ a(Q.Provider, { value: m, children: t }); + return b && !y ? u : c && !y ? l : /* @__PURE__ */ a(Q.Provider, { value: m, children: t }); }, ae = (e = M) => { if (!(typeof window > "u")) try { @@ -499,7 +499,7 @@ const ie = $(null), oe = ({ url: e, realm: t, clientId: n }) => (d || (d = new t localStorage.setItem(e, JSON.stringify(t)); } catch { } -}, _e = (e = M) => { +}, ze = (e = M) => { if (!(typeof window > "u")) try { localStorage.removeItem(e); @@ -507,7 +507,7 @@ const ie = $(null), oe = ({ url: e, realm: t, clientId: n }) => (d || (d = new t } }, fe = (e) => e ? new Set(e.map((t) => t.name)) : /* @__PURE__ */ new Set(), pe = (e, t = "") => { if (!t) return !1; - if (e.has(t) || [...e].some((s) => s.startsWith(t))) return !0; + 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; @@ -520,16 +520,16 @@ const ie = $(null), oe = ({ url: e, realm: t, clientId: n }) => (d || (d = new t 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 s = await fetch(n.toString(), { + const l = await fetch(n.toString(), { method: "GET", headers: { ...t ? { Authorization: `Bearer ${t}` } : {} } }); - if (!s.ok) + if (!l.ok) throw new Error("Failed to load permissions"); - return s.json(); -}, W = () => { + return l.json(); +}, U = () => { const e = P(Q); if (!e) throw new Error("usePermission must be used within PermissionProvider"); @@ -546,25 +546,25 @@ const ie = $(null), oe = ({ url: e, realm: t, clientId: n }) => (d || (d = new t children: t, fallback: n = /* @__PURE__ */ a("div", { children: "You are not allowed to do this" }) }) => { - const { can: s } = W(); - return s(e) ? t : n; -}, Fe = ({ children: e }) => { - const { can: t, permissions: n } = W(); + const { can: l } = U(); + return l(e) ? t : n; +}, ge = ({ children: e }) => { + const { can: t, permissions: n } = U(); return n && t("admin") ? e : null; -}, Ve = ({ children: e }) => { - const { can: t, isLoading: n } = W(); +}, Fe = ({ children: e }) => { + const { can: t, isLoading: n } = U(); return C(() => { n || t("panel_access") || H(); }, [n, t]), e; }; -let _ = null; +let z = null; const be = (e) => { const { api: t } = e, n = re.create({ baseURL: t.baseUrl - }), s = async () => { + }), l = async () => { (!le() || !G()) && await J(); - }, c = async (i) => { - await s(); + }, u = async (i) => { + await l(); let o = T(); if (o) { try { @@ -577,17 +577,17 @@ const be = (e) => { }; } return i; - }, l = async (i) => { - var f; + }, s = async (i) => { + var d; const o = i.config; - if (((f = i == null ? void 0 : i.response) == null ? void 0 : f.status) === 401 && !(o != null && o._retry)) { + 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(); + const c = T(); return o.headers = { ...o.headers, - Authorization: `Bearer ${u}` + Authorization: `Bearer ${c}` }, n(o); } catch { H({ redirectUri: window.location.origin }); @@ -595,17 +595,17 @@ const be = (e) => { } return Promise.reject(i); }; - return n.interceptors.request.use(c), n.interceptors.response.use( + return n.interceptors.request.use(u), n.interceptors.response.use( (i) => i, - l + s ), { api: n }; -}, we = (e) => (_ = be(e), _), ye = () => { - if (!_) +}, we = (e) => (z = be(e), z), ye = () => { + if (!z) throw new Error("api is not configured. Call configureApi(config) first."); - return _.api; -}, Re = new Proxy( + return z.api; +}, Ve = new Proxy( {}, { get(e, t) { @@ -617,8 +617,8 @@ function xe() { const [e, t] = v(!1), n = N(null); return C(() => { if (process.env.NODE_ENV !== "production") return; - let s; - const c = async () => { + let l; + const u = async () => { const i = await fetch(`/version.json?t=${Date.now()}`, { cache: "no-store" }); @@ -629,10 +629,10 @@ function xe() { }; return (async () => { try { - n.current = await c(), s = setInterval(async () => { + n.current = await u(), l = setInterval(async () => { try { - const i = await c(); - n.current && i !== n.current && (t(!0), clearInterval(s)); + const i = await u(); + n.current && i !== n.current && (t(!0), clearInterval(l)); } catch (i) { console.error("Update check failed:", i); } @@ -641,7 +641,7 @@ function xe() { console.error("Initial version fetch failed:", i); } })(), () => { - s && clearInterval(s); + l && clearInterval(l); }; }, []), e ? /* @__PURE__ */ a( "div", @@ -664,32 +664,60 @@ function xe() { } function je({ children: e, - config: t, - loading: n = /* @__PURE__ */ a(ee, {}), + apiBaseUrl: t, + keycloakClientId: n, + permissionClientId: l, + loading: u = /* @__PURE__ */ a(ee, {}), updateChecker: s = !0, - updateCheckerProps: c + updateCheckerProps: i, + keycloakUrl: o = "https://auth.ibagher.ir", + keycloakRealm: d = "bi", + permissionUrl: c = "https://api.d.aiengines.ir/user_api/v1/permissions/list" }) { - return z(() => { - we(t); - }, [t]), /* @__PURE__ */ B(Z, { children: [ - s && /* @__PURE__ */ a(xe, { ...c }), - /* @__PURE__ */ a(ce, { config: t.keycloak, loading: n, children: e }) + const b = _( + () => ({ + api: { + baseUrl: t + }, + keycloak: { + url: o, + realm: d, + clientId: n + }, + permission: { + url: c, + clientId: l + } + }), + [ + t, + n, + l, + o, + d, + c + ] + ); + return C(() => { + we(b); + }, [b]), /* @__PURE__ */ I(Z, { children: [ + s && /* @__PURE__ */ a(xe, { ...i }), + /* @__PURE__ */ a(ce, { config: b.keycloak, loading: u, children: e }) ] }); } export { - Fe as AdminGuard, + ge as AdminGuard, + je as BiProvider, Me as Can, ce as KeycloakProvider, - Ke as LightPagination, - De as Pagination, - Ve as PanelAccessGuard, - ze as PermissionProvider, + De as LightPagination, + Ke as Pagination, + Fe as PanelAccessGuard, + _e as PermissionProvider, Ne as SimplePagination, - je as UiKitProvider, - xe as UpdateChecker, - Re as api, + Ve as api, pe as checkPermission, - _e as clearCachedPermissions, + ze as clearCachedPermissions, we as configureApi, be as createApi, fe as createPermissionSet, @@ -704,10 +732,10 @@ export { H as logoutKeycloak, Y as permissionKeys, de as setCachedPermissions, - K as toEnDigits, + D as toEnDigits, p as toFaDigits, Ee as toFaNumber, q as updateKeycloakToken, - W as usePermission, + U as usePermission, me as usePermissionsQuery }; diff --git a/src/core/UiKitProvider.jsx b/src/core/UiKitProvider.jsx deleted file mode 100644 index 747bb59..0000000 --- a/src/core/UiKitProvider.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import { useMemo } from "react"; -import { Spinner } from "@chakra-ui/react"; -import { KeycloakProvider } from "./keycloak.jsx"; -import { UpdateChecker } from "../components/UpdateChecker.jsx"; -import { configureApi } from "./api.js"; - -export function UiKitProvider({ - children, - config, - loading = , - updateChecker = true, - updateCheckerProps, -}) { - useMemo(() => { - configureApi(config); - }, [config]); - - return ( - <> - {updateChecker && } - - - {children} - - - ); -} diff --git a/src/index.js b/src/index.js index f0f764e..d4d4b0c 100644 --- a/src/index.js +++ b/src/index.js @@ -33,5 +33,4 @@ export { export { createApi, configureApi, getApi, api } from "./core/api.js"; -export { UiKitProvider } from "./core/UiKitProvider.jsx"; -export { UpdateChecker } from "./components/UpdateChecker.jsx"; +export { BiProvider } from "./provider/BiProvider.jsx"; diff --git a/src/provider/BiProvider.jsx b/src/provider/BiProvider.jsx new file mode 100644 index 0000000..a85e591 --- /dev/null +++ b/src/provider/BiProvider.jsx @@ -0,0 +1,57 @@ +import { useEffect, useMemo } from "react"; +import { Spinner } from "@chakra-ui/react"; +import { KeycloakProvider } from "../core/keycloak.jsx"; +import { UpdateChecker } from "../components/UpdateChecker.jsx"; +import { configureApi } from "../core/api.js"; + +export function BiProvider({ + children, + apiBaseUrl, + keycloakClientId, + permissionClientId, + loading = , + updateChecker = true, + updateCheckerProps, + keycloakUrl = "https://auth.ibagher.ir", + keycloakRealm = "bi", + permissionUrl = "https://api.d.aiengines.ir/user_api/v1/permissions/list", +}) { + const config = useMemo( + () => ({ + api: { + baseUrl: apiBaseUrl, + }, + keycloak: { + url: keycloakUrl, + realm: keycloakRealm, + clientId: keycloakClientId, + }, + permission: { + url: permissionUrl, + clientId: permissionClientId, + }, + }), + [ + apiBaseUrl, + keycloakClientId, + permissionClientId, + keycloakUrl, + keycloakRealm, + permissionUrl, + ], + ); + + useEffect(() => { + configureApi(config); + }, [config]); + + return ( + <> + {updateChecker && } + + + {children} + + + ); +}