@awiki/dsh-plugin 0.3.7 → 0.3.11-rc.1

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 (227) hide show
  1. package/README.md +112 -73
  2. package/README.zh.md +91 -62
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/cordis.patch.yml +6 -5
  5. package/lib/builtin-tenants.json +22 -0
  6. package/lib/builtin-tenants.sha256 +1 -0
  7. package/lib/client.js +9281 -2379
  8. package/lib/client.js.map +1 -1
  9. package/lib/index.js +3553 -1138
  10. package/lib/model-proxy-contract.js +19 -11
  11. package/lib/provider.js +73 -17
  12. package/lib/{sdk-adapter--trNlr-T.mjs → sdk-adapter-CYcJH7sM.mjs} +374 -101
  13. package/lib/typert.host.js +1595 -168
  14. package/lib/typert.remote-client.d.ts +43 -7
  15. package/lib/typert.remote-client.d.ts.map +1 -1
  16. package/lib/typert.remote-client.js +1595 -168
  17. package/lib/types/builtin-tenant-config.d.ts +19 -0
  18. package/lib/types/builtin-tenant-config.d.ts.map +1 -0
  19. package/lib/types/builtin-tenant-config.js +57 -0
  20. package/lib/types/builtin-tenant-config.js.map +1 -0
  21. package/lib/types/client/AwikiDeviceJoinReminder.d.ts +15 -0
  22. package/lib/types/client/AwikiDeviceJoinReminder.d.ts.map +1 -0
  23. package/lib/types/client/AwikiDeviceJoinReminder.js +74 -0
  24. package/lib/types/client/AwikiDeviceJoinReminder.js.map +1 -0
  25. package/lib/types/client/AwikiDevices.d.ts +33 -0
  26. package/lib/types/client/AwikiDevices.d.ts.map +1 -0
  27. package/lib/types/client/AwikiDevices.js +141 -0
  28. package/lib/types/client/AwikiDevices.js.map +1 -0
  29. package/lib/types/client/AwikiGroupDetails.d.ts.map +1 -1
  30. package/lib/types/client/AwikiGroupDetails.js +16 -13
  31. package/lib/types/client/AwikiGroupDetails.js.map +1 -1
  32. package/lib/types/client/AwikiIdentityAccess.d.ts +17 -8
  33. package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
  34. package/lib/types/client/AwikiIdentityAccess.js +269 -37
  35. package/lib/types/client/AwikiIdentityAccess.js.map +1 -1
  36. package/lib/types/client/AwikiIntegrationSettings.d.ts +21 -0
  37. package/lib/types/client/AwikiIntegrationSettings.d.ts.map +1 -0
  38. package/lib/types/client/AwikiIntegrationSettings.js +105 -0
  39. package/lib/types/client/AwikiIntegrationSettings.js.map +1 -0
  40. package/lib/types/client/AwikiMail.d.ts +1 -1
  41. package/lib/types/client/AwikiMail.d.ts.map +1 -1
  42. package/lib/types/client/AwikiMail.js +17 -137
  43. package/lib/types/client/AwikiMail.js.map +1 -1
  44. package/lib/types/client/AwikiOverlay.d.ts +0 -1
  45. package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
  46. package/lib/types/client/AwikiOverlay.js +26 -28
  47. package/lib/types/client/AwikiOverlay.js.map +1 -1
  48. package/lib/types/client/AwikiProfileCard.d.ts.map +1 -1
  49. package/lib/types/client/AwikiProfileCard.js +17 -18
  50. package/lib/types/client/AwikiProfileCard.js.map +1 -1
  51. package/lib/types/client/AwikiRecoveryForm.d.ts +6 -1
  52. package/lib/types/client/AwikiRecoveryForm.d.ts.map +1 -1
  53. package/lib/types/client/AwikiRecoveryForm.js +74 -30
  54. package/lib/types/client/AwikiRecoveryForm.js.map +1 -1
  55. package/lib/types/client/AwikiSettingsSection.d.ts +28 -13
  56. package/lib/types/client/AwikiSettingsSection.d.ts.map +1 -1
  57. package/lib/types/client/AwikiSettingsSection.js +93 -61
  58. package/lib/types/client/AwikiSettingsSection.js.map +1 -1
  59. package/lib/types/client/AwikiUpdates.d.ts +10 -0
  60. package/lib/types/client/AwikiUpdates.d.ts.map +1 -0
  61. package/lib/types/client/AwikiUpdates.js +57 -0
  62. package/lib/types/client/AwikiUpdates.js.map +1 -0
  63. package/lib/types/client/awiki-client-bridge.d.ts +2 -2
  64. package/lib/types/client/awiki-client-bridge.d.ts.map +1 -1
  65. package/lib/types/client/awiki-client-bridge.js +4 -1
  66. package/lib/types/client/awiki-client-bridge.js.map +1 -1
  67. package/lib/types/client/controller.d.ts +92 -44
  68. package/lib/types/client/controller.d.ts.map +1 -1
  69. package/lib/types/client/controller.js +761 -334
  70. package/lib/types/client/controller.js.map +1 -1
  71. package/lib/types/client/drafts.d.ts +31 -0
  72. package/lib/types/client/drafts.d.ts.map +1 -0
  73. package/lib/types/client/drafts.js +94 -0
  74. package/lib/types/client/drafts.js.map +1 -0
  75. package/lib/types/client/image-cache.d.ts +2 -2
  76. package/lib/types/client/image-cache.d.ts.map +1 -1
  77. package/lib/types/client/image-cache.js +15 -2
  78. package/lib/types/client/image-cache.js.map +1 -1
  79. package/lib/types/client/index.d.ts +1 -1
  80. package/lib/types/client/index.d.ts.map +1 -1
  81. package/lib/types/client/index.js +64 -19
  82. package/lib/types/client/index.js.map +1 -1
  83. package/lib/types/client/integration-operation.d.ts +9 -0
  84. package/lib/types/client/integration-operation.d.ts.map +1 -0
  85. package/lib/types/client/integration-operation.js +54 -0
  86. package/lib/types/client/integration-operation.js.map +1 -0
  87. package/lib/types/client/mail-list-cache.d.ts +2 -0
  88. package/lib/types/client/mail-list-cache.d.ts.map +1 -1
  89. package/lib/types/client/mail-list-cache.js +18 -0
  90. package/lib/types/client/mail-list-cache.js.map +1 -1
  91. package/lib/types/client/otp-cooldown.d.ts +7 -0
  92. package/lib/types/client/otp-cooldown.d.ts.map +1 -0
  93. package/lib/types/client/otp-cooldown.js +29 -0
  94. package/lib/types/client/otp-cooldown.js.map +1 -0
  95. package/lib/types/client/settings-controller.d.ts +38 -2
  96. package/lib/types/client/settings-controller.d.ts.map +1 -1
  97. package/lib/types/client/settings-controller.js +206 -10
  98. package/lib/types/client/settings-controller.js.map +1 -1
  99. package/lib/types/client/settings-locales.d.ts +1 -1
  100. package/lib/types/client/settings-locales.d.ts.map +1 -1
  101. package/lib/types/client/settings-locales.js +192 -14
  102. package/lib/types/client/settings-locales.js.map +1 -1
  103. package/lib/types/client/slots.d.ts +21 -10
  104. package/lib/types/client/slots.d.ts.map +1 -1
  105. package/lib/types/client/slots.js +0 -1
  106. package/lib/types/client/slots.js.map +1 -1
  107. package/lib/types/client/store.d.ts +1 -1
  108. package/lib/types/client/store.d.ts.map +1 -1
  109. package/lib/types/client/store.js +1 -1
  110. package/lib/types/client/store.js.map +1 -1
  111. package/lib/types/conversation-preferences.d.ts.map +1 -1
  112. package/lib/types/conversation-preferences.js +0 -17
  113. package/lib/types/conversation-preferences.js.map +1 -1
  114. package/lib/types/desktop-distribution.d.ts +25 -0
  115. package/lib/types/desktop-distribution.d.ts.map +1 -0
  116. package/lib/types/desktop-distribution.js +57 -0
  117. package/lib/types/desktop-distribution.js.map +1 -0
  118. package/lib/types/domain.d.ts +1 -1
  119. package/lib/types/domain.d.ts.map +1 -1
  120. package/lib/types/domain.js +2 -1
  121. package/lib/types/domain.js.map +1 -1
  122. package/lib/types/index.d.ts +165 -41
  123. package/lib/types/index.d.ts.map +1 -1
  124. package/lib/types/index.js +1594 -535
  125. package/lib/types/index.js.map +1 -1
  126. package/lib/types/integration-client.d.ts +17 -0
  127. package/lib/types/integration-client.d.ts.map +1 -0
  128. package/lib/types/integration-client.js +233 -0
  129. package/lib/types/integration-client.js.map +1 -0
  130. package/lib/types/legacy-sent-mail-cache.d.ts +4 -0
  131. package/lib/types/legacy-sent-mail-cache.d.ts.map +1 -0
  132. package/lib/types/legacy-sent-mail-cache.js +29 -0
  133. package/lib/types/legacy-sent-mail-cache.js.map +1 -0
  134. package/lib/types/listener-state.d.ts +5 -3
  135. package/lib/types/listener-state.d.ts.map +1 -1
  136. package/lib/types/listener-state.js +28 -13
  137. package/lib/types/listener-state.js.map +1 -1
  138. package/lib/types/listener.d.ts +9 -32
  139. package/lib/types/listener.d.ts.map +1 -1
  140. package/lib/types/listener.js +13 -128
  141. package/lib/types/listener.js.map +1 -1
  142. package/lib/types/mail-list-client.d.ts +12 -0
  143. package/lib/types/mail-list-client.d.ts.map +1 -0
  144. package/lib/types/mail-list-client.js +254 -0
  145. package/lib/types/mail-list-client.js.map +1 -0
  146. package/lib/types/mail-recovery-observability.d.ts +8 -0
  147. package/lib/types/mail-recovery-observability.d.ts.map +1 -0
  148. package/lib/types/mail-recovery-observability.js +119 -0
  149. package/lib/types/mail-recovery-observability.js.map +1 -0
  150. package/lib/types/mail.d.ts +2 -28
  151. package/lib/types/mail.d.ts.map +1 -1
  152. package/lib/types/mail.js +2 -79
  153. package/lib/types/mail.js.map +1 -1
  154. package/lib/types/model-proxy-contract.d.ts +8 -8
  155. package/lib/types/model-proxy-contract.d.ts.map +1 -1
  156. package/lib/types/model-proxy-contract.js +15 -8
  157. package/lib/types/model-proxy-contract.js.map +1 -1
  158. package/lib/types/package-version.generated.d.ts +4 -0
  159. package/lib/types/package-version.generated.d.ts.map +1 -0
  160. package/lib/types/package-version.generated.js +4 -0
  161. package/lib/types/package-version.generated.js.map +1 -0
  162. package/lib/types/profile-state.d.ts +2 -13
  163. package/lib/types/profile-state.d.ts.map +1 -1
  164. package/lib/types/profile-state.js +3 -20
  165. package/lib/types/profile-state.js.map +1 -1
  166. package/lib/types/provider-api.d.ts +134 -43
  167. package/lib/types/provider-api.d.ts.map +1 -1
  168. package/lib/types/provider.d.ts +8 -2
  169. package/lib/types/provider.d.ts.map +1 -1
  170. package/lib/types/provider.js +76 -16
  171. package/lib/types/provider.js.map +1 -1
  172. package/lib/types/realtime-supervisor.d.ts +60 -0
  173. package/lib/types/realtime-supervisor.d.ts.map +1 -0
  174. package/lib/types/realtime-supervisor.js +255 -0
  175. package/lib/types/realtime-supervisor.js.map +1 -0
  176. package/lib/types/registration-policy.d.ts +7 -0
  177. package/lib/types/registration-policy.d.ts.map +1 -0
  178. package/lib/types/registration-policy.js +21 -0
  179. package/lib/types/registration-policy.js.map +1 -0
  180. package/lib/types/sdk-adapter.d.ts +62 -11
  181. package/lib/types/sdk-adapter.d.ts.map +1 -1
  182. package/lib/types/sdk-adapter.js +285 -123
  183. package/lib/types/sdk-adapter.js.map +1 -1
  184. package/lib/types/settings-rpc-contract.d.ts +63 -5
  185. package/lib/types/settings-rpc-contract.d.ts.map +1 -1
  186. package/lib/types/settings-rpc-contract.js +108 -5
  187. package/lib/types/settings-rpc-contract.js.map +1 -1
  188. package/lib/types/settings-rpc.d.ts +14 -1
  189. package/lib/types/settings-rpc.d.ts.map +1 -1
  190. package/lib/types/settings-rpc.js +132 -3
  191. package/lib/types/settings-rpc.js.map +1 -1
  192. package/lib/types/settings-transport.d.ts +7 -0
  193. package/lib/types/settings-transport.d.ts.map +1 -0
  194. package/lib/types/settings-transport.js +52 -0
  195. package/lib/types/settings-transport.js.map +1 -0
  196. package/lib/types/tenant-registry.d.ts +74 -0
  197. package/lib/types/tenant-registry.d.ts.map +1 -0
  198. package/lib/types/tenant-registry.js +440 -0
  199. package/lib/types/tenant-registry.js.map +1 -0
  200. package/lib/types/tools.d.ts +1 -1
  201. package/lib/types/tools.d.ts.map +1 -1
  202. package/lib/types/tools.js +4 -20
  203. package/lib/types/tools.js.map +1 -1
  204. package/lib/types/types.d.ts +249 -66
  205. package/lib/types/types.d.ts.map +1 -1
  206. package/lib/types/types.js.map +1 -1
  207. package/lib/types/update-policy.d.ts +51 -0
  208. package/lib/types/update-policy.d.ts.map +1 -0
  209. package/lib/types/update-policy.js +379 -0
  210. package/lib/types/update-policy.js.map +1 -0
  211. package/lib/types/version.d.ts +4 -0
  212. package/lib/types/version.d.ts.map +1 -0
  213. package/lib/types/version.js +44 -0
  214. package/lib/types/version.js.map +1 -0
  215. package/package.json +88 -61
  216. package/lib/types/base64.d.ts +0 -4
  217. package/lib/types/base64.d.ts.map +0 -1
  218. package/lib/types/base64.js +0 -28
  219. package/lib/types/base64.js.map +0 -1
  220. package/lib/types/client/mail-attachment.d.ts +0 -40
  221. package/lib/types/client/mail-attachment.d.ts.map +0 -1
  222. package/lib/types/client/mail-attachment.js +0 -187
  223. package/lib/types/client/mail-attachment.js.map +0 -1
  224. package/lib/types/sent-mail-store.d.ts +0 -27
  225. package/lib/types/sent-mail-store.d.ts.map +0 -1
  226. package/lib/types/sent-mail-store.js +0 -348
  227. package/lib/types/sent-mail-store.js.map +0 -1
@@ -1,5 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from 'react';
2
+ import { useRecoveryOtpCooldown } from "./otp-cooldown.js";
3
+ import { useDraftState } from "./drafts.js";
4
+ import { useEffect, useRef } from 'react';
3
5
  import { IconCheckOutline16, IconLoadingOutline16, IconRefreshOutline16, IconUserOutline16, IconWarningOutline16, } from '@deepseek-ai/dsh-client-ui-primitives';
4
6
  import { AwikiIdentityPage } from "./AwikiIdentityPage.js";
5
7
  import css from './AwikiOverlay.module.css';
@@ -15,7 +17,7 @@ function phaseLabel(phase) {
15
17
  }
16
18
  }
17
19
  function canResume(progress) {
18
- return progress.retryable || ['remote_outcome_unknown', 'remote_committed', 'identity_transition_pending'].includes(progress.phase);
20
+ return progress.allowedActions?.includes('resume') === true;
19
21
  }
20
22
  function maskedPhone(value) {
21
23
  const normalized = value.replace(/[\s()-]/g, '');
@@ -24,53 +26,64 @@ function maskedPhone(value) {
24
26
  return `${normalized.slice(0, 3)}****${normalized.slice(-4)}`;
25
27
  }
26
28
  function progressMessage(progress) {
29
+ if (progress.failureCode === 'local_transition_superseded')
30
+ return '此恢复操作已由更新的身份状态关闭。请返回身份入口重新检查当前身份。';
27
31
  switch (progress.phase) {
28
32
  case 'remote_outcome_unknown': return '恢复请求已经提交,正在确认服务端结果。请不要重新发起恢复。';
29
33
  case 'remote_committed': return '身份已在服务端恢复,正在为当前设备更新本机凭证。';
30
34
  case 'identity_transition_pending': return '身份已在服务端恢复,本机切换尚未完成。请继续完成本机切换。';
31
35
  case 'quarantined_key_unavailable': return '新的本机凭证暂时不可用,请稍后重新检查恢复结果。';
32
36
  case 'applied': return '身份已经恢复完成。';
33
- default: return '正在处理身份恢复,请保持窗口打开。';
37
+ default: return '请根据当前状态继续操作,也可以返回入口稍后处理。';
34
38
  }
35
39
  }
36
40
  function RecoveryDiagnostics(props) {
37
41
  return (_jsxs("details", { className: css.recoveryDiagnostics, children: [_jsx("summary", { children: "\u8BCA\u65AD\u4FE1\u606F" }), _jsxs("dl", { children: [_jsxs("div", { children: [_jsx("dt", { children: "\u6062\u590D\u8BF7\u6C42\u7F16\u53F7" }), _jsx("dd", { children: _jsx("code", { children: props.operationId }) })] }), props.failureCode !== undefined && _jsxs("div", { children: [_jsx("dt", { children: "\u72B6\u6001\u4EE3\u7801" }), _jsx("dd", { children: _jsx("code", { children: props.failureCode }) })] })] })] }));
38
42
  }
39
- /** Status-first Handle recovery. Secret inputs remain inside the mounted form only. */
43
+ /** Status-first Handle recovery. Secret inputs stay in browser memory only. */
40
44
  export function AwikiRecoveryForm(props) {
45
+ const cooldown = useRecoveryOtpCooldown();
41
46
  const handle = useRef(null);
42
47
  const requestPhone = useRef(null);
43
48
  const factorPhone = useRef(null);
44
49
  const otp = useRef(null);
45
- const [commitAttempted, setCommitAttempted] = useState(false);
46
- const [factorContext, setFactorContext] = useState(null);
47
- const [notice, setNotice] = useState(null);
48
- const [error, setError] = useState(null);
49
- const effectiveFactorContext = factorContext ?? props.initialFactorContext ?? null;
50
+ const [handleDraft, setHandleDraft] = useDraftState('recovery:handle', props.fixedHandle ?? '');
51
+ const targetHandle = props.progress?.fullHandle ?? props.fixedHandle ?? props.initialFactorContext?.fullHandle ?? handleDraft;
52
+ const initialContext = props.initialFactorContext?.fullHandle === targetHandle ? props.initialFactorContext : undefined;
53
+ const [phoneDraft, setPhoneDraft] = useDraftState(`recovery:${targetHandle}:phone`, initialContext?.phone ?? '');
54
+ const [otpDraft, setOtpDraft] = useDraftState(`recovery:${props.operationId}:otp`, '');
55
+ const [autoAttempt, setAutoAttempt] = useDraftState(`recovery:${props.operationId}:autoAttempt`, false, false);
56
+ const [commitAttempted, setCommitAttempted] = useDraftState(`recovery:${props.operationId}:commitAttempted`, false, false);
57
+ const [factorContext, setFactorContext] = useDraftState(`recovery:${targetHandle}:factorContext`, null, false);
58
+ const [notice, setNotice] = useDraftState(`recovery:${props.operationId}:notice`, null, false);
59
+ const [error, setError] = useDraftState(`recovery:${props.operationId}:error`, null, false);
60
+ const effectiveFactorContext = factorContext ?? initialContext ?? null;
50
61
  useEffect(() => {
51
- setCommitAttempted(false);
52
62
  setNotice(null);
53
63
  setError(null);
54
64
  }, [props.operationId]);
65
+ useEffect(() => { cooldown.restore(props.retryAt); }, [cooldown.restore, props.retryAt]);
55
66
  useEffect(() => {
56
67
  const progress = props.progress;
57
68
  if (progress === null
69
+ || !canResume(progress)
58
70
  || progress.phase === 'awaiting_factor'
59
71
  || progress.phase === 'ready_to_commit'
60
72
  || progress.phase === 'applied'
61
73
  || progress.phase === 'quarantined_key_unavailable'
62
74
  || props.pending
75
+ || props.statusError
76
+ || autoAttempt
63
77
  || error !== null)
64
78
  return;
65
79
  const timer = setTimeout(() => {
80
+ setAutoAttempt(true);
66
81
  void (canResume(progress) ? resume() : refresh());
67
82
  }, 900);
68
83
  return () => { clearTimeout(timer); };
69
- }, [error, props.pending, props.progress]);
70
- const requestOtp = async () => {
84
+ }, [error, props.pending, props.progress, props.statusError, autoAttempt]);
85
+ const sendOtp = async (fullHandle, phone) => {
71
86
  setError(null);
72
- const fullHandle = props.fixedHandle?.trim() ?? handle.current?.value.trim() ?? '';
73
- const phone = requestPhone.current?.value.trim() ?? '';
74
87
  const result = await props.sendRecoveryOtp({
75
88
  fullHandle,
76
89
  phone,
@@ -79,19 +92,38 @@ export function AwikiRecoveryForm(props) {
79
92
  setError(result.error);
80
93
  return;
81
94
  }
95
+ cooldown.start(result.value.retryAfterSeconds);
96
+ setOtpDraft('');
82
97
  setFactorContext({ fullHandle: result.value.fullHandle, phone });
83
98
  setNotice('恢复验证码已发送。');
84
99
  };
100
+ const requestOtp = async () => {
101
+ const fullHandle = props.fixedHandle?.trim() ?? handleDraft.trim();
102
+ const phone = phoneDraft.trim();
103
+ const continued = await props.continueRecoveryForHandle?.(fullHandle);
104
+ if (continued !== undefined && !continued.ok)
105
+ return setError(continued.error);
106
+ if (continued?.ok && continued.value)
107
+ return;
108
+ await sendOtp(fullHandle, phone);
109
+ };
110
+ const resendOtp = async () => {
111
+ if (props.progress?.allowedActions?.includes('request_otp') !== true || props.pending)
112
+ return;
113
+ const fullHandle = effectiveFactorContext?.fullHandle ?? props.progress?.fullHandle;
114
+ if (fullHandle === undefined)
115
+ return;
116
+ await sendOtp(fullHandle, effectiveFactorContext?.phone ?? phoneDraft.trim());
117
+ };
85
118
  const prepare = async () => {
119
+ if (props.progress?.allowedActions?.includes('prepare') !== true || props.pending)
120
+ return;
86
121
  setError(null);
87
122
  const result = await props.prepareRecovery({
88
- phone: effectiveFactorContext?.phone ?? factorPhone.current?.value.trim() ?? '',
89
- otp: otp.current?.value.trim() ?? '',
123
+ phone: effectiveFactorContext?.phone ?? phoneDraft.trim(),
124
+ otp: otpDraft.trim(),
90
125
  });
91
- if (factorPhone.current !== null)
92
- factorPhone.current.value = '';
93
- if (otp.current !== null)
94
- otp.current.value = '';
126
+ setOtpDraft('');
95
127
  if (!result.ok) {
96
128
  setError(result.error);
97
129
  return;
@@ -99,6 +131,8 @@ export function AwikiRecoveryForm(props) {
99
131
  setNotice(null);
100
132
  };
101
133
  const activate = async () => {
134
+ if (props.progress?.allowedActions?.includes('activate') !== true || props.pending)
135
+ return;
102
136
  setCommitAttempted(true);
103
137
  setError(null);
104
138
  const result = await props.activateRecovery();
@@ -113,7 +147,7 @@ export function AwikiRecoveryForm(props) {
113
147
  setError(result.error);
114
148
  return;
115
149
  }
116
- if (result.value.phase === 'ready_to_commit')
150
+ if (result.value.allowedActions?.includes('discard_pre_attempt'))
117
151
  setCommitAttempted(false);
118
152
  };
119
153
  const resume = async () => {
@@ -123,30 +157,40 @@ export function AwikiRecoveryForm(props) {
123
157
  setError(result.error);
124
158
  return;
125
159
  }
126
- if (result.value.phase === 'ready_to_commit')
160
+ if (result.value.allowedActions?.includes('discard_pre_attempt'))
127
161
  setCommitAttempted(false);
128
162
  };
129
163
  const discard = async () => {
164
+ if (props.progress?.allowedActions?.includes('discard_pre_attempt') !== true || props.pending)
165
+ return;
130
166
  setError(null);
131
167
  const result = await props.discardRecovery();
132
168
  if (!result.ok) {
133
169
  setError(result.error);
134
170
  return;
135
171
  }
172
+ setHandleDraft('');
173
+ setPhoneDraft('');
174
+ setOtpDraft('');
175
+ setFactorContext(null);
136
176
  props.onExit?.();
137
177
  };
138
178
  if (props.operationId === null) {
139
- return (_jsx(AwikiIdentityPage, { ...props.onExit === undefined ? {} : { onBack: props.onExit }, backLabel: props.onExitLabel ?? '返回本机身份', backDisabled: props.pending, children: _jsxs("form", { className: css.recoveryForm, onSubmit: (event) => { event.preventDefault(); void requestOtp(); }, children: [_jsx("div", { className: css.registrationIcon, children: _jsx(IconUserOutline16, { size: 24 }) }), _jsx("h3", { children: props.requestTitle ?? '恢复已有身份' }), _jsx("p", { children: props.requestDescription ?? '输入原来的完整 Handle 和绑定手机号,我们会发送验证码来确认身份归属。' }), props.fixedHandle === undefined
140
- ? _jsxs("label", { children: ["\u5B8C\u6574 Handle", _jsx("input", { ref: handle, autoComplete: "username", placeholder: "\u4F8B\u5982 alice.awiki.info", autoFocus: true })] })
141
- : (_jsxs("div", { className: css.recoveryIdentitySummary, children: [_jsx("span", { children: "\u5F53\u524D\u8EAB\u4EFD" }), _jsx("strong", { children: props.fixedHandle })] })), _jsxs("label", { children: ["\u7ED1\u5B9A\u624B\u673A\u53F7", _jsx("input", { ref: requestPhone, type: "tel", autoComplete: "tel", autoFocus: props.fixedHandle !== undefined })] }), _jsx("button", { type: "submit", className: css.primary, disabled: props.pending, children: "\u83B7\u53D6\u6062\u590D\u9A8C\u8BC1\u7801" }), error !== null && _jsx("small", { className: css.inlineError, role: "alert", children: error })] }) }));
179
+ return (_jsx(AwikiIdentityPage, { ...props.onExit === undefined ? {} : { onBack: props.onExit }, backLabel: props.onExitLabel ?? '返回身份入口', backDisabled: false, children: _jsxs("form", { className: css.recoveryForm, onSubmit: (event) => { event.preventDefault(); void requestOtp(); }, children: [_jsx("div", { className: css.registrationIcon, children: _jsx(IconUserOutline16, { size: 24 }) }), _jsx("h3", { children: props.requestTitle ?? '恢复已有身份' }), _jsx("p", { children: props.requestDescription ?? '输入原来的完整 Handle 和绑定手机号。发送验证码会开始一次替换 DID 的恢复,使其他设备的旧凭证失效。' }), props.fixedHandle === undefined
180
+ ? _jsxs("label", { children: ["\u5B8C\u6574 Handle", _jsx("input", { ref: handle, value: handleDraft, onChange: event => { setHandleDraft(event.target.value); }, autoComplete: "username", placeholder: "\u4F8B\u5982 alice.awiki.info", autoFocus: true })] })
181
+ : (_jsxs("div", { className: css.recoveryIdentitySummary, children: [_jsx("span", { children: "\u5F53\u524D\u8EAB\u4EFD" }), _jsx("strong", { children: props.fixedHandle })] })), _jsxs("label", { children: ["\u7ED1\u5B9A\u624B\u673A\u53F7", _jsx("input", { ref: requestPhone, value: phoneDraft, onChange: event => { setPhoneDraft(event.target.value); }, type: "tel", autoComplete: "tel", autoFocus: props.fixedHandle !== undefined })] }), _jsx("button", { type: "submit", className: css.primary, disabled: props.pending || cooldown.seconds > 0 || phoneDraft.trim() === '', children: "\u53D1\u9001\u6062\u590D\u9A8C\u8BC1\u7801\u5E76\u66FF\u6362 DID" }), (error ?? props.requestError) && _jsx("small", { className: css.inlineError, role: "alert", children: error ?? props.requestError })] }) }));
182
+ }
183
+ if (props.progress === null || props.statusError) {
184
+ return _jsx(AwikiIdentityPage, { ...props.onExit === undefined ? {} : { onBack: props.onExit }, backLabel: props.onExitLabel ?? '返回身份入口', children: _jsxs("div", { className: css.recoveryForm, children: [_jsx("h3", { children: "\u786E\u8BA4\u4E0A\u6B21\u6062\u590D\u7684\u8FDB\u5EA6" }), _jsx("p", { children: "\u8BF7\u5148\u786E\u8BA4\u6062\u590D\u72B6\u6001\uFF0C\u65E0\u9700\u91CD\u65B0\u53D1\u8D77\u6062\u590D\u3002" }), _jsx("p", { children: "\u6062\u590D\u8FDB\u5EA6\u5DF2\u4FDD\u7559\u3002\u8FD4\u56DE\u4E0D\u4F1A\u64A4\u9500\u5DF2\u63D0\u4EA4\u7684\u6062\u590D\u3002" }), (error ?? props.statusError) && _jsx("p", { role: "alert", children: error ?? props.statusError }), _jsx("button", { type: "button", className: css.primary, disabled: props.pending, onClick: () => { void refresh(); }, children: "\u91CD\u65B0\u68C0\u67E5\u6062\u590D\u7ED3\u679C" })] }) });
142
185
  }
143
- if (props.progress === null || props.progress.phase === 'awaiting_factor') {
144
- return (_jsx(AwikiIdentityPage, { onBack: () => { void discard(); }, backLabel: "\u53D6\u6D88\u6062\u590D", backDisabled: props.pending || commitAttempted, children: _jsxs("form", { className: css.recoveryForm, onSubmit: (event) => { event.preventDefault(); void prepare(); }, children: [_jsx("div", { className: css.recoveryStatusLine, children: _jsx("span", { children: "\u6062\u590D\u8BF7\u6C42\u5DF2\u521B\u5EFA" }) }), _jsx("h3", { children: "\u9A8C\u8BC1\u8EAB\u4EFD\u5F52\u5C5E" }), _jsx("p", { children: "\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\uFF0C\u8BF7\u5B8C\u6210\u9A8C\u8BC1\u540E\u518D\u786E\u8BA4\u662F\u5426\u6062\u590D\u3002" }), _jsxs("div", { className: css.recoveryIdentitySummary, children: [_jsx("span", { children: "\u6062\u590D\u8EAB\u4EFD" }), _jsx("strong", { children: effectiveFactorContext?.fullHandle ?? props.progress?.fullHandle ?? '待确认' }), effectiveFactorContext !== null && _jsxs(_Fragment, { children: [_jsx("span", { children: "\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\u81F3" }), _jsx("strong", { children: maskedPhone(effectiveFactorContext.phone) })] })] }), effectiveFactorContext === null && (_jsxs("label", { children: ["\u7ED1\u5B9A\u624B\u673A\u53F7", _jsx("input", { ref: factorPhone, type: "tel", autoComplete: "tel", autoFocus: true })] })), _jsxs("label", { children: ["\u6062\u590D\u9A8C\u8BC1\u7801", _jsx("input", { ref: otp, inputMode: "numeric", autoComplete: "one-time-code", autoFocus: effectiveFactorContext !== null })] }), _jsx("button", { type: "submit", className: css.primary, disabled: props.pending, children: "\u9A8C\u8BC1\u6062\u590D\u4FE1\u606F" }), notice !== null && _jsx("small", { className: css.notice, role: "status", children: notice }), error !== null && _jsx("small", { className: css.inlineError, role: "alert", children: error }), _jsx(RecoveryDiagnostics, { operationId: props.operationId })] }) }));
186
+ if (props.progress.phase === 'awaiting_factor' || (props.progress.allowedActions?.includes('prepare') && !props.progress.allowedActions?.includes('activate'))) {
187
+ return (_jsx(AwikiIdentityPage, { ...props.onExit === undefined ? {} : { onBack: props.onExit }, backLabel: props.onExitLabel ?? '返回身份入口', children: _jsxs("form", { className: css.recoveryForm, onSubmit: (event) => { event.preventDefault(); void prepare(); }, children: [_jsx("div", { className: css.recoveryStatusLine, children: _jsx("span", { children: "\u6062\u590D\u8BF7\u6C42\u5DF2\u521B\u5EFA" }) }), _jsx("h3", { children: "\u9A8C\u8BC1\u8EAB\u4EFD\u5F52\u5C5E" }), _jsx("p", { children: "\u8BF7\u586B\u5199\u6536\u5230\u7684\u9A8C\u8BC1\u7801\u3002\u9A8C\u8BC1\u7801\u8FC7\u671F\u65F6\uFF0C\u53EF\u4EE5\u91CD\u65B0\u83B7\u53D6\u3002" }), _jsxs("div", { className: css.recoveryIdentitySummary, children: [_jsx("span", { children: "\u6062\u590D\u8EAB\u4EFD" }), _jsx("strong", { children: effectiveFactorContext?.fullHandle ?? props.progress?.fullHandle ?? '待确认' }), effectiveFactorContext !== null && _jsxs(_Fragment, { children: [_jsx("span", { children: "\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\u81F3" }), _jsx("strong", { children: maskedPhone(effectiveFactorContext.phone) })] })] }), effectiveFactorContext === null && (_jsxs("label", { children: ["\u7ED1\u5B9A\u624B\u673A\u53F7", _jsx("input", { ref: factorPhone, value: phoneDraft, onChange: event => { setPhoneDraft(event.target.value); }, type: "tel", autoComplete: "tel", autoFocus: true })] })), _jsxs("label", { children: ["\u6062\u590D\u9A8C\u8BC1\u7801", _jsx("input", { ref: otp, value: otpDraft, onChange: event => { setOtpDraft(event.target.value); }, inputMode: "numeric", autoComplete: "one-time-code", autoFocus: effectiveFactorContext !== null })] }), _jsx("button", { type: "submit", className: css.primary, disabled: props.pending || !props.progress.allowedActions?.includes('prepare'), children: "\u9A8C\u8BC1\u6062\u590D\u4FE1\u606F" }), (effectiveFactorContext !== null || props.progress.fullHandle !== '') && (_jsx("button", { type: "button", className: css.secondary, disabled: props.pending || !props.progress.allowedActions?.includes('request_otp') || cooldown.seconds > 0 || (effectiveFactorContext === null && phoneDraft.trim() === ''), onClick: () => { void resendOtp(); }, children: cooldown.seconds > 0 ? `${cooldown.seconds} 秒后重新获取恢复验证码` : '重新获取恢复验证码' })), notice !== null && _jsx("small", { className: css.notice, role: "status", children: notice }), error !== null && _jsx("small", { className: css.inlineError, role: "alert", children: error }), props.progress.allowedActions?.includes('discard_pre_attempt') && _jsx("button", { type: "button", className: css.secondary, disabled: props.pending, onClick: () => { void discard(); }, children: "\u53D6\u6D88\u6062\u590D" }), _jsx(RecoveryDiagnostics, { operationId: props.operationId })] }) }));
145
188
  }
146
189
  const progress = props.progress;
147
- const preCommit = progress.phase === 'ready_to_commit' && !commitAttempted;
148
- return (_jsx(AwikiIdentityPage, { ...preCommit ? { onBack: () => { void discard(); }, backLabel: '取消恢复', backDisabled: props.pending } : {}, live: preCommit ? 'off' : 'polite', children: _jsxs("div", { className: css.recoveryForm, children: [_jsx("div", { className: css.recoveryStatusLine, children: _jsx("span", { children: phaseLabel(progress.phase) }) }), _jsx("h3", { children: preCommit ? '确认恢复已有身份' : '身份恢复进度' }), _jsx("p", { className: css.recoveryHandle, children: progress.fullHandle }), _jsxs("div", { className: css.recoveryImpact, children: [_jsxs("p", { "data-tone": progress.localOrdinaryDataWillMigrate ? 'success' : 'neutral', children: [progress.localOrdinaryDataWillMigrate ? _jsx(IconCheckOutline16, { size: 14 }) : _jsx(IconWarningOutline16, { size: 14 }), "\u666E\u901A\u672C\u5730\u4F1A\u8BDD\u6570\u636E", progress.localOrdinaryDataWillMigrate ? '将迁移到恢复后的身份' : '不会迁移'] }), progress.unsupportedE2eeGroupCount > 0 && _jsxs("p", { "data-tone": "neutral", children: [_jsx(IconWarningOutline16, { size: 14 }), "\u6709 ", progress.unsupportedE2eeGroupCount, " \u4E2A\u52A0\u5BC6\u7FA4\u804A\u65E0\u6CD5\u81EA\u52A8\u8FC1\u79FB\u3002"] }), progress.unsupportedDidOnlyGroupCount > 0 && _jsxs("p", { "data-tone": "neutral", children: [_jsx(IconWarningOutline16, { size: 14 }), "\u6709 ", progress.unsupportedDidOnlyGroupCount, " \u4E2A\u4EC5 DID \u7FA4\u804A\u9700\u8981\u624B\u52A8\u5904\u7406\u3002"] })] }), preCommit ? (_jsxs(_Fragment, { children: [_jsx("p", { className: css.recoveryConfirmationCopy, children: "\u786E\u8BA4\u540E\uFF0C\u8FD9\u53F0\u8BBE\u5907\u5C06\u4F7F\u7528\u65B0\u7684\u672C\u673A\u51ED\u8BC1\u3002\u6062\u590D\u5F00\u59CB\u540E\u8BF7\u4FDD\u6301\u7A97\u53E3\u6253\u5F00\uFF0C\u4E0D\u8981\u91CD\u590D\u63D0\u4EA4\u3002" }), _jsx("button", { type: "button", className: css.primary, disabled: props.pending, onClick: () => { void activate(); }, children: "\u786E\u8BA4\u5E76\u6062\u590D\u8EAB\u4EFD" })] })) : (_jsxs("div", { className: css.recoveryProgressPanel, "aria-live": "polite", children: [error === null && progress.phase !== 'quarantined_key_unavailable' && _jsx(IconLoadingOutline16, { size: 18 }), _jsx("p", { children: progressMessage(progress) }), (error !== null || progress.phase === 'quarantined_key_unavailable') && (_jsxs("button", { type: "button", className: css.primary, disabled: props.pending, onClick: () => { void (canResume(progress) ? resume() : refresh()); }, children: [_jsx(IconRefreshOutline16, { size: 14 }), progress.phase === 'identity_transition_pending' || progress.phase === 'remote_committed'
190
+ const preCommit = progress.phase === 'ready_to_commit' && progress.allowedActions?.includes('activate') === true && !commitAttempted;
191
+ return (_jsx(AwikiIdentityPage, { ...props.onExit === undefined ? {} : { onBack: props.onExit }, backLabel: props.onExitLabel ?? '返回身份入口', live: preCommit ? 'off' : 'polite', children: _jsxs("div", { className: css.recoveryForm, children: [_jsx("div", { className: css.recoveryStatusLine, children: _jsx("span", { children: phaseLabel(progress.phase) }) }), _jsx("h3", { children: preCommit ? '确认恢复已有身份' : '身份恢复进度' }), _jsx("p", { className: css.recoveryHandle, children: progress.fullHandle }), _jsx("div", { className: css.recoveryImpact, children: _jsxs("p", { "data-tone": progress.localOrdinaryDataWillMigrate ? 'success' : 'neutral', children: [progress.localOrdinaryDataWillMigrate ? _jsx(IconCheckOutline16, { size: 14 }) : _jsx(IconWarningOutline16, { size: 14 }), "\u666E\u901A\u672C\u5730\u4F1A\u8BDD\u6570\u636E", progress.localOrdinaryDataWillMigrate ? '将迁移到恢复后的身份' : '不会迁移'] }) }), preCommit ? (_jsxs(_Fragment, { children: [_jsx("p", { className: css.recoveryConfirmationCopy, children: "\u786E\u8BA4\u540E\uFF0C\u8FD9\u53F0\u8BBE\u5907\u5C06\u4F7F\u7528\u65B0\u7684\u672C\u673A\u51ED\u8BC1\u3002\u8BF7\u52FF\u91CD\u590D\u63D0\u4EA4\uFF1B\u8FD4\u56DE\u5165\u53E3\u4E0D\u4F1A\u64A4\u9500\u5DF2\u63D0\u4EA4\u7684\u6062\u590D\u3002" }), _jsx("button", { type: "button", className: css.primary, disabled: props.pending, onClick: () => { void activate(); }, children: "\u786E\u8BA4\u5E76\u6062\u590D\u8EAB\u4EFD" })] })) : (_jsxs("div", { className: css.recoveryProgressPanel, "aria-live": "polite", children: [props.pending && _jsx(IconLoadingOutline16, { size: 18 }), _jsx("p", { children: progressMessage(progress) }), _jsx("p", { children: "\u6062\u590D\u8FDB\u5EA6\u5DF2\u4FDD\u7559\uFF0C\u53EF\u4EE5\u8FD4\u56DE\u5165\u53E3\u7A0D\u540E\u7EE7\u7EED\u3002" }), progress.phase === 'applied' && progress.allowedActions?.includes('activate_identity') && _jsx("button", { type: "button", className: css.primary, disabled: props.pending, onClick: () => { void props.enterRecoveredSession?.().then(result => { if (!result.ok)
192
+ setError(result.error); }); }, children: "\u8FDB\u5165 AWiki" }), progress.phase !== 'applied' && (_jsxs("button", { type: "button", className: css.primary, disabled: props.pending, onClick: () => { void (canResume(progress) ? resume() : refresh()); }, children: [_jsx(IconRefreshOutline16, { size: 14 }), canResume(progress) && (progress.phase === 'identity_transition_pending' || progress.phase === 'remote_committed')
149
193
  ? '继续完成本机切换'
150
- : '重新检查恢复结果'] }))] })), error !== null && _jsx("small", { className: css.inlineError, role: "alert", children: error }), _jsx(RecoveryDiagnostics, { operationId: progress.operationId, ...progress.failureCode === undefined ? {} : { failureCode: progress.failureCode } })] }) }));
194
+ : '重新检查恢复结果'] }))] })), progress.allowedActions?.includes('discard_pre_attempt') && _jsx("button", { type: "button", className: css.secondary, disabled: props.pending, onClick: () => { void discard(); }, children: "\u53D6\u6D88\u6062\u590D" }), error !== null && _jsx("small", { className: css.inlineError, role: "alert", children: error }), _jsx(RecoveryDiagnostics, { operationId: progress.operationId, ...progress.failureCode === undefined ? {} : { failureCode: progress.failureCode } })] }) }));
151
195
  }
152
196
  //# sourceMappingURL=AwikiRecoveryForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AwikiRecoveryForm.js","sourceRoot":"","sources":["../../../src/client/AwikiRecoveryForm.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AwikiRecoveryForm.js","sourceRoot":"","sources":["../../../src/client/AwikiRecoveryForm.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAc,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,uCAAuC,CAAA;AAQ9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAyB,CAAA;AAC3D,OAAO,GAAG,MAAM,2BAA2B,CAAA;AAkB3C,SAAS,UAAU,CAAC,KAAqC;IACvD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,iBAAiB,CAAC,CAAC,OAAO,SAAS,CAAA;QACxC,KAAK,iBAAiB,CAAC,CAAC,OAAO,QAAQ,CAAA;QACvC,KAAK,wBAAwB,CAAC,CAAC,OAAO,SAAS,CAAA;QAC/C,KAAK,kBAAkB,CAAC,CAAC,OAAO,UAAU,CAAA;QAC1C,KAAK,6BAA6B,CAAC,CAAC,OAAO,UAAU,CAAA;QACrD,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAA;QAC/B,KAAK,6BAA6B,CAAC,CAAC,OAAO,WAAW,CAAA;IACxD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAA+B;IAChD,OAAO,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;AAC7D,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAChD,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,UAAU,CAAA;IAC7C,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,QAA+B;IACtD,IAAI,QAAQ,CAAC,WAAW,KAAK,6BAA6B;QAAE,OAAO,mCAAmC,CAAA;IACtG,QAAQ,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,KAAK,wBAAwB,CAAC,CAAC,OAAO,+BAA+B,CAAA;QACrE,KAAK,kBAAkB,CAAC,CAAC,OAAO,0BAA0B,CAAA;QAC1D,KAAK,6BAA6B,CAAC,CAAC,OAAO,+BAA+B,CAAA;QAC1E,KAAK,6BAA6B,CAAC,CAAC,OAAO,0BAA0B,CAAA;QACrE,KAAK,SAAS,CAAC,CAAC,OAAO,WAAW,CAAA;QAClC,OAAO,CAAC,CAAC,OAAO,0BAA0B,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAsE;IACjG,OAAO,CACL,mBAAS,SAAS,EAAE,GAAG,CAAC,mBAAmB,aACzC,yDAAuB,EACvB,yBACE,0BAAK,gEAAe,EAAA,uBAAI,yBAAO,KAAK,CAAC,WAAW,GAAQ,GAAK,IAAM,EAClE,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,0BAAK,oDAAa,EAAA,uBAAI,yBAAO,KAAK,CAAC,WAAW,GAAQ,GAAK,IAAM,IAClG,IACG,CACX,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,KAajC;IACC,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAA;IACzC,MAAM,MAAM,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IACnD,MAAM,WAAW,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAC1C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,aAAa,CAAC,iBAAiB,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;IAC/F,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,oBAAoB,EAAE,UAAU,IAAI,WAAW,CAAA;IAC7H,MAAM,cAAc,GAAG,KAAK,CAAC,oBAAoB,EAAE,UAAU,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAA;IACvH,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,aAAa,CAAC,YAAY,YAAY,QAAQ,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAA;IAChH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,aAAa,CAAC,YAAY,KAAK,CAAC,WAAW,MAAM,EAAE,EAAE,CAAC,CAAA;IACtF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,aAAa,CAAC,YAAY,KAAK,CAAC,WAAW,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC9G,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,aAAa,CAAC,YAAY,KAAK,CAAC,WAAW,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC1H,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,aAAa,CAAiE,YAAY,YAAY,gBAAgB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC9K,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,aAAa,CAAgB,YAAY,KAAK,CAAC,WAAW,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC7G,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAgB,YAAY,KAAK,CAAC,WAAW,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC1G,MAAM,sBAAsB,GAAG,aAAa,IAAI,cAAc,IAAI,IAAI,CAAA;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,QAAQ,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;IAEvB,SAAS,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;IAEvF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;QAC/B,IAAI,QAAQ,KAAK,IAAI;eAChB,CAAC,SAAS,CAAC,QAAQ,CAAC;eACpB,QAAQ,CAAC,KAAK,KAAK,iBAAiB;eACpC,QAAQ,CAAC,KAAK,KAAK,iBAAiB;eACpC,QAAQ,CAAC,KAAK,KAAK,SAAS;eAC5B,QAAQ,CAAC,KAAK,KAAK,6BAA6B;eAChD,KAAK,CAAC,OAAO;eACb,KAAK,CAAC,WAAW;eACjB,WAAW;eACX,KAAK,KAAK,IAAI;YAAE,OAAM;QAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,cAAc,CAAC,IAAI,CAAC,CAAA;YACpB,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACnD,CAAC,EAAE,GAAG,CAAC,CAAA;QACP,OAAO,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAA;IACtC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAA;IAE1E,MAAM,OAAO,GAAG,KAAK,EAAE,UAAkB,EAAE,KAAa,EAAE,EAAE;QAC1D,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC;YACzC,UAAU;YACV,KAAK;SACN,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAC9C,WAAW,CAAC,EAAE,CAAC,CAAA;QACf,gBAAgB,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;QAChE,SAAS,CAAC,WAAW,CAAC,CAAA;IACxB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC,IAAI,EAAE,CAAA;QAClE,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;QAC/B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,yBAAyB,EAAE,CAAC,UAAU,CAAC,CAAA;QACrE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC9E,IAAI,SAAS,EAAE,EAAE,IAAI,SAAS,CAAC,KAAK;YAAE,OAAM;QAC5C,MAAM,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAClC,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,IAAI,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO;YAAE,OAAM;QAC7F,MAAM,UAAU,GAAG,sBAAsB,EAAE,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAA;QACnF,IAAI,UAAU,KAAK,SAAS;YAAE,OAAM;QACpC,MAAM,OAAO,CAAC,UAAU,EAAE,sBAAsB,EAAE,KAAK,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO;YAAE,OAAM;QACzF,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC;YACzC,KAAK,EAAE,sBAAsB,EAAE,KAAK,IAAI,UAAU,CAAC,IAAI,EAAE;YACzD,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE;SACrB,CAAC,CAAA;QACF,WAAW,CAAC,EAAE,CAAC,CAAA;QACf,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAA;IACjB,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO;YAAE,OAAM;QAC1F,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAA;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE,CAAA;QAClD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,qBAAqB,CAAC;YAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC7F,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,CAAA;QAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,qBAAqB,CAAC;YAAE,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC7F,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,qBAAqB,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO;YAAE,OAAM;QACrG,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAA;QAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,cAAc,CAAC,EAAE,CAAC,CAAA;QAClB,aAAa,CAAC,EAAE,CAAC,CAAA;QACjB,WAAW,CAAC,EAAE,CAAC,CAAA;QACf,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACtB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAA;IAClB,CAAC,CAAA;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC/B,OAAO,CACL,KAAC,iBAAiB,OACZ,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAC9D,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,EACxC,YAAY,EAAE,KAAK,YAEnB,gBAAM,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,UAAU,EAAE,CAAA,CAAC,CAAC,aACnG,cAAK,SAAS,EAAE,GAAG,CAAC,gBAAgB,YAAE,KAAC,iBAAiB,IAAC,IAAI,EAAE,EAAE,GAAI,GAAM,EAC3E,uBAAK,KAAK,CAAC,YAAY,IAAI,QAAQ,GAAM,EACzC,sBAAI,KAAK,CAAC,kBAAkB,IAAI,yDAAyD,GAAK,EAC7F,KAAK,CAAC,WAAW,KAAK,SAAS;wBAC9B,CAAC,CAAC,mDAAgB,gBAAO,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,YAAY,EAAC,UAAU,EAAC,WAAW,EAAC,+BAAqB,EAAC,SAAS,SAAG,IAAQ;wBACnM,CAAC,CAAC,CACE,eAAK,SAAS,EAAE,GAAG,CAAC,uBAAuB,aACzC,sDAAiB,EAAA,2BAAS,KAAK,CAAC,WAAW,GAAU,IACjD,CACP,EACL,8DAAY,gBAAO,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,IAAI,EAAC,KAAK,EAAC,YAAY,EAAC,KAAK,EAAC,SAAS,EAAE,KAAK,CAAC,WAAW,KAAK,SAAS,GAAI,IAAQ,EACvM,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,iFAAyB,EACjJ,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,gBAAO,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAC,OAAO,YAAE,KAAK,IAAI,KAAK,CAAC,YAAY,GAAS,IAClH,GACW,CACrB,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACjD,OAAO,KAAC,iBAAiB,OAAK,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,YAAE,eAAK,SAAS,EAAE,GAAG,CAAC,YAAY,aAClK,kFAAkB,EAAA,uIAAyB,EAC3C,yJAA4B,EAC3B,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,YAAG,IAAI,EAAC,OAAO,YAAE,KAAK,IAAI,KAAK,CAAC,WAAW,GAAK,EACjF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,EAAE,CAAA,CAAC,CAAC,iEAAmB,IACvH,GAAoB,CAAA;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,iBAAiB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC/J,OAAO,CACL,KAAC,iBAAiB,OAAK,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,YACzH,gBAAM,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,OAAO,EAAE,CAAA,CAAC,CAAC,aAChG,cAAK,SAAS,EAAE,GAAG,CAAC,kBAAkB,YAAE,wEAAoB,GAAM,EAClE,gEAAe,EACf,2KAA+B,EAC/B,eAAK,SAAS,EAAE,GAAG,CAAC,uBAAuB,aACzC,sDAAiB,EAAA,2BAAS,sBAAsB,EAAE,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,UAAU,IAAI,KAAK,GAAU,EAC5G,sBAAsB,KAAK,IAAI,IAAI,8BAAE,wEAAoB,EAAA,2BAAS,WAAW,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAU,IAAG,IACrH,EACL,sBAAsB,KAAK,IAAI,IAAI,CAClC,8DAAY,gBAAO,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,IAAI,EAAC,KAAK,EAAC,YAAY,EAAC,KAAK,EAAC,SAAS,SAAG,IAAQ,CACrK,EACD,8DAAY,gBAAO,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,SAAS,EAAC,SAAS,EAAC,YAAY,EAAC,eAAe,EAAC,SAAS,EAAE,sBAAsB,KAAK,IAAI,GAAI,IAAQ,EAC7M,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,qDAAiB,EAC5I,CAAC,sBAAsB,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,CACxE,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,sBAAsB,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,SAAS,EAAE,CAAA,CAAC,CAAC,YAC7P,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,WAAW,GAChE,CACV,EACA,MAAM,KAAK,IAAI,IAAI,gBAAO,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAC,QAAQ,YAAE,MAAM,GAAS,EAC/E,KAAK,KAAK,IAAI,IAAI,gBAAO,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAC,OAAO,YAAE,KAAK,GAAS,EACjF,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,qBAAqB,CAAC,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,EAAE,CAAA,CAAC,CAAC,yCAAe,EAC5L,KAAC,mBAAmB,IAAC,WAAW,EAAE,KAAK,CAAC,WAAW,GAAI,IAClD,GACW,CACrB,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;IAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,KAAK,iBAAiB,IAAI,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAA;IACpI,OAAO,CACL,KAAC,iBAAiB,OACZ,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAC9D,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,EACxC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,YAElC,eAAK,SAAS,EAAE,GAAG,CAAC,YAAY,aAC9B,cAAK,SAAS,EAAE,GAAG,CAAC,kBAAkB,YAAE,yBAAO,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAQ,GAAM,EACvF,uBAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,GAAM,EAC5C,YAAG,SAAS,EAAE,GAAG,CAAC,cAAc,YAAG,QAAQ,CAAC,UAAU,GAAK,EAC3D,cAAK,SAAS,EAAE,GAAG,CAAC,cAAc,YAChC,0BAAc,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,aACxE,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,KAAC,kBAAkB,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,oBAAoB,IAAC,IAAI,EAAE,EAAE,GAAI,sDACrG,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,IACpE,GACA,EACL,SAAS,CAAC,CAAC,CAAC,CACX,8BACE,YAAG,SAAS,EAAE,GAAG,CAAC,wBAAwB,iQAA8C,EACxF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAA,CAAC,CAAC,2DAAkB,IAC1H,CACJ,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAE,GAAG,CAAC,qBAAqB,eAAY,QAAQ,aAC1D,KAAK,CAAC,OAAO,IAAI,KAAC,oBAAoB,IAAC,IAAI,EAAE,EAAE,GAAI,EACpD,sBAAI,eAAe,CAAC,QAAQ,CAAC,GAAK,EAClC,6IAA0B,EACzB,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,mBAAmB,CAAC,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE;gCAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,mCAAmB,EACtS,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,CAC/B,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAC,CAAC,aACzI,KAAC,oBAAoB,IAAC,IAAI,EAAE,EAAE,GAAI,EACjC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,6BAA6B,IAAI,QAAQ,CAAC,KAAK,KAAK,kBAAkB,CAAC;oCACjH,CAAC,CAAC,UAAU;oCACZ,CAAC,CAAC,UAAU,IACP,CACV,IACG,CACP,EACA,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,qBAAqB,CAAC,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,EAAE,CAAA,CAAC,CAAC,yCAAe,EACrL,KAAK,KAAK,IAAI,IAAI,gBAAO,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAC,OAAO,YAAE,KAAK,GAAS,EAClF,KAAC,mBAAmB,IAClB,WAAW,EAAE,QAAQ,CAAC,WAAW,KAC7B,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,GACnF,IACE,GACY,CACrB,CAAA;AACH,CAAC"}
@@ -1,25 +1,40 @@
1
- /** AWiki identity and installation settings contributed to DSH settings. */
1
+ import { type AwikiDraftStore } from './drafts.tsx';
2
+ /** AWiki tenant, local-data, and optional-integration settings. */
2
3
  import { type ReactNode } from 'react';
3
- import type { SettingsScope, SettingsScopeSnapshot } from '@deepseek-ai/dsh-client-runtime/client';
4
- import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
4
+ import type { HostObservable, InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
5
+ import type { SettingsScope } from '@deepseek-ai/dsh-client-ui-settings/client';
5
6
  import type { AwikiSettings } from '../settings.ts';
6
- /** Browser actions and reactive Host-owned AWiki settings state. */
7
- export interface AwikiSettingsInjected {
7
+ import type { AwikiGroupSnapshot, AwikiIntegrationFields, AwikiIntegrationView } from '../types.ts';
8
+ import type { AwikiActionResult, AwikiView } from './controller.ts';
9
+ import type { AwikiTenantScope } from './settings-controller.ts';
10
+ import { type AwikiDevicesProps } from './AwikiDevices.tsx';
11
+ export interface AwikiSettingsInjected extends Omit<AwikiDevicesProps, 'active' | 'pending'> {
12
+ drafts?: AwikiDraftStore;
8
13
  hooks: {
9
- /** Host-backed AWiki settings namespace. */
14
+ awikiTenants: AwikiTenantScope;
10
15
  awikiSettings: SettingsScope<AwikiSettings>;
16
+ awiki: HostObservable<AwikiView>;
11
17
  };
12
- /** Persist a normalized domain. */
18
+ /** Legacy migration setting retained for older browser bundles. */
13
19
  saveDomain: (domain: string) => Promise<void>;
14
- /** Remove the user override and restore the composition default. */
20
+ /** Legacy migration setting retained for older browser bundles. */
15
21
  resetDomain: () => Promise<void>;
16
- /** Permanently remove the Host installation's local AWiki state. */
22
+ createTenant: (displayName: string, domain: string) => Promise<void>;
23
+ renameTenant: (tenantId: string, displayName: string) => Promise<void>;
24
+ switchTenant: (tenantId: string) => Promise<void>;
25
+ archiveTenant: (tenantId: string) => Promise<void>;
26
+ refreshUpdatePolicy: () => Promise<void>;
17
27
  clearLocalData: () => Promise<void>;
28
+ /** Load the shared identity state when settings is opened before the AWiki overlay. */
29
+ loadAwiki: () => Promise<AwikiActionResult>;
30
+ loadIntegration: () => Promise<AwikiActionResult<AwikiIntegrationView | null>>;
31
+ saveIntegration: (fields: AwikiIntegrationFields, current: AwikiIntegrationView | null) => Promise<AwikiActionResult<AwikiIntegrationView>>;
32
+ rotateIntegrationId: (current: AwikiIntegrationView) => Promise<AwikiActionResult<AwikiIntegrationView>>;
33
+ closeIntegration: (current: AwikiIntegrationView) => Promise<AwikiActionResult<AwikiIntegrationView>>;
34
+ reopenIntegration: (fields: AwikiIntegrationFields, current: AwikiIntegrationView) => Promise<AwikiActionResult<AwikiIntegrationView>>;
35
+ listOwnedGroups: () => Promise<AwikiActionResult<readonly AwikiGroupSnapshot[]>>;
36
+ openIntegrationGuide: () => void;
18
37
  }
19
- /** Full composed settings-section props. */
20
38
  export type AwikiSettingsSectionProps = PropsRuntime<'settings.section'> & PropsLocale<'settings.awiki'> & InjectFace<AwikiSettingsInjected>;
21
- declare function hasDomainOverride(snapshot: SettingsScopeSnapshot<AwikiSettings>): boolean;
22
- /** Render only the settings owned by the main AWiki identity and messaging plugin. */
23
39
  export declare function AwikiSettingsSection(props: AwikiSettingsSectionProps): ReactNode;
24
- export { hasDomainOverride };
25
40
  //# sourceMappingURL=AwikiSettingsSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AwikiSettingsSection.d.ts","sourceRoot":"","sources":["../../../src/client/AwikiSettingsSection.tsx"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAM7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAGnD,oEAAoE;AACpE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE;QACL,4CAA4C;QAC5C,aAAa,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;KAC5C,CAAA;IACD,mCAAmC;IACnC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,oEAAoE;IACpE,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,oEAAoE;IACpE,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC;AAED,4CAA4C;AAC5C,MAAM,MAAM,yBAAyB,GACnC,YAAY,CAAC,kBAAkB,CAAC,GAC9B,WAAW,CAAC,gBAAgB,CAAC,GAC7B,UAAU,CAAC,qBAAqB,CAAC,CAAA;AAIrC,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,aAAa,CAAC,GAAG,OAAO,CAKlF;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,SAAS,CAWhF;AAkID,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"AwikiSettingsSection.d.ts","sourceRoot":"","sources":["../../../src/client/AwikiSettingsSection.tsx"],"names":[],"mappings":"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"}
@@ -1,109 +1,141 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- /** AWiki identity and installation settings contributed to DSH settings. */
2
+ import { AwikiUpdates } from "./AwikiUpdates.js";
3
+ import { AwikiDraftProvider, useDraftState } from "./drafts.js";
4
+ /** AWiki tenant, local-data, and optional-integration settings. */
3
5
  import { useEffect, useState } from 'react';
4
6
  import { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives';
5
- import { AWIKI_DOMAIN_FIELD, DEFAULT_AWIKI_DOMAIN, normalizeAwikiDomain, } from "../domain.js";
7
+ import { normalizeAwikiDomain } from "../domain.js";
8
+ import { AwikiDevices } from "./AwikiDevices.js";
9
+ import { AwikiIntegrationSettings } from "./AwikiIntegrationSettings.js";
6
10
  import css from './AwikiSettingsSection.module.css';
7
- function hasDomainOverride(snapshot) {
8
- return typeof snapshot.user === 'object'
9
- && snapshot.user !== null
10
- && !Array.isArray(snapshot.user)
11
- && Object.hasOwn(snapshot.user, AWIKI_DOMAIN_FIELD);
12
- }
13
- /** Render only the settings owned by the main AWiki identity and messaging plugin. */
14
11
  export function AwikiSettingsSection(props) {
15
- const settings = props.useAwikiSettings(value => value);
16
- return (_jsxs("section", { className: css.section, children: [_jsxs("div", { className: css.heading, children: [_jsx("h2", { className: css.title, children: props.t('nav') }), _jsx("p", { className: css.intro, children: props.t('intro') })] }), _jsx(AdvancedPanel, { ...props, settings: settings })] }));
12
+ return _jsx(AwikiDraftProvider, { store: props.drafts, children: _jsx(AwikiSettingsContent, { ...props }) });
17
13
  }
18
- function AdvancedPanel(props) {
19
- const { t, settings } = props;
20
- const current = settings.value?.domain ?? DEFAULT_AWIKI_DOMAIN;
21
- const overridden = hasDomainOverride(settings);
22
- const [draft, setDraft] = useState(current);
23
- const [edited, setEdited] = useState(false);
24
- const [pending, setPending] = useState(false);
25
- const [status, setStatus] = useState(null);
26
- const [clearOpen, setClearOpen] = useState(false);
27
- const [clearDraft, setClearDraft] = useState('');
28
- const [clearing, setClearing] = useState(false);
29
- const [clearStatus, setClearStatus] = useState(null);
14
+ function AwikiSettingsContent(props) {
15
+ const [tab, setTab] = useState('tenants');
16
+ const tenantSnapshot = props.useAwikiTenants(value => value);
17
+ const awiki = props.useAwiki(value => value);
18
+ const restricted = tenantSnapshot.status === 'ready' && tenantSnapshot.update?.restricted === true;
19
+ const tabs = restricted ? [
20
+ { id: 'tenants', label: props.t('tenantTab') },
21
+ { id: 'updates', label: props.t('updatesTab') },
22
+ ] : [
23
+ { id: 'tenants', label: props.t('tenantTab') },
24
+ { id: 'updates', label: props.t('updatesTab') },
25
+ { id: 'devices', label: props.t('devicesTab') },
26
+ { id: 'local', label: props.t('localDataTab') },
27
+ { id: 'integration', label: props.t('integrationTab') },
28
+ ];
30
29
  useEffect(() => {
31
- if (!edited)
32
- setDraft(current);
33
- }, [current, edited]);
34
- if (settings.status === 'loading')
35
- return _jsx("p", { className: css.status, children: t('loading') });
36
- const unavailable = settings.status !== 'ready' || settings.mode !== 'host';
37
- const disabled = unavailable || !settings.writable || pending;
38
- const save = async (event) => {
39
- event?.preventDefault();
30
+ if (restricted && tab !== 'tenants' && tab !== 'updates')
31
+ setTab('updates');
32
+ }, [restricted, tab]);
33
+ useEffect(() => {
34
+ if (!restricted && (tab === 'devices' || tab === 'integration') && awiki.status === 'cold')
35
+ void props.loadAwiki();
36
+ }, [awiki.status, props.loadAwiki, restricted, tab]);
37
+ return (_jsxs("section", { className: css.section, children: [_jsxs("div", { className: css.heading, children: [_jsx("h2", { className: css.title, children: props.t('nav') }), _jsx("p", { className: css.intro, children: props.t('intro') })] }), restricted && _jsxs("p", { className: css.error, role: "alert", children: [props.t('updateRequired'), " ", _jsx(Button, { type: "button", variant: "outline", onClick: () => { setTab('updates'); }, children: props.t('updatesTab') })] }), _jsx("div", { className: css.tabs, role: "tablist", "aria-label": props.t('tabsLabel'), children: tabs.map(item => _jsxs("button", { type: "button", role: "tab", "aria-selected": tab === item.id, className: `${css.tab} ${tab === item.id ? css.tabActive : ''}`, onClick: () => { setTab(item.id); }, children: [item.label, item.id === 'updates' && (tenantSnapshot.update?.updateAvailable || tenantSnapshot.desktop?.updateAvailable || restricted) && _jsx("span", { "aria-hidden": "true", children: " \u25CF" })] }, item.id)) }), _jsxs("div", { role: "tabpanel", children: [tab === 'tenants' && _jsx(TenantPanel, { ...props }), tab === 'updates' && _jsx(AwikiUpdates, { ...props, snapshot: tenantSnapshot }), !restricted && tab === 'devices' && (awiki.status === 'cold' || awiki.status === 'loading'
38
+ ? _jsx("p", { className: css.status, role: "status", children: props.t('devicesLoading') })
39
+ : awiki.status === 'error'
40
+ ? _jsx("p", { className: `${css.status} ${css.error}`, role: "alert", children: awiki.error })
41
+ : awiki.sessionStatus === 'active'
42
+ ? _jsx(AwikiDevices, { active: true, pending: awiki.pending !== null, refreshDeviceManagement: props.refreshDeviceManagement, startDeviceJoinVerification: props.startDeviceJoinVerification, approveDeviceJoin: props.approveDeviceJoin, rejectDeviceJoin: props.rejectDeviceJoin, revokeDevice: props.revokeDevice, prepareRootTransfer: props.prepareRootTransfer, confirmRootTransfer: props.confirmRootTransfer })
43
+ : _jsx("p", { className: css.notice, children: props.t('devicesUnavailable') })), !restricted && tab === 'local' && _jsx(LocalDataPanel, { ...props, disabled: tenantSnapshot.status !== 'ready' || tenantSnapshot.value.switching }, tenantSnapshot.status === 'ready' ? `${tenantSnapshot.value.activeTenantId}:${tenantSnapshot.value.generation}:${tenantSnapshot.value.switching}` : 'unavailable'), !restricted && tab === 'integration' && (tenantSnapshot.status !== 'ready' || tenantSnapshot.value.switching || awiki.status === 'cold' || awiki.status === 'loading'
44
+ ? _jsx("p", { className: css.status, role: "status", children: props.t('integrationLoading') })
45
+ : _jsx(AwikiIntegrationSettings, { ...props }, `${tenantSnapshot.status === 'ready' ? tenantSnapshot.value.activeTenantId : 'unavailable'}:${awiki.identity?.did ?? 'no-identity'}`))] })] }));
46
+ }
47
+ function TenantPanel(props) {
48
+ const snapshot = props.useAwikiTenants(value => value);
49
+ const [name, setName] = useDraftState('settings:tenant-name', '');
50
+ const [domain, setDomain] = useDraftState('settings:tenant-domain', '');
51
+ const [pending, setPending] = useDraftState('settings:tenant-pending', false, false);
52
+ const [status, setStatus] = useState(null);
53
+ if (snapshot.status === 'loading')
54
+ return _jsx("p", { className: css.status, children: props.t('tenantLoading') });
55
+ if (snapshot.status !== 'ready')
56
+ return _jsx("p", { className: `${css.status} ${css.error}`, role: "alert", children: props.t('tenantUnavailable') });
57
+ const disabled = pending || snapshot.value.switching;
58
+ const restricted = snapshot.update?.restricted === true;
59
+ const create = async (event) => {
60
+ event.preventDefault();
40
61
  let normalized;
41
62
  try {
42
- normalized = normalizeAwikiDomain(draft);
63
+ normalized = normalizeAwikiDomain(domain);
43
64
  }
44
65
  catch {
45
- setStatus({ kind: 'error', text: t('invalidDomain') });
66
+ setStatus({ kind: 'error', text: props.t('invalidDomain') });
46
67
  return;
47
68
  }
48
69
  setPending(true);
49
70
  setStatus(null);
50
71
  try {
51
- await props.saveDomain(normalized);
52
- setDraft(normalized);
53
- setEdited(false);
54
- setStatus({ kind: 'saved', text: `${t('saved')} ${t('restartNotice')}` });
72
+ await props.createTenant(name.trim(), normalized);
73
+ setName('');
74
+ setDomain('');
75
+ setStatus({ kind: 'saved', text: props.t('tenantCreated') });
55
76
  }
56
- catch {
57
- setStatus({ kind: 'error', text: t('saveFailed') });
77
+ catch (error) {
78
+ setStatus({ kind: 'error', text: error instanceof Error ? error.message : props.t('tenantChangeFailed') });
58
79
  }
59
80
  finally {
60
81
  setPending(false);
61
82
  }
62
83
  };
63
- const reset = async () => {
64
- setPending(true);
65
- setStatus(null);
84
+ return (_jsxs("div", { className: css.panel, children: [snapshot.value.diagnostic !== undefined && _jsx("p", { className: `${css.notice} ${css.error}`, role: "alert", children: props.t('tenantDiagnostic') }), _jsx("div", { className: css.tenantList, children: snapshot.value.tenants.filter(tenant => tenant.lifecycle !== 'archived').map(tenant => _jsx(TenantRow, { ...props, tenant: tenant, disabled: disabled, managementDisabled: restricted, setPending: setPending, setStatus: setStatus }, tenant.tenantId)) }), !restricted && _jsxs("form", { className: css.card, onSubmit: (event) => { void create(event); }, children: [_jsx("h3", { className: css.cardTitle, children: props.t('tenantAdd') }), _jsx("label", { className: css.label, htmlFor: "awiki-tenant-name", children: props.t('tenantName') }), _jsx("input", { id: "awiki-tenant-name", className: css.input, value: name, disabled: disabled, maxLength: 80, onChange: event => { setName(event.target.value); } }), _jsx("label", { className: css.label, htmlFor: "awiki-tenant-domain", children: props.t('tenantDomain') }), _jsx("input", { id: "awiki-tenant-domain", className: css.input, value: domain, disabled: disabled, spellCheck: false, autoCapitalize: "none", autoCorrect: "off", inputMode: "url", placeholder: "tenant.example", onChange: event => { setDomain(event.target.value); } }), _jsx("p", { className: css.description, children: props.t('tenantDomainHelp') }), _jsx("div", { className: css.actions, children: _jsx(Button, { type: "submit", disabled: disabled || name.trim() === '' || domain.trim() === '', children: props.t('tenantCreate') }) })] }), _jsx("p", { className: `${css.status} ${status?.kind === 'error' ? css.error : ''}`, role: "status", children: status?.text ?? (snapshot.value.switching ? props.t('tenantSwitching') : '') })] }));
85
+ }
86
+ function TenantRow(props) {
87
+ const [draftName, setDraftName] = useState(props.tenant.displayName);
88
+ const run = async (operation, success) => {
89
+ props.setPending(true);
90
+ props.setStatus(null);
66
91
  try {
67
- await props.resetDomain();
68
- setEdited(false);
69
- setStatus({ kind: 'saved', text: `${t('saved')} ${t('restartNotice')}` });
92
+ await operation();
93
+ props.setStatus({ kind: 'saved', text: success });
70
94
  }
71
- catch {
72
- setStatus({ kind: 'error', text: t('saveFailed') });
95
+ catch (error) {
96
+ props.setStatus({ kind: 'error', text: error instanceof Error ? error.message : props.t('tenantChangeFailed') });
73
97
  }
74
98
  finally {
75
- setPending(false);
99
+ props.setPending(false);
76
100
  }
77
101
  };
78
- const closeClear = () => {
102
+ const current = props.tenant.lifecycle === 'active';
103
+ const localizedDisplayName = props.tenant.displayNames === undefined
104
+ ? props.tenant.displayName
105
+ : (typeof document !== 'undefined' && document.documentElement.lang.toLowerCase().startsWith('zh')
106
+ ? props.tenant.displayNames['zh-CN']
107
+ : props.tenant.displayNames.en);
108
+ return (_jsxs("article", { className: `${css.tenantRow} ${current ? css.tenantCurrent : ''}`, children: [_jsxs("div", { className: css.tenantCopy, children: [props.tenant.kind === 'custom' && !props.managementDisabled ? _jsx("input", { "aria-label": props.t('tenantName'), className: css.inlineInput, value: draftName, disabled: props.disabled, maxLength: 80, onChange: event => { setDraftName(event.target.value); } }) : _jsx("strong", { children: localizedDisplayName }), _jsx("span", { className: css.tenantMeta, children: props.tenant.didHost }), _jsxs("span", { className: css.tenantBadges, children: [_jsx("span", { children: props.tenant.kind === 'built_in' ? props.t('tenantOfficial') : props.t('tenantCustom') }), current && _jsx("span", { children: props.t('tenantCurrent') })] })] }), _jsxs("div", { className: css.actions, children: [!current && _jsx(Button, { type: "button", disabled: props.disabled, onClick: () => { void run(() => props.switchTenant(props.tenant.tenantId), props.t('tenantSwitched')); }, children: props.t('tenantSwitch') }), props.tenant.kind === 'custom' && !props.managementDisabled && _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", variant: "outline", disabled: props.disabled || draftName.trim() === '' || draftName === props.tenant.displayName, onClick: () => { void run(() => props.renameTenant(props.tenant.tenantId, draftName.trim()), props.t('tenantRenamed')); }, children: props.t('save') }), !current && _jsx(Button, { type: "button", variant: "outline", disabled: props.disabled, onClick: () => { void run(() => props.archiveTenant(props.tenant.tenantId), props.t('tenantArchived')); }, children: props.t('tenantArchive') })] })] })] }));
109
+ }
110
+ function LocalDataPanel(props) {
111
+ const [clearOpen, setClearOpen] = useState(false);
112
+ const [clearDraft, setClearDraft] = useState('');
113
+ const [clearing, setClearing] = useState(false);
114
+ const [status, setStatus] = useState(null);
115
+ const close = () => {
79
116
  if (clearing)
80
117
  return;
81
118
  setClearOpen(false);
82
119
  setClearDraft('');
83
120
  };
84
- const clearLocalData = async () => {
85
- if (clearDraft !== t('clearConfirmationPhrase'))
121
+ const clear = async () => {
122
+ if (props.disabled || clearDraft !== props.t('clearConfirmationPhrase'))
86
123
  return;
87
124
  setClearing(true);
88
- setClearStatus(null);
125
+ setStatus(null);
89
126
  try {
90
127
  await props.clearLocalData();
91
128
  setClearOpen(false);
92
129
  setClearDraft('');
93
- setClearStatus({ kind: 'saved', text: t('clearSucceeded') });
130
+ setStatus({ kind: 'saved', text: props.t('clearSucceeded') });
94
131
  }
95
132
  catch {
96
- setClearStatus({ kind: 'error', text: t('clearFailed') });
133
+ setStatus({ kind: 'error', text: props.t('clearFailed') });
97
134
  }
98
135
  finally {
99
136
  setClearing(false);
100
137
  }
101
138
  };
102
- return (_jsxs("div", { className: css.panel, children: [_jsxs("form", { className: css.card, onSubmit: (event) => { void save(event); }, children: [_jsx("label", { className: css.label, htmlFor: "awiki-default-domain", children: t('domainLabel') }), _jsx("p", { className: css.description, children: t('domainDescription') }), _jsx("input", { id: "awiki-default-domain", className: css.input, value: draft, disabled: disabled, spellCheck: false, autoCapitalize: "none", autoCorrect: "off", inputMode: "url", placeholder: DEFAULT_AWIKI_DOMAIN, onChange: (event) => { setDraft(event.target.value); setEdited(true); setStatus(null); } }), _jsx("p", { className: css.defaultValue, children: t('defaultValue', { domain: DEFAULT_AWIKI_DOMAIN }) }), _jsxs("div", { className: css.actions, children: [_jsx(Button, { type: "submit", disabled: disabled || !edited || draft.trim() === '', children: pending ? t('saving') : t('save') }), _jsx(Button, { type: "button", variant: "outline", disabled: disabled || !overridden, onClick: () => { void reset(); }, children: t('reset') })] }), unavailable
103
- ? _jsx("p", { className: `${css.status} ${css.error}`, role: "alert", children: t('unavailable') })
104
- : !settings.writable
105
- ? _jsx("p", { className: `${css.status} ${css.error}`, role: "alert", children: t('readOnly') })
106
- : _jsx("p", { className: `${css.status} ${status?.kind === 'error' ? css.error : ''}`, role: "status", children: status?.text ?? '' })] }), _jsx("p", { className: css.notice, children: t('identityNotice') }), _jsxs("section", { className: css.dangerZone, "aria-labelledby": "awiki-danger-zone-title", children: [_jsxs("div", { className: css.dangerCopy, children: [_jsx("h3", { id: "awiki-danger-zone-title", className: css.dangerTitle, children: t('dangerTitle') }), _jsx("p", { className: css.dangerDescription, children: t('dangerDescription') })] }), _jsx(Button, { type: "button", variant: "outline", className: css.dangerButton, disabled: unavailable || clearing, onClick: () => { setClearStatus(null); setClearOpen(true); }, children: t('clearLocalData') }), clearStatus?.kind === 'saved' && _jsx("p", { className: css.status, role: "status", children: clearStatus.text })] }), _jsxs(Modal, { open: clearOpen, onClose: closeClear, title: t('clearDialogTitle'), closeLabel: t('cancel'), description: t('clearDialogDescription'), className: css.clearDialog ?? '', footer: _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", variant: "outline", disabled: clearing, onClick: closeClear, children: t('cancel') }), _jsx(Button, { type: "button", variant: "outline", className: css.clearConfirmButton, disabled: clearing || clearDraft !== t('clearConfirmationPhrase'), onClick: () => { void clearLocalData(); }, children: clearing ? t('clearing') : t('clearConfirm') })] }), children: [_jsxs("div", { className: css.clearWarning, children: [_jsx("p", { children: t('clearScope') }), _jsx("p", { children: t('clearRemoteNotice') })] }), _jsx("label", { className: css.confirmLabel, htmlFor: "awiki-clear-confirmation", children: t('clearConfirmationLabel', { phrase: t('clearConfirmationPhrase') }) }), _jsx("input", { id: "awiki-clear-confirmation", className: css.input, value: clearDraft, disabled: clearing, autoComplete: "off", spellCheck: false, autoFocus: true, onChange: (event) => { setClearDraft(event.target.value); } }), clearStatus?.kind === 'error' && _jsx("p", { className: `${css.status} ${css.error}`, role: "alert", children: clearStatus.text })] })] }));
139
+ return _jsxs("div", { className: css.panel, children: [_jsx("p", { className: css.notice, children: props.t('localDataNotice') }), _jsxs("section", { className: css.dangerZone, "aria-labelledby": "awiki-danger-zone-title", children: [_jsxs("div", { className: css.dangerCopy, children: [_jsx("h3", { id: "awiki-danger-zone-title", className: css.dangerTitle, children: props.t('dangerTitle') }), _jsx("p", { className: css.dangerDescription, children: props.t('dangerDescription') })] }), _jsx(Button, { type: "button", variant: "outline", className: css.dangerButton, disabled: clearing || props.disabled, onClick: () => { setStatus(null); setClearOpen(true); }, children: props.t('clearLocalData') }), _jsx("p", { className: `${css.status} ${status?.kind === 'error' ? css.error : ''}`, role: "status", children: status?.text ?? '' })] }), _jsxs(Modal, { open: clearOpen, onClose: close, title: props.t('clearDialogTitle'), closeLabel: props.t('cancel'), description: props.t('clearDialogDescription'), className: css.clearDialog ?? '', footer: _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", variant: "outline", disabled: clearing, onClick: close, children: props.t('cancel') }), _jsx(Button, { type: "button", variant: "outline", className: css.clearConfirmButton, disabled: clearing || clearDraft !== props.t('clearConfirmationPhrase'), onClick: () => { void clear(); }, children: clearing ? props.t('clearing') : props.t('clearConfirm') })] }), children: [_jsxs("div", { className: css.clearWarning, children: [_jsx("p", { children: props.t('clearScope') }), _jsx("p", { children: props.t('clearRemoteNotice') })] }), _jsx("label", { className: css.confirmLabel, htmlFor: "awiki-clear-confirmation", children: props.t('clearConfirmationLabel', { phrase: props.t('clearConfirmationPhrase') }) }), _jsx("input", { id: "awiki-clear-confirmation", className: css.input, value: clearDraft, disabled: clearing, autoComplete: "off", spellCheck: false, autoFocus: true, onChange: event => { setClearDraft(event.target.value); } })] })] });
107
140
  }
108
- export { hasDomainOverride };
109
141
  //# sourceMappingURL=AwikiSettingsSection.js.map