@taicode/common-web 1.1.17 → 1.1.18

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.
Files changed (78) hide show
  1. package/output/signin/context.d.ts +15 -0
  2. package/output/signin/context.d.ts.map +1 -0
  3. package/output/signin/context.js +13 -0
  4. package/output/signin/index.d.ts +58 -0
  5. package/output/signin/index.d.ts.map +1 -0
  6. package/output/signin/index.js +117 -0
  7. package/output/signin/service.d.ts +92 -0
  8. package/output/signin/service.d.ts.map +1 -0
  9. package/output/signin/service.js +520 -0
  10. package/output/signin/service.test.d.ts +2 -0
  11. package/output/signin/service.test.d.ts.map +1 -0
  12. package/output/signin/service.test.js +207 -0
  13. package/output/signin/types.d.ts +63 -0
  14. package/output/signin/types.d.ts.map +1 -0
  15. package/output/signin/types.js +1 -0
  16. package/package.json +6 -2
  17. package/output/catalyst/alert.jsx +0 -55
  18. package/output/catalyst/auth-layout.jsx +0 -7
  19. package/output/catalyst/avatar.jsx +0 -45
  20. package/output/catalyst/badge.jsx +0 -53
  21. package/output/catalyst/button.jsx +0 -187
  22. package/output/catalyst/checkbox.jsx +0 -105
  23. package/output/catalyst/combobox.jsx +0 -120
  24. package/output/catalyst/description-list.jsx +0 -24
  25. package/output/catalyst/dialog.jsx +0 -55
  26. package/output/catalyst/divider.jsx +0 -16
  27. package/output/catalyst/dropdown.jsx +0 -102
  28. package/output/catalyst/fieldset.jsx +0 -41
  29. package/output/catalyst/heading.jsx +0 -22
  30. package/output/catalyst/input.jsx +0 -73
  31. package/output/catalyst/link.jsx +0 -14
  32. package/output/catalyst/listbox.jsx +0 -120
  33. package/output/catalyst/navbar.jsx +0 -67
  34. package/output/catalyst/pagination.jsx +0 -52
  35. package/output/catalyst/radio.jsx +0 -103
  36. package/output/catalyst/select.jsx +0 -59
  37. package/output/catalyst/sidebar-layout.jsx +0 -58
  38. package/output/catalyst/sidebar.jsx +0 -85
  39. package/output/catalyst/stacked-layout.jsx +0 -55
  40. package/output/catalyst/switch.jsx +0 -161
  41. package/output/catalyst/table.jsx +0 -68
  42. package/output/catalyst/text.jsx +0 -29
  43. package/output/catalyst/textarea.jsx +0 -49
  44. package/output/helpers/cache-api/cache-api.d.ts +0 -13
  45. package/output/helpers/cache-api/cache-api.d.ts.map +0 -1
  46. package/output/helpers/cache-api/cache-api.js +0 -114
  47. package/output/helpers/cache-api/cache-api.test.d.ts +0 -2
  48. package/output/helpers/cache-api/cache-api.test.d.ts.map +0 -1
  49. package/output/helpers/cache-api/cache-api.test.js +0 -348
  50. package/output/helpers/cache-api/index.d.ts +0 -2
  51. package/output/helpers/cache-api/index.d.ts.map +0 -1
  52. package/output/helpers/cache-api/index.js +0 -1
  53. package/output/helpers/service/index.d.ts +0 -1
  54. package/output/helpers/service/index.d.ts.map +0 -1
  55. package/output/helpers/service/index.js +0 -1
  56. package/output/helpers/service/service.d.ts +0 -5
  57. package/output/helpers/service/service.d.ts.map +0 -1
  58. package/output/helpers/service/service.js +0 -2
  59. package/output/helpers/side-cache/index.d.ts +0 -2
  60. package/output/helpers/side-cache/index.d.ts.map +0 -1
  61. package/output/helpers/side-cache/index.js +0 -1
  62. package/output/helpers/side-cache/side-cache.d.ts +0 -10
  63. package/output/helpers/side-cache/side-cache.d.ts.map +0 -1
  64. package/output/helpers/side-cache/side-cache.js +0 -137
  65. package/output/helpers/side-cache/side-cache.test.d.ts +0 -2
  66. package/output/helpers/side-cache/side-cache.test.d.ts.map +0 -1
  67. package/output/helpers/side-cache/side-cache.test.js +0 -179
  68. package/output/helpers/use-observer/index.d.ts +0 -2
  69. package/output/helpers/use-observer/index.d.ts.map +0 -1
  70. package/output/helpers/use-observer/index.js +0 -1
  71. package/output/helpers/use-observer/use-observer.d.ts +0 -3
  72. package/output/helpers/use-observer/use-observer.d.ts.map +0 -1
  73. package/output/helpers/use-observer/use-observer.js +0 -16
  74. package/output/helpers/use-observer/use-observer.test.d.ts +0 -2
  75. package/output/helpers/use-observer/use-observer.test.d.ts.map +0 -1
  76. package/output/helpers/use-observer/use-observer.test.jsx +0 -134
  77. package/output/service/service.test.jsx +0 -367
  78. package/output/use-observer/use-observer.test.jsx +0 -134
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ /**
3
+ * 登录上下文值
4
+ */
5
+ interface SigninContextValue {
6
+ signin: () => Promise<void>;
7
+ }
8
+ export declare const SigninContext: React.Context<SigninContextValue | null>;
9
+ /**
10
+ * 使用登录上下文
11
+ * 用于在任何子组件中调用登录方法
12
+ */
13
+ export declare function useSignin(): SigninContextValue;
14
+ export {};
15
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../source/signin/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB;;GAEG;AACH,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5B;AAED,eAAO,MAAM,aAAa,0CAAuD,CAAA;AAEjF;;;GAGG;AACH,wBAAgB,SAAS,uBAMxB"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ export const SigninContext = React.createContext(null);
3
+ /**
4
+ * 使用登录上下文
5
+ * 用于在任何子组件中调用登录方法
6
+ */
7
+ export function useSignin() {
8
+ const context = React.useContext(SigninContext);
9
+ if (!context) {
10
+ throw new Error('useSigninContext must be used within SigninDialogProvider');
11
+ }
12
+ return context;
13
+ }
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import type { SigninApi } from './types';
3
+ /**
4
+ * 登录弹窗文案配置
5
+ */
6
+ export interface SigninDialogTexts {
7
+ /** 打开登录页标题 */
8
+ openingTitle?: string;
9
+ /** 等待登录标题 */
10
+ waitingTitle?: string;
11
+ /** 登录成功标题 */
12
+ successTitle?: string;
13
+ /** 登录失败标题 */
14
+ errorTitle?: string;
15
+ /** 登录已取消标题 */
16
+ cancelledTitle?: string;
17
+ /** 票据已过期标题 */
18
+ expiredTitle?: string;
19
+ /** 正在打开登录窗口描述 */
20
+ openingDescription?: string;
21
+ /** 请在新窗口中完成登录描述 */
22
+ waitingDescription?: string;
23
+ /** 登录成功描述 */
24
+ successDescription?: string;
25
+ /** 登录成功后此窗口将自动关闭提示 */
26
+ waitingHint?: string;
27
+ /** 登录过程中出现错误描述 */
28
+ errorDescription?: string;
29
+ /** 登录已被取消描述 */
30
+ cancelledDescription?: string;
31
+ /** 票据已过期描述 */
32
+ expiredDescription?: string;
33
+ /** 重新打开登录窗口按钮文字 */
34
+ reopenButton?: string;
35
+ /** 重新登录按钮文字 */
36
+ retryButton?: string;
37
+ /** 取消按钮文字 */
38
+ cancelButton?: string;
39
+ /** 关闭按钮文字 */
40
+ closeButton?: string;
41
+ }
42
+ /**
43
+ * 登录弹窗 Provider
44
+ * 提供登录方法给子组件使用
45
+ */
46
+ interface SigninDialogProviderProps {
47
+ children: React.ReactNode;
48
+ /** API 配置,用于适配不同的认证系统 */
49
+ apis: SigninApi;
50
+ /** 文案配置,用于 i18n */
51
+ texts?: SigninDialogTexts;
52
+ }
53
+ export declare const SigninDialogProvider: ((props: SigninDialogProviderProps) => import("react/jsx-runtime").JSX.Element) & {
54
+ displayName: string;
55
+ };
56
+ export type { SigninApi, SigninApiError, ApplySigninResult, CheckStatusResult, SigninStatus } from './types';
57
+ export { useSignin as useSignin } from './context';
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/signin/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAczB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIxC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iBAAiB;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,aAAa;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,cAAc;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA+UD;;;GAGG;AACH,UAAU,yBAAyB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,yBAAyB;IACzB,IAAI,EAAE,SAAS,CAAA;IACf,mBAAmB;IACnB,KAAK,CAAC,EAAE,iBAAiB,CAAA;CAC1B;AAED,eAAO,MAAM,oBAAoB,WAAoB,yBAAyB;;CAmC5E,CAAA;AAGF,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC5G,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { observer } from 'mobx-react-lite';
4
+ import { motion, AnimatePresence } from 'framer-motion';
5
+ import { CheckCircleIcon, XCircleIcon, ExclamationTriangleIcon, ClockIcon } from '@heroicons/react/24/outline';
6
+ import { Dialog, DialogBody } from '../catalyst/dialog';
7
+ import { Button } from '../catalyst/button';
8
+ import { SigninService } from './service';
9
+ import { SigninContext } from './context';
10
+ import { ServiceProvider } from '../service';
11
+ /**
12
+ * 默认文案
13
+ */
14
+ const defaultTexts = {
15
+ openingTitle: '正在打开登录页',
16
+ waitingTitle: '等待登录',
17
+ successTitle: '登录成功',
18
+ errorTitle: '登录失败',
19
+ cancelledTitle: '登录已取消',
20
+ expiredTitle: '登录已过期',
21
+ openingDescription: '正在为您打开登录窗口...',
22
+ waitingDescription: '请在新窗口中完成登录',
23
+ successDescription: '登录成功!正在跳转...',
24
+ waitingHint: '登录成功后此窗口将自动关闭',
25
+ errorDescription: '登录过程中出现错误',
26
+ cancelledDescription: '您已取消本次登录',
27
+ expiredDescription: '登录票据已过期,请重新登录',
28
+ reopenButton: '重新打开登录窗口',
29
+ retryButton: '重新登录',
30
+ cancelButton: '取消',
31
+ closeButton: '关闭'
32
+ };
33
+ const SigninDialog = observer((props) => {
34
+ const { service, texts } = props;
35
+ // 禁止关闭弹窗,防止用户误操作
36
+ const preventClose = () => {
37
+ // 不执行任何操作,阻止关闭
38
+ };
39
+ // 重新打开登录窗口
40
+ const handleReopenWindow = () => {
41
+ if (service.signinUrl) {
42
+ openSigninWindow(service.signinUrl);
43
+ }
44
+ };
45
+ // 取消登录
46
+ const handleCancel = () => {
47
+ service.cancel();
48
+ };
49
+ // 关闭弹窗
50
+ const handleClose = () => {
51
+ service.closeDialog();
52
+ };
53
+ // 重新开始登录
54
+ const handleRetry = async () => {
55
+ const url = await service.start();
56
+ if (url) {
57
+ openSigninWindow(url);
58
+ }
59
+ };
60
+ /**
61
+ * 打开登录窗口
62
+ */
63
+ const openSigninWindow = (url) => {
64
+ window.open(url, '_blank');
65
+ };
66
+ /**
67
+ * Opening 状态 - 正在打开登录窗口
68
+ */
69
+ const OpeningState = () => (_jsxs(motion.div, { initial: { opacity: 0, scale: 0.9 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.9 }, transition: { duration: 0.2 }, className: "flex flex-col items-center gap-4", children: [_jsxs("div", { className: "relative flex items-center justify-center mb-8", children: [_jsx(motion.div, { className: "absolute size-16 rounded-full border-4 border-transparent border-t-emerald-600 border-r-emerald-600", animate: { rotate: 360 }, transition: { duration: 1, repeat: Infinity, ease: 'linear' } }), _jsx(motion.div, { className: "absolute size-12 rounded-full border-4 border-transparent border-b-emerald-400 border-l-emerald-400", animate: { rotate: -360 }, transition: { duration: 1.5, repeat: Infinity, ease: 'linear' } }), _jsx(motion.div, { className: "size-3 rounded-full bg-emerald-600", animate: {
70
+ scale: [1, 1.2, 1],
71
+ opacity: [1, 0.7, 1]
72
+ }, transition: { duration: 1, repeat: Infinity } })] }), _jsx(motion.p, { initial: { opacity: 0 }, animate: { opacity: 1 }, transition: { delay: 0.1 }, className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: texts.openingDescription }), _jsxs(motion.div, { initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, transition: { delay: 0.2 }, className: "mt-2 flex gap-2", children: [_jsx(Button, { color: "emerald", onClick: handleReopenWindow, children: texts.reopenButton }), _jsx(Button, { outline: true, onClick: handleCancel, children: texts.cancelButton })] })] }, "opening"));
73
+ /**
74
+ * Waiting 状态 - 等待用户登录
75
+ */
76
+ const WaitingState = () => (_jsxs(motion.div, { initial: { opacity: 0, scale: 0.9 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.9 }, transition: { duration: 0.2 }, className: "flex flex-col items-center gap-4", children: [_jsxs("div", { className: "relative mb-2", children: [_jsx(motion.div, { className: "size-16 rounded-full border-4 border-emerald-200 dark:border-emerald-900", animate: { scale: [1, 1.1, 1] }, transition: { duration: 2, repeat: Infinity } }), _jsx(motion.div, { className: "absolute inset-0 size-16 rounded-full border-4 border-emerald-400", animate: { scale: [1, 1.3, 1], opacity: [0.75, 0, 0.75] }, transition: { duration: 2, repeat: Infinity } }), _jsx(motion.svg, { className: "absolute inset-0 m-auto size-8 text-emerald-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", initial: { scale: 0 }, animate: { scale: 1 }, transition: { delay: 0.1 }, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) })] }), _jsx("p", { className: "text-base font-semibold text-slate-900 dark:text-slate-100", children: texts.waitingDescription }), _jsx("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: texts.waitingHint }), _jsxs("div", { className: "mt-2 flex gap-2", children: [_jsx(Button, { color: "emerald", onClick: handleReopenWindow, children: texts.reopenButton }), _jsx(Button, { outline: true, onClick: handleCancel, children: texts.cancelButton })] })] }, "waiting"));
77
+ /**
78
+ * Success 状态 - 登录成功
79
+ */
80
+ const SuccessState = () => (_jsxs(motion.div, { initial: { opacity: 0, scale: 0.5 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.5 }, transition: { duration: 0.3, type: 'spring' }, className: "flex flex-col items-center gap-4", children: [_jsx(motion.div, { className: "mb-2", initial: { scale: 0 }, animate: { scale: 1 }, transition: { delay: 0.1, type: 'spring', stiffness: 200 }, children: _jsx(CheckCircleIcon, { className: "size-16 text-emerald-600 dark:text-emerald-400" }) }), _jsx(motion.p, { initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, transition: { delay: 0.2 }, className: "text-base font-semibold text-emerald-600 dark:text-emerald-400", children: texts.successDescription })] }, "success"));
81
+ /**
82
+ * Error 状态 - 登录失败
83
+ */
84
+ const ErrorState = () => (_jsxs(motion.div, { initial: { opacity: 0, scale: 0.9 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.9 }, transition: { duration: 0.2 }, className: "flex flex-col items-center gap-4", children: [_jsx(motion.div, { className: "mb-2", initial: { scale: 0 }, animate: { scale: 1, rotate: [0, -10, 10, -10, 0] }, transition: { scale: { delay: 0.1 }, rotate: { delay: 0.2, duration: 0.5 } }, children: _jsx(XCircleIcon, { className: "size-16 text-red-600 dark:text-red-400" }) }), _jsx("p", { className: "text-base font-semibold text-red-600 dark:text-red-400", children: service.errorMessage || texts.errorDescription }), _jsxs("div", { className: "mt-2 flex gap-2", children: [_jsx(Button, { color: "emerald", onClick: handleRetry, children: texts.retryButton }), _jsx(Button, { outline: true, onClick: handleClose, children: texts.closeButton })] })] }, "error"));
85
+ /**
86
+ * Cancelled 状态 - 用户取消登录
87
+ */
88
+ const CancelledState = () => (_jsxs(motion.div, { initial: { opacity: 0, scale: 0.9 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.9 }, transition: { duration: 0.2 }, className: "flex flex-col items-center gap-4", children: [_jsx(motion.div, { className: "mb-2", initial: { scale: 0 }, animate: { scale: 1 }, transition: { delay: 0.1, type: 'spring' }, children: _jsx(ExclamationTriangleIcon, { className: "size-16 text-amber-600 dark:text-amber-400" }) }), _jsx("p", { className: "text-base font-semibold text-amber-600 dark:text-amber-400", children: texts.cancelledDescription }), _jsxs("div", { className: "mt-2 flex gap-2", children: [_jsx(Button, { color: "emerald", onClick: handleRetry, children: texts.retryButton }), _jsx(Button, { outline: true, onClick: handleClose, children: texts.closeButton })] })] }, "cancelled"));
89
+ /**
90
+ * Expired 状态 - 票据过期
91
+ */
92
+ const ExpiredState = () => (_jsxs(motion.div, { initial: { opacity: 0, scale: 0.9 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.9 }, transition: { duration: 0.2 }, className: "flex flex-col items-center gap-4", children: [_jsx(motion.div, { className: "mb-2", initial: { scale: 0 }, animate: { scale: 1 }, transition: { delay: 0.1, type: 'spring' }, children: _jsx(ClockIcon, { className: "size-16 text-orange-600 dark:text-orange-400" }) }), _jsx("p", { className: "text-base font-semibold text-orange-600 dark:text-orange-400", children: texts.expiredDescription }), _jsxs("div", { className: "mt-2 flex gap-2", children: [_jsx(Button, { color: "emerald", onClick: handleRetry, children: texts.retryButton }), _jsx(Button, { outline: true, onClick: handleClose, children: texts.closeButton })] })] }, "expired"));
93
+ return (_jsx(Dialog, { open: service.isDialogOpen, onClose: preventClose, children: _jsx(DialogBody, { children: _jsx("div", { className: "flex flex-col items-center justify-center py-8", children: _jsxs(AnimatePresence, { mode: "wait", children: [service.dialogStatus === 'opening' && _jsx(OpeningState, {}), service.dialogStatus === 'waiting' && _jsx(WaitingState, {}), service.dialogStatus === 'success' && _jsx(SuccessState, {}), service.dialogStatus === 'error' && _jsx(ErrorState, {}), service.dialogStatus === 'cancelled' && _jsx(CancelledState, {}), service.dialogStatus === 'expired' && _jsx(ExpiredState, {})] }) }) }) }));
94
+ });
95
+ export const SigninDialogProvider = observer((props) => {
96
+ const { children, apis: apiConfig, texts: customTexts } = props;
97
+ // 创建服务实例,使用 useRef 保持引用稳定
98
+ const signinService = React.useRef();
99
+ if (!signinService.current) {
100
+ signinService.current = new SigninService(apiConfig);
101
+ signinService.current.init();
102
+ }
103
+ // 合并默认文案和自定义文案
104
+ const texts = React.useMemo(() => (Object.assign(Object.assign({}, defaultTexts), customTexts)), [customTexts]);
105
+ const handleSignin = React.useCallback(async () => {
106
+ var _a;
107
+ const url = await ((_a = signinService.current) === null || _a === void 0 ? void 0 : _a.start());
108
+ if (url) {
109
+ window.open(url, '_blank');
110
+ }
111
+ }, []);
112
+ const contextValue = React.useMemo(() => ({
113
+ signin: handleSignin
114
+ }), [handleSignin]);
115
+ return (_jsx(SigninContext.Provider, { value: contextValue, children: _jsxs(ServiceProvider, { services: [{ provide: SigninService, useValue: signinService.current }], children: [children, signinService.current && _jsx(SigninDialog, { service: signinService.current, texts: texts })] }) }));
116
+ });
117
+ export { useSignin as useSignin } from './context';
@@ -0,0 +1,92 @@
1
+ import { Service } from '@taicode/common-base';
2
+ import type { SigninApi, SigninStatus } from './types';
3
+ export type SigninDialogStatus = 'idle' | 'opening' | 'waiting' | 'success' | 'error' | 'cancelled' | 'expired';
4
+ /**
5
+ * 登录服务配置
6
+ */
7
+ export interface SigninServiceConfig {
8
+ /** 票据轮询间隔(毫秒),默认 2000ms */
9
+ pollInterval?: number;
10
+ /** 错误自动关闭延迟(毫秒),默认 3000ms */
11
+ errorAutoCloseDelay?: number;
12
+ /** 成功状态显示时长(毫秒),默认 1500ms */
13
+ successDisplayDuration?: number;
14
+ }
15
+ export declare class SigninService extends Service {
16
+ accessor inited: boolean;
17
+ private isPolling;
18
+ private readonly disposer;
19
+ private readonly apiConfig;
20
+ private readonly config;
21
+ private pollingTimer;
22
+ private accessor check;
23
+ private accessor ticket;
24
+ accessor dialogStatus: SigninDialogStatus;
25
+ accessor errorMessage: string;
26
+ constructor(apiConfig: SigninApi, config?: SigninServiceConfig);
27
+ get status(): SigninStatus | null;
28
+ get signinUrl(): string | null;
29
+ get isDialogOpen(): boolean;
30
+ get hasActiveTicket(): boolean;
31
+ /**
32
+ * 检查票据是否过期
33
+ */
34
+ private isTicketExpired;
35
+ /**
36
+ * 保存状态到 localStorage
37
+ */
38
+ private saveState;
39
+ /**
40
+ * 从 localStorage 恢复状态
41
+ */
42
+ private restoreState;
43
+ /**
44
+ * 清理持久化状态
45
+ */
46
+ private clearPersistedState;
47
+ /**
48
+ * 设置错误状态
49
+ */
50
+ private setError;
51
+ /**
52
+ * 停止票据状态轮询
53
+ */
54
+ private stopPolling;
55
+ /**
56
+ * 处理认证成功
57
+ */
58
+ private handleAuthSuccess;
59
+ /**
60
+ * 轮询检查票据状态
61
+ */
62
+ private watchTicketStatus;
63
+ /**
64
+ * 安排下一次轮询
65
+ */
66
+ private scheduleNextPoll;
67
+ /**
68
+ * 开始登录流程
69
+ */
70
+ start(): Promise<string | null>;
71
+ /**
72
+ * 关闭对话框
73
+ */
74
+ closeDialog(): Promise<void>;
75
+ /**
76
+ * 取消登录流程
77
+ */
78
+ cancel(): Promise<void>;
79
+ /**
80
+ * 初始化服务
81
+ */
82
+ init(): Promise<boolean>;
83
+ /**
84
+ * 清理资源
85
+ */
86
+ private cleanup;
87
+ /**
88
+ * 销毁服务
89
+ */
90
+ dispose(): void;
91
+ }
92
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../source/signin/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAsB,MAAM,sBAAsB,CAAA;AAElE,OAAO,KAAK,EAAE,SAAS,EAAwC,YAAY,EAAE,MAAM,SAAS,CAAA;AAE5F,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAA;AAE/G;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6BAA6B;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,6BAA6B;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAoBD,qBAAa,aAAc,SAAQ,OAAO;IACxC,SACgB,MAAM,EAAE,OAAO,CAAQ;IAEvC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,YAAY,CAA6C;IAGjE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IAGvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IAGxD,SACgB,YAAY,EAAE,kBAAkB,CAAS;IAEzD,SACgB,YAAY,EAAE,MAAM,CAAK;gBAE7B,SAAS,EAAE,SAAS,EAAE,MAAM,GAAE,mBAAwB;IAMlE,IACW,MAAM,IAAI,YAAY,GAAG,IAAI,CAIvC;IAED,IACW,SAAS,IAAI,MAAM,GAAG,IAAI,CAEpC;IAED,IACW,YAAY,IAAI,OAAO,CAEjC;IAED,IACW,eAAe,IAAI,OAAO,CAEpC;IAED;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAehB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;YACW,iBAAiB;IAyB/B;;OAEG;YACW,iBAAiB;IA4G/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IAEG,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+CrC;;OAEG;IAEG,WAAW;IASjB;;OAEG;IAEG,MAAM;IAqBZ;;OAEG;IAEU,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IA8BrC;;OAEG;IACH,OAAO,CAAC,OAAO;IAWf;;OAEG;IACI,OAAO;CAIf"}