@tsingroc/tsingroc-components 3.0.2 → 3.2.0
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/components/Auth.d.ts +20 -11
- package/dist/components/Auth.js +32 -11
- package/dist/components/Auth.js.map +1 -1
- package/package.json +3 -3
|
@@ -104,8 +104,14 @@ interface User {
|
|
|
104
104
|
export interface Auth extends User {
|
|
105
105
|
/** 全局的 Casdoor SDK 对象。*/
|
|
106
106
|
sdk: Sdk;
|
|
107
|
-
/**
|
|
108
|
-
|
|
107
|
+
/**
|
|
108
|
+
* 跳转到登录。
|
|
109
|
+
*
|
|
110
|
+
* 参数 `redirect` 可以填入登录完成后要跳转到的地址。如果省略,那么跳转目标将由
|
|
111
|
+
* {@linkcode AuthCallback} 的 {@linkcode AuthCallbackProps.onRedirect | onRedirect}
|
|
112
|
+
* 属性决定,默认为跳转到主页。
|
|
113
|
+
*/
|
|
114
|
+
login(redirect?: string): void;
|
|
109
115
|
/** 从登录页面返回时应该调用的回调。当登录状态无效时会**抛出异常**。*/
|
|
110
116
|
callback(): Promise<void>;
|
|
111
117
|
/** 在线检查用户是否登录。用户未登录时会**抛出异常**。*/
|
|
@@ -113,10 +119,10 @@ export interface Auth extends User {
|
|
|
113
119
|
/**
|
|
114
120
|
* 登出。
|
|
115
121
|
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
122
|
+
* 参数 `redirect` 可以填入登出后跳转到的地址。如果省略,默认为**不做任何跳转**。
|
|
123
|
+
* 你也可以在登出后手动加一行跳转操作,比如使用 React Router 的 `navigate`。
|
|
118
124
|
*/
|
|
119
|
-
logout(): void;
|
|
125
|
+
logout(redirect?: string): void;
|
|
120
126
|
}
|
|
121
127
|
/**
|
|
122
128
|
* 获取登录鉴权相关的工具函数和全局状态。必须在 {@linkcode AuthProvider} 内部才能使用。
|
|
@@ -131,8 +137,11 @@ export interface AuthProviderProps {
|
|
|
131
137
|
* {@linkcode AuthCallback} 组件的路径。
|
|
132
138
|
*/
|
|
133
139
|
sdkConfig: SdkConfig;
|
|
134
|
-
/**
|
|
135
|
-
|
|
140
|
+
/**
|
|
141
|
+
* 登录 API 的源点,末尾不带 `/`。
|
|
142
|
+
* @default location.origin
|
|
143
|
+
*/
|
|
144
|
+
signinOrigin?: string;
|
|
136
145
|
/**
|
|
137
146
|
* 登陆 API 的路径。
|
|
138
147
|
* @default "/api/signin"
|
|
@@ -167,7 +176,7 @@ export interface AuthCheckProps {
|
|
|
167
176
|
loading?: ReactNode;
|
|
168
177
|
/**
|
|
169
178
|
* 当用户未登录或登录状态验证失败时的回调。默认会跳转到登录。
|
|
170
|
-
* @default () => auth.login() // auth = useAuth()
|
|
179
|
+
* @default () => auth.login(location.href) // auth = useAuth()
|
|
171
180
|
*/
|
|
172
181
|
onFail?: (err: unknown) => void;
|
|
173
182
|
/**
|
|
@@ -187,10 +196,10 @@ export interface AuthCheckProps {
|
|
|
187
196
|
export declare function AuthCheck(props: AuthCheckProps): ReactNode;
|
|
188
197
|
export interface AuthCallbackProps {
|
|
189
198
|
/**
|
|
190
|
-
*
|
|
191
|
-
* @default () => { location.href = "/"; }
|
|
199
|
+
* 跳转时的回调。传入的 `redirect` 参数就是 {@linkcode Auth.login | login} 函数的参数。
|
|
200
|
+
* @default (redirect) => { location.href = redirect ?? "/"; }
|
|
192
201
|
*/
|
|
193
|
-
onRedirect?: () => void;
|
|
202
|
+
onRedirect?: (redirect?: string) => void;
|
|
194
203
|
/**
|
|
195
204
|
* 发生错误时显示的内容。
|
|
196
205
|
* @default (err) => err.toString()
|
package/dist/components/Auth.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext, useEffect, useMemo, useState, } from "react";
|
|
2
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState, } from "react";
|
|
3
3
|
import { jwtDecode } from "jwt-decode";
|
|
4
4
|
import Sdk from "casdoor-js-sdk";
|
|
5
5
|
const AuthContext = createContext(undefined);
|
|
@@ -44,13 +44,15 @@ export function AuthProvider(props) {
|
|
|
44
44
|
});
|
|
45
45
|
const auth = useMemo(() => ({
|
|
46
46
|
sdk: new Sdk(props.sdkConfig),
|
|
47
|
-
login() {
|
|
47
|
+
login(redirect) {
|
|
48
48
|
location.href = this.sdk.getSigninUrl();
|
|
49
|
-
|
|
49
|
+
if (redirect) {
|
|
50
|
+
sessionStorage.setItem("login_redirect", redirect);
|
|
51
|
+
}
|
|
50
52
|
},
|
|
51
53
|
async callback() {
|
|
52
54
|
// sdk 的类型声明有误
|
|
53
|
-
const resp = (await this.sdk.signin(props.signinOrigin, props.signinPath));
|
|
55
|
+
const resp = (await this.sdk.signin(props.signinOrigin ?? location.origin, props.signinPath));
|
|
54
56
|
const token = resp.token;
|
|
55
57
|
if (!token) {
|
|
56
58
|
throw new Error("登录 API 返回了异常的结果:" + JSON.stringify(resp));
|
|
@@ -79,9 +81,12 @@ export function AuthProvider(props) {
|
|
|
79
81
|
setUser({ ...user, userInfo: resp });
|
|
80
82
|
}
|
|
81
83
|
},
|
|
82
|
-
logout() {
|
|
84
|
+
logout(redirect) {
|
|
83
85
|
localStorage.removeItem("access_token");
|
|
84
|
-
|
|
86
|
+
setUser({});
|
|
87
|
+
if (redirect) {
|
|
88
|
+
location.href = redirect;
|
|
89
|
+
}
|
|
85
90
|
},
|
|
86
91
|
...user,
|
|
87
92
|
}), [props.sdkConfig, props.signinOrigin, props.signinPath, user]);
|
|
@@ -96,9 +101,14 @@ export function AuthProvider(props) {
|
|
|
96
101
|
export function AuthCheck(props) {
|
|
97
102
|
const auth = useAuth("AuthCheck");
|
|
98
103
|
const userInfo = auth.userInfo;
|
|
104
|
+
// 用于确保在 Strict Mode 下副作用也只执行一次
|
|
105
|
+
const effectDone = useRef(false);
|
|
99
106
|
useEffect(() => {
|
|
107
|
+
if (effectDone.current)
|
|
108
|
+
return;
|
|
109
|
+
effectDone.current = true;
|
|
100
110
|
if (!auth.userInfo) {
|
|
101
|
-
auth.validate().catch(props.onFail ?? (() => auth.login()));
|
|
111
|
+
auth.validate().catch(props.onFail ?? (() => auth.login(location.href)));
|
|
102
112
|
}
|
|
103
113
|
// 这个副作用只在首次渲染时执行
|
|
104
114
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -123,11 +133,22 @@ export function AuthCheck(props) {
|
|
|
123
133
|
export function AuthCallback(props) {
|
|
124
134
|
const auth = useAuth("AuthCallback");
|
|
125
135
|
const [error, setError] = useState();
|
|
136
|
+
// 用于确保在 Strict Mode 下副作用也只执行一次
|
|
137
|
+
const effectDone = useRef(false);
|
|
126
138
|
useEffect(() => {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
139
|
+
if (effectDone.current)
|
|
140
|
+
return;
|
|
141
|
+
effectDone.current = true;
|
|
142
|
+
const redirect = sessionStorage.getItem("login_redirect");
|
|
143
|
+
sessionStorage.removeItem("login_redirect");
|
|
144
|
+
auth.callback().then(() => {
|
|
145
|
+
if (props.onRedirect) {
|
|
146
|
+
props.onRedirect(redirect ?? undefined);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
location.href = redirect ?? "/";
|
|
150
|
+
}
|
|
151
|
+
}, setError);
|
|
131
152
|
// 这个副作用只在首次渲染时执行
|
|
132
153
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
133
154
|
}, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../src/components/Auth.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EAEb,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AACxD,OAAO,GAAG,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../src/components/Auth.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsingroc/tsingroc-components",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@eslint/js": "^9.21.0",
|
|
41
|
-
"@rsbuild/core": "^1.3.
|
|
42
|
-
"@rsbuild/plugin-react": "^1.
|
|
41
|
+
"@rsbuild/core": "^1.3.11",
|
|
42
|
+
"@rsbuild/plugin-react": "^1.3.0",
|
|
43
43
|
"@rspress/plugin-preview": "^2.0.0-alpha.0",
|
|
44
44
|
"@types/node": "^22.14.1",
|
|
45
45
|
"@types/react": "^18.3.20",
|