@yuku123/z-team-component 0.2.80 → 0.2.81

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 (51) hide show
  1. package/dist/ChangeLogView-_bRZ55Yi.js +542 -0
  2. package/dist/ComponentDoc-BWciPDcn.js +3998 -0
  3. package/dist/InvitationManagementPage-X9t4igh7.js +495 -0
  4. package/dist/OnboardingPage-D2sVawTW.js +393 -0
  5. package/dist/ScheduledTasks-CdCX5FlH.js +9407 -0
  6. package/dist/SystemShell-Bd0UpmAs.js +689 -0
  7. package/dist/_commonjsHelpers-B52_cu2H.js +26 -0
  8. package/dist/api-BKjWEmUY.js +20 -0
  9. package/dist/api-CIhVblfa.js +2155 -0
  10. package/dist/browser-jb_PFvU3.js +1538 -0
  11. package/dist/createWorkspaceWsHandler-BWP5S5X3.js +12951 -0
  12. package/dist/ctc-sso-DtJHC-2M.js +117 -0
  13. package/dist/echarts-B1OU1xr4.js +16 -0
  14. package/dist/history-BlrA1eaW.js +41 -0
  15. package/dist/index-B_LJRFsK.js +339 -0
  16. package/dist/index-BgIheStI.js +133 -0
  17. package/dist/index-Bn6u-XqL.js +242 -0
  18. package/dist/index-BohoJQPr.js +7631 -0
  19. package/dist/index-BydWNuk5.js +1229 -0
  20. package/dist/index-C815hPWS.js +430 -0
  21. package/dist/index-CPXlkVYF.js +118 -0
  22. package/dist/index-CUVdeb8y.js +638 -0
  23. package/dist/index-CdsD23Cm.js +914 -0
  24. package/dist/index-CijskN6t.js +316 -0
  25. package/dist/index-CkhoaNnF.js +137 -0
  26. package/dist/index-Cvx6rrxD.js +956 -0
  27. package/dist/index-Cwr5Slv1.js +480 -0
  28. package/dist/index-CxFAICql.js +42050 -0
  29. package/dist/index-D6i_zovv.js +574 -0
  30. package/dist/index-D8aigFpH.js +9583 -0
  31. package/dist/index-DK70mOTz.js +143 -0
  32. package/dist/index-DSoOHdTf.js +178 -0
  33. package/dist/index-DT80Pwa_.js +5893 -0
  34. package/dist/index-DWsfQMp8.js +208 -0
  35. package/dist/index-DZoJnRKu.js +112 -0
  36. package/dist/index-DhDdFRHC.js +279 -0
  37. package/dist/index-DimSOV0E.js +1143 -0
  38. package/dist/index-Dm3wmB0K.js +435 -0
  39. package/dist/index-DsP2ysav.js +93 -0
  40. package/dist/index-Dwm0j8qF.js +2936 -0
  41. package/dist/index-DzS6-D3M.js +1640 -0
  42. package/dist/index-RVaaSElI.js +2700 -0
  43. package/dist/index-cdB5K3gx.js +814 -0
  44. package/dist/index-nU-V276i.js +170 -0
  45. package/dist/index-uF04Ucsi.js +8 -0
  46. package/dist/index.js +10 -0
  47. package/dist/index.module-CAa-2T7m.js +72 -0
  48. package/dist/index.module-UI0iz8K0.js +42 -0
  49. package/dist/{menuPermission-D9NGpBZP.js → menuPermission-Uzk46Gto.js} +1 -1
  50. package/dist/pages.js +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,117 @@
1
+ function d() {
2
+ if (typeof window > "u") return null;
3
+ try {
4
+ const t = localStorage.getItem("USER_INFO");
5
+ if (t) return JSON.parse(t);
6
+ const a = localStorage.getItem("userInfo") || localStorage.getItem("user_info");
7
+ if (!a) return null;
8
+ const n = JSON.parse(a), r = {
9
+ name: String(n.nickname || n.name || ""),
10
+ jobNumber: String(n.userId || n.jobNumber || ""),
11
+ username: String(n.username || n.account || n.name || ""),
12
+ staffId: typeof n.userId == "number" ? n.userId : Number(n.userId) || 0
13
+ };
14
+ return localStorage.setItem("USER_INFO", JSON.stringify(r)), window.USER_INFO = r, r;
15
+ } catch {
16
+ return null;
17
+ }
18
+ }
19
+ async function m() {
20
+ const t = () => {
21
+ localStorage.removeItem("USER_INFO"), window.USER_INFO = void 0;
22
+ };
23
+ try {
24
+ const a = new AbortController(), n = setTimeout(() => a.abort(), 1500), r = await fetch("/kapi/z-ctc/api/ctc/authn/whoami", {
25
+ method: "GET",
26
+ credentials: "include",
27
+ headers: { Accept: "application/json" },
28
+ signal: a.signal
29
+ });
30
+ if (clearTimeout(n), r.status === 401) {
31
+ const s = await u();
32
+ return s ? { kind: "authenticated", user: s } : (t(), { kind: "unauthenticated" });
33
+ }
34
+ if (!r.ok) {
35
+ const s = await u();
36
+ return s ? { kind: "authenticated", user: s } : { kind: "unavailable" };
37
+ }
38
+ const e = await r.json();
39
+ if (!e.success || !e.data)
40
+ return t(), { kind: "unauthenticated" };
41
+ const o = e.data.user_id ?? e.data.userId, i = {
42
+ name: e.data.nickname || e.data.username,
43
+ jobNumber: o != null ? String(o) : "",
44
+ username: e.data.username
45
+ };
46
+ localStorage.setItem("USER_INFO", JSON.stringify(i)), localStorage.setItem(
47
+ "ctcUrl",
48
+ encodeURIComponent(window.location.origin)
49
+ ), window.USER_INFO = i;
50
+ const c = localStorage.getItem("token") || localStorage.getItem("z_team_token");
51
+ c && localStorage.setItem("token", c);
52
+ const l = {
53
+ userId: o,
54
+ id: o,
55
+ userName: e.data.username,
56
+ username: e.data.username,
57
+ nickname: e.data.nickname
58
+ };
59
+ return localStorage.setItem("userInfo", JSON.stringify(l)), { kind: "authenticated", user: i };
60
+ } catch {
61
+ const a = await u();
62
+ return a ? { kind: "authenticated", user: a } : (t(), { kind: "unavailable" });
63
+ }
64
+ }
65
+ async function u() {
66
+ if (typeof window > "u") return null;
67
+ let t = null;
68
+ try {
69
+ t = localStorage.getItem("token") || localStorage.getItem("z_team_token");
70
+ } catch {
71
+ return null;
72
+ }
73
+ if (!t || !t.trim()) return null;
74
+ try {
75
+ const a = new AbortController(), n = setTimeout(() => a.abort(), 2e3), r = await fetch("/kapi/z-ctc/api/ctc/authn/whoami", {
76
+ method: "GET",
77
+ headers: {
78
+ Accept: "application/json",
79
+ Authorization: `Bearer ${t.trim()}`
80
+ },
81
+ signal: a.signal
82
+ });
83
+ if (clearTimeout(n), !r.ok) return null;
84
+ const e = await r.json();
85
+ if (!e.success || !e.data) return null;
86
+ const o = e.data.user_id ?? e.data.userId, i = {
87
+ name: e.data.nickname || e.data.username,
88
+ jobNumber: o != null ? String(o) : "",
89
+ username: e.data.username
90
+ };
91
+ localStorage.setItem("USER_INFO", JSON.stringify(i)), localStorage.setItem(
92
+ "ctcUrl",
93
+ encodeURIComponent(window.location.origin)
94
+ ), window.USER_INFO = i;
95
+ const c = {
96
+ userId: o,
97
+ id: o,
98
+ userName: e.data.username,
99
+ username: e.data.username,
100
+ nickname: e.data.nickname
101
+ };
102
+ return localStorage.setItem("userInfo", JSON.stringify(c)), i;
103
+ } catch {
104
+ return null;
105
+ }
106
+ }
107
+ function f() {
108
+ const t = new URL(window.location.href);
109
+ t.searchParams.has("_from_login") || t.searchParams.set("_from_login", "1");
110
+ const a = `/login?redirect=${encodeURIComponent(t.toString())}`;
111
+ window.location.href = a;
112
+ }
113
+ export {
114
+ m as f,
115
+ f as r,
116
+ d as s
117
+ };
@@ -0,0 +1,16 @@
1
+ import * as o from "echarts/core";
2
+ import { BarChart as r, LineChart as e, PieChart as n } from "echarts/charts";
3
+ import { GridComponent as t, LegendComponent as m, MarkLineComponent as p, TitleComponent as i, TooltipComponent as a, GraphicComponent as C } from "echarts/components";
4
+ import { CanvasRenderer as h } from "echarts/renderers";
5
+ o.use([
6
+ r,
7
+ e,
8
+ n,
9
+ t,
10
+ m,
11
+ p,
12
+ i,
13
+ a,
14
+ C,
15
+ h
16
+ ]);
@@ -0,0 +1,41 @@
1
+ function i(t) {
2
+ if (typeof t == "string")
3
+ return t;
4
+ const { pathname: o = "", search: n = "", hash: r = "" } = t, e = n && !n.startsWith("?") ? `?${n}` : n, a = r && !r.startsWith("#") ? `#${r}` : r;
5
+ return `${o}${e}${a}`;
6
+ }
7
+ function s() {
8
+ try {
9
+ window.dispatchEvent(new PopStateEvent("popstate"));
10
+ } catch {
11
+ }
12
+ }
13
+ const w = {
14
+ /** 当前 location(与 umi/history 形状保持一致) */
15
+ get location() {
16
+ return window.location;
17
+ },
18
+ /** 跳转到新地址(pushState + 通知 Router) */
19
+ push(t, o) {
20
+ window.history.pushState(o ?? {}, "", i(t)), s();
21
+ },
22
+ /** 替换当前地址(replaceState + 通知 Router) */
23
+ replace(t, o) {
24
+ window.history.replaceState(o ?? {}, "", i(t)), s();
25
+ },
26
+ /** 历史栈移动 */
27
+ go(t) {
28
+ window.history.go(t);
29
+ },
30
+ /** 后退 */
31
+ back() {
32
+ window.history.back();
33
+ },
34
+ /** 前进 */
35
+ forward() {
36
+ window.history.forward();
37
+ }
38
+ };
39
+ export {
40
+ w as h
41
+ };
@@ -0,0 +1,339 @@
1
+ import { jsxs as r, jsx as n } from "react/jsx-runtime";
2
+ import { useState as o, useEffect as m, useCallback as k, useMemo as M } from "react";
3
+ import { h as l } from "./history-BlrA1eaW.js";
4
+ import { f as N, p as v, L as d, M as S, A as C, a as O, b as W } from "./index-DWsfQMp8.js";
5
+ const R = "_page_15tgf_8", E = "_bgWash_15tgf_48", F = "_bgGrid_15tgf_59", G = "_navbar_15tgf_74", z = "_navInner_15tgf_84", H = "_navBrand_15tgf_95", Z = "_navMark_15tgf_102", $ = "_navBrandText_15tgf_116", U = "_navBack_15tgf_123", K = "_hero_15tgf_143", j = "_eyebrow_15tgf_151", X = "_eyebrowDot_15tgf_166", Q = "_heroTitle_15tgf_174", V = "_heroLead_15tgf_183", q = "_grid_15tgf_192", J = "_card_15tgf_203", Y = "_cardFocused_15tgf_219", ee = "_cardHead_15tgf_224", ae = "_cardIcon_15tgf_230", ne = "_cardHeadText_15tgf_243", te = "_cardTitle_15tgf_248", re = "_cardEn_15tgf_256", se = "_cardBadges_15tgf_262", ce = "_badge_15tgf_270", oe = "_badgeDevice_15tgf_271", de = "_badge_ready_15tgf_286", ie = "_badge_beta_15tgf_292", le = "_badge_soon_15tgf_298", _e = "_badge_free_15tgf_304", ge = "_badge_instant_15tgf_310", me = "_cardDesc_15tgf_316", he = "_metaRow_15tgf_323", be = "_metaItem_15tgf_330", fe = "_changelog_15tgf_343", ue = "_changelogLabel_15tgf_351", ke = "_changelogText_15tgf_358", Ne = "_steps_15tgf_365", ve = "_cardAction_15tgf_381", we = "_btnPrimary_15tgf_385", ye = "_btnGhost_15tgf_386", pe = "_btnDisabled_15tgf_387", Te = "_cardNote_15tgf_432", Ae = "_footer_15tgf_439", Pe = "_footerLink_15tgf_455", e = {
6
+ page: R,
7
+ bgWash: E,
8
+ bgGrid: F,
9
+ navbar: G,
10
+ navInner: z,
11
+ navBrand: H,
12
+ navMark: Z,
13
+ navBrandText: $,
14
+ navBack: U,
15
+ hero: K,
16
+ eyebrow: j,
17
+ eyebrowDot: X,
18
+ heroTitle: Q,
19
+ heroLead: V,
20
+ grid: q,
21
+ card: J,
22
+ cardFocused: Y,
23
+ cardHead: ee,
24
+ cardIcon: ae,
25
+ cardHeadText: ne,
26
+ cardTitle: te,
27
+ cardEn: re,
28
+ cardBadges: se,
29
+ badge: ce,
30
+ badgeDevice: oe,
31
+ badge_ready: de,
32
+ badge_beta: ie,
33
+ badge_soon: le,
34
+ badge_free: _e,
35
+ badge_instant: ge,
36
+ cardDesc: me,
37
+ metaRow: he,
38
+ metaItem: be,
39
+ changelog: fe,
40
+ changelogLabel: ue,
41
+ changelogText: ke,
42
+ steps: Ne,
43
+ cardAction: ve,
44
+ btnPrimary: we,
45
+ btnGhost: ye,
46
+ btnDisabled: pe,
47
+ cardNote: Te,
48
+ footer: Ae,
49
+ footerLink: Pe
50
+ }, Le = {
51
+ ready: "正式版",
52
+ beta: "内测中",
53
+ soon: "即将发布",
54
+ free: "免安装",
55
+ instant: "即刻可用"
56
+ }, g = [
57
+ {
58
+ key: "macos",
59
+ icon: "laptop",
60
+ name: "macOS 桌面客户端",
61
+ en: "Z-OPC 桌面端 · Apple Silicon",
62
+ state: "ready",
63
+ desc: "本地 Agent 沙箱、火箭跳转、自动更新。桌面端与生产 Agent 集群双向打通,敏感操作不出本地。"
64
+ },
65
+ {
66
+ key: "windows",
67
+ icon: "windows",
68
+ name: "Windows 桌面客户端",
69
+ en: "Z-OPC 桌面端 · Windows 10+",
70
+ state: "ready",
71
+ desc: "与 macOS 同源交付:本地 Agent 沙箱、火箭跳转、自动更新一套不打折。安装包为 x64 setup 格式。"
72
+ },
73
+ {
74
+ key: "ios",
75
+ icon: "phone",
76
+ name: "iOS App",
77
+ en: "Z-OPC · iPhone / iPad",
78
+ state: "beta",
79
+ desc: "iOS 版通过 TestFlight 分发内测版本,测试通过后上架 App Store。后续版本由 TestFlight 自动推送。"
80
+ },
81
+ {
82
+ key: "android",
83
+ icon: "bot",
84
+ name: "Android App",
85
+ en: "Z-OPC · APK 直装包",
86
+ state: "soon",
87
+ desc: "APK 直装包,支持手机浏览器直接下载安装。若提示「未知来源」,需在系统设置中允许浏览器安装应用。"
88
+ },
89
+ {
90
+ key: "web",
91
+ icon: "globe",
92
+ name: "Web 版",
93
+ en: "浏览器 · 全平台",
94
+ state: "free",
95
+ desc: "无需安装,浏览器直接进入完整工作台。手机浏览器自动进入移动端界面,数据与客户端完全同步。"
96
+ },
97
+ {
98
+ key: "cli",
99
+ icon: "terminal",
100
+ name: "CLI Agent",
101
+ en: "claude-code 等多运行时",
102
+ state: "instant",
103
+ desc: "接入既有 CLI 运行时,在命令行里把任务交给 Agent 执行,结论回到会话。详见操作手册的接入章节。"
104
+ }
105
+ ];
106
+ function De(s, c) {
107
+ return c && c.releaseType === "beta" ? "beta" : s.state;
108
+ }
109
+ function Ie(s, c) {
110
+ return c && c.releaseType === "beta" ? "内测版" : Le[s.state];
111
+ }
112
+ function xe() {
113
+ const s = navigator.userAgent;
114
+ return /iPad|iPhone|iPod/.test(s) ? "ios" : /Android/i.test(s) ? "android" : /Mac OS X|Macintosh/.test(s) ? "macos" : "web";
115
+ }
116
+ function w() {
117
+ if (typeof window > "u") return null;
118
+ const s = new URLSearchParams(window.location.search).get("platform");
119
+ return s && g.some((c) => c.key === s) ? s : null;
120
+ }
121
+ function We() {
122
+ const [s, c] = o(null), [h, y] = o(null), [b, f] = o(!1), [p, u] = o(!1), [_, T] = o(
123
+ w
124
+ ), [A, Be] = o(() => xe());
125
+ m(() => {
126
+ let a = !0;
127
+ return N(S).then((t) => {
128
+ a && (c(t), f(!0));
129
+ }).catch(() => a && f(!0)), N(C).then((t) => {
130
+ a && (y(t), u(!0));
131
+ }).catch(() => a && u(!0)), () => {
132
+ a = !1;
133
+ };
134
+ }, []), m(() => {
135
+ const a = () => T(w());
136
+ return window.addEventListener("popstate", a), () => window.removeEventListener("popstate", a);
137
+ }, []), m(() => {
138
+ if (!_) return;
139
+ const a = document.getElementById(`dl-${_}`);
140
+ if (!a) return;
141
+ const t = window.setTimeout(
142
+ () => a.scrollIntoView({ behavior: "smooth", block: "center" }),
143
+ 120
144
+ );
145
+ return () => window.clearTimeout(t);
146
+ }, [_]);
147
+ const P = k(() => {
148
+ const a = /iPad|iPhone|iPod|Android/i.test(navigator.userAgent);
149
+ l.push(a ? "/phone" : "/workspace");
150
+ }, []), i = k(
151
+ (a) => a === "macos" ? v(s, "macos") : a === "windows" ? v(s, "windows") : a === "android" ? h : null,
152
+ [s, h]
153
+ ), L = (a) => {
154
+ const t = i(a.key);
155
+ return a.key === "macos" ? t ? /* @__PURE__ */ r(
156
+ "a",
157
+ {
158
+ className: e.btnPrimary,
159
+ href: t.downloadUrl,
160
+ target: "_blank",
161
+ rel: "noreferrer",
162
+ children: [
163
+ /* @__PURE__ */ n(d, { name: "download", size: 15, strokeWidth: 2 }),
164
+ "下载 DMG · v",
165
+ t.version
166
+ ]
167
+ }
168
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: b ? "版本清单未获取" : "版本清单加载中…" }) : a.key === "windows" ? t ? /* @__PURE__ */ r(
169
+ "a",
170
+ {
171
+ className: e.btnPrimary,
172
+ href: t.downloadUrl,
173
+ target: "_blank",
174
+ rel: "noreferrer",
175
+ children: [
176
+ /* @__PURE__ */ n(d, { name: "download", size: 15, strokeWidth: 2 }),
177
+ "下载 Windows 版 · v",
178
+ t.version
179
+ ]
180
+ }
181
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: b ? "版本清单未获取" : "版本清单加载中…" }) : a.key === "android" ? t ? /* @__PURE__ */ r(
182
+ "a",
183
+ {
184
+ className: e.btnPrimary,
185
+ href: t.downloadUrl,
186
+ target: "_blank",
187
+ rel: "noreferrer",
188
+ children: [
189
+ /* @__PURE__ */ n(d, { name: "download", size: 15, strokeWidth: 2 }),
190
+ "下载 APK · v",
191
+ t.version
192
+ ]
193
+ }
194
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: p ? "即将发布 · 敬请期待" : "版本清单加载中…" }) : a.key === "ios" ? /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: "内测资格申请中 · 敬请期待" }) : a.key === "web" ? /* @__PURE__ */ r("button", { className: e.btnPrimary, onClick: P, children: [
195
+ /* @__PURE__ */ n(d, { name: "arrow", size: 15, strokeWidth: 2 }),
196
+ "立即进入工作台"
197
+ ] }) : a.key === "cli" ? /* @__PURE__ */ n(
198
+ "button",
199
+ {
200
+ className: e.btnGhost,
201
+ onClick: () => l.push("/docs"),
202
+ children: "查看接入方式"
203
+ }
204
+ ) : /* @__PURE__ */ n("button", { className: e.btnDisabled, disabled: !0, children: "安装包制作中" });
205
+ }, D = (a) => {
206
+ const t = i(a.key);
207
+ return t ? /* @__PURE__ */ r("div", { className: e.metaRow, children: [
208
+ /* @__PURE__ */ r("span", { className: e.metaItem, children: [
209
+ /* @__PURE__ */ n(d, { name: "check", size: 13, strokeWidth: 2.2 }),
210
+ "v",
211
+ t.version
212
+ ] }),
213
+ t.fileSize > 0 && /* @__PURE__ */ n("span", { className: e.metaItem, children: O(t.fileSize) }),
214
+ t.releaseTime && /* @__PURE__ */ n("span", { className: e.metaItem, children: W(t.releaseTime) }),
215
+ t.arch && /* @__PURE__ */ n("span", { className: e.metaItem, children: t.arch })
216
+ ] }) : null;
217
+ }, I = M(
218
+ () => g.filter((a) => a.key === "web" || a.key === "cli" ? !0 : !!i(a.key)).length,
219
+ [i]
220
+ );
221
+ return /* @__PURE__ */ r("div", { className: e.page, children: [
222
+ /* @__PURE__ */ n("div", { className: e.bgWash }),
223
+ /* @__PURE__ */ n("div", { className: e.bgGrid }),
224
+ /* @__PURE__ */ n("nav", { className: e.navbar, children: /* @__PURE__ */ r("div", { className: e.navInner, children: [
225
+ /* @__PURE__ */ r(
226
+ "div",
227
+ {
228
+ className: e.navBrand,
229
+ onClick: () => l.push("/welcome"),
230
+ role: "button",
231
+ tabIndex: 0,
232
+ children: [
233
+ /* @__PURE__ */ n("span", { className: e.navMark, children: "ZO" }),
234
+ /* @__PURE__ */ n("span", { className: e.navBrandText, children: "Z-OPC" })
235
+ ]
236
+ }
237
+ ),
238
+ /* @__PURE__ */ n(
239
+ "button",
240
+ {
241
+ className: e.navBack,
242
+ onClick: () => l.push("/welcome"),
243
+ children: "返回产品首页"
244
+ }
245
+ )
246
+ ] }) }),
247
+ /* @__PURE__ */ r("header", { className: e.hero, children: [
248
+ /* @__PURE__ */ r("span", { className: e.eyebrow, children: [
249
+ /* @__PURE__ */ n("span", { className: e.eyebrowDot }),
250
+ "下载中心"
251
+ ] }),
252
+ /* @__PURE__ */ n("h1", { className: e.heroTitle, children: "全平台客户端" }),
253
+ /* @__PURE__ */ r("p", { className: e.heroLead, children: [
254
+ g.length,
255
+ " 个终端、同一条消息协议、同一套账号。 桌面端跑本地 Agent,移动端随手跟进,Web 与 CLI 随时接入。 当前 ",
256
+ I,
257
+ " 个终端可直接下载或使用。"
258
+ ] })
259
+ ] }),
260
+ /* @__PURE__ */ n("main", { className: e.grid, children: g.map((a) => {
261
+ const t = i(a.key), x = a.key === A, B = _ === a.key;
262
+ return /* @__PURE__ */ r(
263
+ "section",
264
+ {
265
+ id: `dl-${a.key}`,
266
+ className: `${e.card} ${B ? e.cardFocused : ""}`,
267
+ children: [
268
+ /* @__PURE__ */ r("div", { className: e.cardHead, children: [
269
+ /* @__PURE__ */ n("span", { className: e.cardIcon, children: /* @__PURE__ */ n(
270
+ d,
271
+ {
272
+ name: a.icon,
273
+ size: 21,
274
+ strokeWidth: 1.8
275
+ }
276
+ ) }),
277
+ /* @__PURE__ */ r("div", { className: e.cardHeadText, children: [
278
+ /* @__PURE__ */ n("h2", { className: e.cardTitle, children: a.name }),
279
+ /* @__PURE__ */ n("div", { className: e.cardEn, children: a.en })
280
+ ] }),
281
+ /* @__PURE__ */ r("div", { className: e.cardBadges, children: [
282
+ x && /* @__PURE__ */ n("span", { className: e.badgeDevice, children: "当前设备" }),
283
+ /* @__PURE__ */ n(
284
+ "span",
285
+ {
286
+ className: `${e.badge} ${e[`badge_${De(a, t)}`]}`,
287
+ children: Ie(a, t)
288
+ }
289
+ )
290
+ ] })
291
+ ] }),
292
+ /* @__PURE__ */ n("p", { className: e.cardDesc, children: a.desc }),
293
+ D(a),
294
+ (t == null ? void 0 : t.changelog) && /* @__PURE__ */ r("div", { className: e.changelog, children: [
295
+ /* @__PURE__ */ n("span", { className: e.changelogLabel, children: "本次更新" }),
296
+ /* @__PURE__ */ n("p", { className: e.changelogText, children: t.changelog })
297
+ ] }),
298
+ a.key === "ios" && /* @__PURE__ */ r("ol", { className: e.steps, children: [
299
+ /* @__PURE__ */ r("li", { children: [
300
+ "在 App Store 搜索并安装",
301
+ " ",
302
+ /* @__PURE__ */ n("b", { children: "TestFlight" }),
303
+ "(苹果官方测试平台)"
304
+ ] }),
305
+ /* @__PURE__ */ r("li", { children: [
306
+ "用 iPhone 打开",
307
+ /* @__PURE__ */ n("b", { children: "邀请链接" }),
308
+ ",点击「接受」 加入内测"
309
+ ] }),
310
+ /* @__PURE__ */ r("li", { children: [
311
+ "在 TestFlight 中安装 Z-OPC,后续版本",
312
+ /* @__PURE__ */ n("b", { children: "自动推送" })
313
+ ] })
314
+ ] }),
315
+ /* @__PURE__ */ n("div", { className: e.cardAction, children: L(a) }),
316
+ a.key === "macos" && /* @__PURE__ */ n("p", { className: e.cardNote, children: "下载后拖入「应用程序」即可使用,客户端支持自动检查更新" }),
317
+ a.key === "web" && /* @__PURE__ */ n("p", { className: e.cardNote, children: "平台 SSO 登录后使用,数据与客户端完全同步" }),
318
+ a.key === "android" && /* @__PURE__ */ n("p", { className: e.cardNote, children: "建议用手机浏览器打开本页直接下载安装" })
319
+ ]
320
+ },
321
+ a.key
322
+ );
323
+ }) }),
324
+ /* @__PURE__ */ r("footer", { className: e.footer, children: [
325
+ /* @__PURE__ */ n("span", { children: "© 2026 Z-OPC · 一人公司基建" }),
326
+ /* @__PURE__ */ n(
327
+ "button",
328
+ {
329
+ className: e.footerLink,
330
+ onClick: () => l.push("/welcome"),
331
+ children: "返回产品首页"
332
+ }
333
+ )
334
+ ] })
335
+ ] });
336
+ }
337
+ export {
338
+ We as default
339
+ };
@@ -0,0 +1,133 @@
1
+ import { jsx as s, jsxs as C } from "react/jsx-runtime";
2
+ import { f as z, r as v } from "./ctc-sso-DtJHC-2M.js";
3
+ import { r as L, h as N, s as T } from "./sso-user-ZUKv4XMX.js";
4
+ import { CheckCircleFilled as q } from "@ant-design/icons";
5
+ import { Spin as R } from "antd";
6
+ import W from "query-string";
7
+ import { useMemo as P, useState as p, useCallback as A, useEffect as U } from "react";
8
+ import { useLocation as F } from "react-router-dom";
9
+ import { h as H } from "./history-BlrA1eaW.js";
10
+ import { c as Y, e as B } from "./api-CIhVblfa.js";
11
+ import { u as m } from "./useAppStore-BBr_Fwsz.js";
12
+ /* empty css */
13
+ import { b as G } from "./mobile-client-O3yr9h6t.js";
14
+ function ne() {
15
+ const i = F(), g = W.parse(i.search), S = P(
16
+ () => String(g.name ?? "WebIDE 在线咨询").trim(),
17
+ [i.search]
18
+ ), _ = P(
19
+ () => String(g.source ?? "z-team-webide").trim(),
20
+ [i.search]
21
+ ), [b, E] = p(!1), [I, y] = p("正在登录…"), [w, M] = p([]), [$, x] = p(""), { currentUser: d, updateCurrentUser: u, expandProject: j } = m(), f = A((e, o) => {
22
+ M((a) => [...a, e]), y(o);
23
+ }, []);
24
+ return U(() => {
25
+ let e = !1, o = 0;
26
+ const a = 100;
27
+ let r = !1, n = 0;
28
+ const h = 3;
29
+ return (() => {
30
+ if (e) return;
31
+ const l = async () => {
32
+ if (e) return;
33
+ let t = L();
34
+ if ((!t || !N(t)) && !r) {
35
+ r = !0;
36
+ try {
37
+ const c = await z();
38
+ c.kind === "authenticated" ? t = c.user : c.kind === "unauthenticated" && (n += 1);
39
+ } catch {
40
+ } finally {
41
+ r = !1;
42
+ }
43
+ }
44
+ if (t && N(t)) {
45
+ u(T(t));
46
+ const c = m.getState().token;
47
+ B().then((D) => {
48
+ e || u(D);
49
+ }).catch(() => {
50
+ !e && c && (localStorage.removeItem("z_team_token"), m.setState({ token: "" }));
51
+ }).finally(() => {
52
+ e || E(!0);
53
+ });
54
+ return;
55
+ }
56
+ if (n >= h) {
57
+ v();
58
+ return;
59
+ }
60
+ if (o += 1, o >= a) {
61
+ v();
62
+ return;
63
+ }
64
+ window.setTimeout(() => void l(), 150);
65
+ };
66
+ l();
67
+ })(), () => {
68
+ e = !0;
69
+ };
70
+ }, [u]), U(() => {
71
+ if (!b || !d) return;
72
+ let e = !1;
73
+ return (async () => {
74
+ try {
75
+ const a = m.getState(), r = /* @__PURE__ */ new Date(), n = (c) => String(c).padStart(2, "0"), h = `${r.getFullYear()}-${n(r.getMonth() + 1)}-${n(
76
+ r.getDate()
77
+ )} ${n(r.getHours())}:${n(r.getMinutes())}`, k = `${S} - ${d.display_name || d.username} - ${h}`;
78
+ y("正在创建咨询群组…");
79
+ const l = await Y(
80
+ {
81
+ name: k,
82
+ description: `${_} 发起的在线咨询`,
83
+ workspace_path: `webide_consult_${Date.now()}`,
84
+ scenario_code: "z_team_webide_console_scenario"
85
+ },
86
+ a.token
87
+ );
88
+ if (e || (f("群组已创建", "正在初始化工作区…"), await j(l), e)) return;
89
+ const t = m.getState();
90
+ if (t.currentProject && await t.refreshProjectPanels(
91
+ t.currentProject.id,
92
+ t.projectSwitchSeq,
93
+ !1
94
+ ), e) return;
95
+ f("工作区已就绪", "即将进入工作台…"), H.replace(
96
+ G({
97
+ projectId: l.id,
98
+ search: i.search
99
+ })
100
+ );
101
+ } catch (a) {
102
+ e || x(a instanceof Error ? a.message : "创建群组失败");
103
+ }
104
+ })(), () => {
105
+ e = !0;
106
+ };
107
+ }, [
108
+ b,
109
+ d,
110
+ S,
111
+ _,
112
+ j,
113
+ f,
114
+ i.search
115
+ ]), $ ? /* @__PURE__ */ s("div", { className: "embed-chat-page embed-chat-page--error", children: /* @__PURE__ */ s("p", { children: $ }) }) : /* @__PURE__ */ s("div", { className: "embed-chat-page embed-chat-page--loading", children: /* @__PURE__ */ C("div", { className: "embed-chat-page__panel", children: [
116
+ /* @__PURE__ */ s(R, { size: "large" }),
117
+ /* @__PURE__ */ s("p", { className: "embed-chat-page__step", children: I }),
118
+ w.length > 0 ? /* @__PURE__ */ s("ul", { className: "embed-chat-page__done-list", children: w.filter((e) => e.trim().length > 0).map((e, o) => /* @__PURE__ */ C(
119
+ "li",
120
+ {
121
+ className: "embed-chat-page__done-item",
122
+ children: [
123
+ /* @__PURE__ */ s(q, { className: "embed-chat-page__done-icon" }),
124
+ /* @__PURE__ */ s("span", { children: e })
125
+ ]
126
+ },
127
+ `${o}-${e}`
128
+ )) }) : null
129
+ ] }) });
130
+ }
131
+ export {
132
+ ne as default
133
+ };