@ichaingo/with-login 1.4.56 → 1.4.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export declare enum OpenLoginType {
8
8
  LOGIN = "login",
9
9
  REGISTER = "register"
10
10
  }
11
- export interface UseLoginResult {
11
+ export interface LoginContextValue {
12
12
  isOpen: boolean;
13
13
  openLogin: (type?: OpenLoginType) => void;
14
14
  closeLogin: () => void;
@@ -19,18 +19,20 @@ export interface UseLoginResult {
19
19
  handleIframeLoad: () => void;
20
20
  mounted: boolean;
21
21
  Trigger: React.FC<React.HTMLAttributes<HTMLDivElement>>;
22
- LoginModal: React.FC;
23
- Prefetch: React.FC;
22
+ registerLoginSuccessCallback: (callback: () => void | Promise<void>) => () => void;
24
23
  }
25
- interface UseLoginProps {
24
+ interface LoginProviderProps {
25
+ children: React.ReactNode;
26
26
  loginSuccessCallback?: () => Promise<void>;
27
27
  }
28
28
  /**
29
- * 登录逻辑 + UI 全都在这个 hook 里面
30
- * - 返回 Trigger:包裹触发登录的元素
31
- * - 返回 LoginModal:实际渲染登录弹窗(使用 createPortal)
29
+ * LoginProvider 组件:提供全局登录状态和功能
32
30
  */
33
- export declare function useLogin({ loginSuccessCallback }: UseLoginProps): UseLoginResult;
31
+ export declare function LoginProvider({ children, loginSuccessCallback }: LoginProviderProps): import("react/jsx-runtime").JSX.Element;
32
+ /**
33
+ * useLogin hook:消费 LoginContext
34
+ */
35
+ export declare function useLogin(): LoginContextValue;
34
36
  interface WithLoginProps extends React.PropsWithChildren, React.HTMLAttributes<HTMLElement> {
35
37
  children?: React.ReactNode;
36
38
  onClick?: () => void;
@@ -38,8 +40,9 @@ interface WithLoginProps extends React.PropsWithChildren, React.HTMLAttributes<H
38
40
  /**
39
41
  * 一个简单封装:
40
42
  * - children 作为触发区域
41
- * - 内部自动渲染 LoginModal
43
+ * - 使用全局 LoginProvider 的登录功能
44
+ * - 如果提供了 onClick,会在登录成功后调用
42
45
  */
43
- export declare function WithLogin({ children, onClick, ...rest }: WithLoginProps): import("react/jsx-runtime").JSX.Element;
46
+ export declare function WithLogin({ children, onClick, ...rest }: WithLoginProps): import("react/jsx-runtime").JSX.Element | null;
44
47
  export default WithLogin;
45
48
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAOhE,eAAO,MAAM,OAAO,eAEnB,CAAC;AACF,oBAAY,gBAAgB;IAC1B,iBAAiB,oBAAoB;IACrC,aAAa,iBAAiB;CAC/B;AACD,oBAAY,aAAa;IACvB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AACD,MAAM,WAAW,cAAc;IAE7B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,CAAE,IAAI,CAAC,EAAE,aAAa,KAAM,IAAI,CAAC;IAC5C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IAEjB,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IACxD,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;CACpB;AACD,UAAU,aAAa;IACrB,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAC,oBAA8C,EAAC,EAAE,aAAa,GAAG,cAAc,CAqJxG;AAED,UAAU,cACR,SAAQ,KAAK,CAAC,iBAAiB,EAC7B,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,2CAYvE;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8E,MAAM,OAAO,CAAC;AAMnG,eAAO,MAAM,OAAO,eAEnB,CAAC;AAEF,oBAAY,gBAAgB;IAC1B,iBAAiB,oBAAoB;IACrC,aAAa,iBAAiB;CAC/B;AAED,oBAAY,aAAa;IACvB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,iBAAiB;IAEhC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IAEjB,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAExD,4BAA4B,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC;CACpF;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAKD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,oBAA8C,EAAE,EAAE,kBAAkB,2CA8I7G;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C;AAED,UAAU,cACR,SAAQ,KAAK,CAAC,iBAAiB,EAC7B,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,kDAevE;AAED,eAAe,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,123 +1,112 @@
1
1
  'use client';
2
- import { jsx as s, jsxs as y, Fragment as M } from "react/jsx-runtime";
3
- import { useState as d, useCallback as n, useEffect as U } from "react";
4
- import { createPortal as x } from "react-dom";
5
- import { useLocale as O } from "next-intl";
6
- import { twMerge as N } from "tailwind-merge";
7
- import { useTheme as C } from "@ichaingo/next-themes";
8
- import R from "js-cookie";
9
- const k = () => !!R.get("id_token");
10
- var A = /* @__PURE__ */ ((e) => (e.CLOSE_LOGIN_MODAL = "closeLoginModal", e.LOGIN_SUCCESS = "loginSuccess", e))(A || {}), B = /* @__PURE__ */ ((e) => (e.LOGIN = "login", e.REGISTER = "register", e))(B || {});
11
- function G({ loginSuccessCallback: e = () => Promise.resolve() }) {
12
- const [o, l] = d(!1), [t, g] = d(!1), [i, f] = d(!1), [L, E] = d(null), [$, I] = d(!1), u = O(), { resolvedTheme: p } = C(), h = window.location.href, a = t && p ? p : "light", v = n((r) => {
13
- const c = `${process.env.NEXT_PUBLIC_AUTH_URL}/${u}/login?mode=dialog&theme=${a}&redirect_uri=${h}`, w = `${process.env.NEXT_PUBLIC_AUTH_URL}/${u}/register?mode=dialog&theme=${a}&redirect_uri=${h}`;
14
- l(!0), f(!1), E(r === "register" ? w : c);
15
- }, [a, u, h]), m = n(() => {
16
- l(!1);
17
- }, []), P = n((r) => {
18
- l(r), r && f(!1);
2
+ import { jsx as w, jsxs as R } from "react/jsx-runtime";
3
+ import y, { createContext as O, useState as L, useRef as P, useCallback as s, useEffect as p, useContext as k } from "react";
4
+ import { useLocale as A } from "next-intl";
5
+ import { twMerge as x } from "tailwind-merge";
6
+ import { useTheme as B } from "@ichaingo/next-themes";
7
+ import G from "js-cookie";
8
+ const K = () => !!G.get("id_token");
9
+ var H = /* @__PURE__ */ ((e) => (e.CLOSE_LOGIN_MODAL = "closeLoginModal", e.LOGIN_SUCCESS = "loginSuccess", e))(H || {}), X = /* @__PURE__ */ ((e) => (e.LOGIN = "login", e.REGISTER = "register", e))(X || {});
10
+ const S = O(void 0);
11
+ function Q({ children: e, loginSuccessCallback: l = () => Promise.resolve() }) {
12
+ const [n, a] = L(!1), [i, $] = L(!1), [h, c] = L(!1), [d, C] = L(null), E = P(/* @__PURE__ */ new Set()), u = A(), { resolvedTheme: v } = B(), t = i && v ? v : "light", _ = s((o) => {
13
+ const r = typeof window < "u" ? window.location.href : "", g = `${process.env.NEXT_PUBLIC_AUTH_URL}/${u}/login?mode=dialog&theme=${t}&redirect_uri=${r}`, m = `${process.env.NEXT_PUBLIC_AUTH_URL}/${u}/register?mode=dialog&theme=${t}&redirect_uri=${r}`;
14
+ a(!0), c(!1), C(o === "register" ? m : g);
15
+ }, [t, u]), f = s(() => {
16
+ a(!1);
17
+ }, []), I = s((o) => {
18
+ a(o), o && c(!1);
19
19
  }, []);
20
- U(() => {
21
- o && t && f(!1);
22
- }, [p, o, t]), U(() => {
23
- g(!0);
24
- const r = (c) => {
25
- c.data.type === "closeLoginModal" && m(), c.data.type === "loginSuccess" && (m(), e && e());
20
+ p(() => {
21
+ n && i && c(!1);
22
+ }, [v, n, i]), p(() => {
23
+ if (t) {
24
+ const o = typeof window < "u" ? window.location.href : "", r = `${process.env.NEXT_PUBLIC_AUTH_URL}/${u}/login?mode=dialog&theme=${t}&redirect_uri=${o}`;
25
+ C(r);
26
+ }
27
+ }, [t]), p(() => {
28
+ $(!0);
29
+ const o = (r) => {
30
+ var g, m;
31
+ ((g = r.data) == null ? void 0 : g.type) === "closeLoginModal" && f(), ((m = r.data) == null ? void 0 : m.type) === "loginSuccess" && (console.log("handleMessage", r.data.type), f(), window.location.reload());
26
32
  };
27
- return window.addEventListener("message", r), () => {
28
- window.removeEventListener("message", r);
33
+ return window.addEventListener("message", o), () => {
34
+ window.removeEventListener("message", o);
29
35
  };
30
- }, [m, e]), U(() => {
31
- t && I(!0);
32
- }, [t]);
33
- const _ = n(() => {
34
- f(!0);
35
- }, []), T = n(
36
- ({ children: r, onClick: c, ...w }) => /* @__PURE__ */ s("div", { onClick: () => v(), style: { cursor: "pointer" }, ...w, children: r }),
37
- [v]
38
- ), b = n(() => !$ || !t ? null : x(
39
- /* @__PURE__ */ s("div", { className: "w-[1px] h-[1px] fixed left-0 bottom-0", children: /* @__PURE__ */ s(
40
- "iframe",
41
- {
42
- src: `${process.env.NEXT_PUBLIC_AUTH_URL}/${u}/login?mode=dialog`,
43
- className: "w-[1px] h-[1px]",
44
- title: "Login Prefetch"
45
- }
46
- ) }),
47
- document.body
48
- ), [$, t]), S = n(() => o ? x(
49
- /* @__PURE__ */ y(
50
- "div",
51
- {
52
- className: N(
53
- "fixed w-0 h-9 bg-[rgba(0,0,0,0.7)] z-1002",
54
- o && "top-0 left-0 w-full h-full"
55
- ),
56
- children: [
57
- /* @__PURE__ */ s(
58
- "div",
59
- {
60
- className: N(
61
- "absolute inset-0 transition-opacity duration-300",
62
- i ? "opacity-0 pointer-events-none" : "opacity-100 z-1002"
63
- )
64
- }
36
+ }, [f, l]);
37
+ const U = s(() => {
38
+ console.log("iframe loaded"), c(!0);
39
+ }, []), T = s((o) => (E.current.add(o), () => {
40
+ E.current.delete(o);
41
+ }), []), b = s(
42
+ ({ children: o, ...r }) => /* @__PURE__ */ w("div", { onClick: () => _(), style: { cursor: "pointer" }, ...r, children: o }),
43
+ [_]
44
+ ), M = y.useMemo(() => /* @__PURE__ */ w(
45
+ "div",
46
+ {
47
+ className: x(
48
+ "fixed left-0 bottom-0 w-px h-px bg-[rgba(0,0,0,0.7)] z-1002",
49
+ "transition-all duration-500 ease-in-out",
50
+ n && "w-full h-full "
51
+ ),
52
+ children: d && /* @__PURE__ */ w(
53
+ "iframe",
54
+ {
55
+ src: d ?? "",
56
+ className: x(
57
+ "w-full h-full border-none relative z-10 transition-opacity duration-300",
58
+ h ? "opacity-0" : "opacity-100"
65
59
  ),
66
- /* @__PURE__ */ s(
67
- "iframe",
68
- {
69
- src: L ?? "",
70
- className: N(
71
- "w-full h-full border-none relative z-10 transition-opacity duration-300",
72
- i ? "opacity-100" : "opacity-0"
73
- ),
74
- title: "Login",
75
- onLoad: _,
76
- sandbox: "allow-scripts allow-forms allow-same-origin"
77
- },
78
- `login-iframe-${a}`
79
- )
80
- ]
81
- }
82
- ),
83
- document.body
84
- ) : null, [
85
- a,
86
- _,
87
- i,
88
- o,
89
- L
90
- ]);
91
- return {
92
- isOpen: o,
93
- openLogin: v,
94
- closeLogin: m,
95
- setLoginOpen: P,
96
- url: L,
97
- currentTheme: a,
98
- iframeLoaded: i,
99
- handleIframeLoad: _,
100
- mounted: t,
101
- Trigger: T,
102
- LoginModal: S,
103
- Prefetch: b
60
+ title: "Login",
61
+ onLoad: U,
62
+ sandbox: "allow-scripts allow-forms allow-same-origin"
63
+ },
64
+ `login-iframe-${t}`
65
+ )
66
+ }
67
+ ), [
68
+ t,
69
+ U,
70
+ h,
71
+ n,
72
+ d
73
+ ]), N = {
74
+ isOpen: n,
75
+ openLogin: _,
76
+ closeLogin: f,
77
+ setLoginOpen: I,
78
+ url: d,
79
+ currentTheme: t,
80
+ iframeLoaded: h,
81
+ handleIframeLoad: U,
82
+ mounted: i,
83
+ Trigger: b,
84
+ registerLoginSuccessCallback: T
104
85
  };
105
- }
106
- function q({ children: e, onClick: o, ...l }) {
107
- const { Trigger: t, LoginModal: g, Prefetch: i } = G({ loginSuccessCallback: async () => {
108
- o == null || o();
109
- } });
110
- return /* @__PURE__ */ y(M, { children: [
111
- e && /* @__PURE__ */ s(t, { ...l, children: e }),
112
- /* @__PURE__ */ s(g, {}),
113
- /* @__PURE__ */ s(i, {})
86
+ return /* @__PURE__ */ R(S.Provider, { value: N, children: [
87
+ e,
88
+ M
114
89
  ] });
115
90
  }
91
+ function j() {
92
+ const e = k(S);
93
+ if (e === void 0)
94
+ throw new Error("useLogin must be used within a LoginProvider");
95
+ return e;
96
+ }
97
+ function V({ children: e, onClick: l, ...n }) {
98
+ const { Trigger: a, registerLoginSuccessCallback: i } = j();
99
+ return p(() => {
100
+ if (l)
101
+ return i(l);
102
+ }, [l, i]), e ? /* @__PURE__ */ w(a, { ...n, children: e }) : null;
103
+ }
116
104
  export {
117
- A as LoginMessageType,
118
- B as OpenLoginType,
119
- q as WithLogin,
120
- q as default,
121
- k as isLogin,
122
- G as useLogin
105
+ H as LoginMessageType,
106
+ Q as LoginProvider,
107
+ X as OpenLoginType,
108
+ V as WithLogin,
109
+ V as default,
110
+ K as isLogin,
111
+ j as useLogin
123
112
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ichaingo/with-login",
3
- "version": "1.4.56",
3
+ "version": "1.4.58",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",