@antv/dumi-theme-antv 0.8.0-beta.2 → 0.8.0-beta.21

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 (88) hide show
  1. package/dist/builtins/Playground/index.module.less +0 -1
  2. package/dist/components/AI/HomeDialog/AntVBanner/index.module.less +2 -2
  3. package/dist/components/AI/HomeDialog/ModeSelector/ModeSelectorDropdown.js +42 -0
  4. package/dist/components/AI/HomeDialog/ModeSelector/index.module.less +39 -22
  5. package/dist/components/AI/HomeDialog/PromptTextarea/ChooseLib/index.js +12 -4
  6. package/dist/components/AI/HomeDialog/PromptTextarea/ChooseLib/index.module.less +0 -1
  7. package/dist/components/AI/HomeDialog/PromptTextarea/DatasourceCard/index.module.less +3 -3
  8. package/dist/components/AI/HomeDialog/PromptTextarea/index.js +38 -36
  9. package/dist/components/AI/HomeDialog/PromptTextarea/index.module.less +8 -8
  10. package/dist/components/AI/HomeDialog/RecommendCase/Card.js +14 -11
  11. package/dist/components/AI/HomeDialog/RecommendCase/card.module.less +3 -3
  12. package/dist/components/AI/HomeDialog/RecommendCase/index.js +73 -24
  13. package/dist/components/AI/HomeDialog/RecommendCase/index.module.less +4 -2
  14. package/dist/components/AI/HomeDialog/RecommendCase/recommend.json +41 -17
  15. package/dist/components/AI/HomeDialog/index.js +21 -33
  16. package/dist/components/AI/constant.js +4 -2
  17. package/dist/components/Login/Captcha/index.js +185 -0
  18. package/dist/components/Login/Captcha/index.less +91 -0
  19. package/dist/components/Login/CheckCode/index.js +244 -0
  20. package/dist/components/Login/CheckCode/index.less +137 -0
  21. package/dist/components/Login/CountDownButton/index.js +109 -0
  22. package/dist/components/Login/CountDownButton/index.less +8 -0
  23. package/dist/components/Login/LoginForm.js +239 -0
  24. package/dist/components/Login/LoginForm.less +409 -0
  25. package/dist/components/Login/index.js +24 -0
  26. package/dist/components/Login/openAuthWindow.js +54 -0
  27. package/dist/components/Login/types.js +5 -0
  28. package/dist/components/Login/utils.js +47 -0
  29. package/dist/hooks/useProducts.js +22 -1
  30. package/dist/layouts/DocLayout.js +2 -1
  31. package/dist/layouts/GlobalLayout/index.js +11 -4
  32. package/dist/locales/en.json +43 -2
  33. package/dist/locales/zh.json +43 -2
  34. package/dist/model/AIChat.js +93 -6
  35. package/dist/model/auth.js +147 -0
  36. package/dist/pages/AIPlayground/components/ConversationsMenu/index.js +15 -7
  37. package/dist/pages/AIPlayground/components/ConversationsMenu/index.module.less +2 -0
  38. package/dist/pages/AIPlayground/components/MarkdownComponent/MarkdownCodeBlock.js +26 -17
  39. package/dist/pages/AIPlayground/components/MarkdownComponent/MarkdownCodeBlock.module.less +1 -2
  40. package/dist/pages/AIPlayground/components/MarkdownComponent/index.js +7 -4
  41. package/dist/pages/AIPlayground/components/MsgBox/index.js +266 -149
  42. package/dist/pages/AIPlayground/components/MsgBox/index.module.less +3 -2
  43. package/dist/pages/AIPlayground/components/MsgBox/useAutoScroll.js +46 -0
  44. package/dist/pages/AIPlayground/components/SessionLayout/index.js +41 -12
  45. package/dist/pages/AIPlayground/components/SessionLayout/index.module.less +4 -4
  46. package/dist/pages/AIPlayground/components/TaskBox/generateCode.js +129 -8
  47. package/dist/pages/AIPlayground/components/TaskBox/index.js +92 -55
  48. package/dist/pages/AIPlayground/components/TaskBox/index.module.less +1 -0
  49. package/dist/pages/AIPlayground/index.js +4 -1
  50. package/dist/pages/AIPlayground/index.module.less +5 -0
  51. package/dist/pages/Examples/components/Accouncement/index.module.less +1 -1
  52. package/dist/pages/Examples/index.module.less +11 -11
  53. package/dist/pages/Index/components/Cases/index.module.less +8 -8
  54. package/dist/pages/Index/components/Companies/index.module.less +4 -3
  55. package/dist/pages/Index/components/Features/FeatureCard.module.less +4 -5
  56. package/dist/pages/Index/components/Features/index.module.less +5 -5
  57. package/dist/pages/Index/components/_.less +9 -9
  58. package/dist/slots/Banner/Notification.module.less +8 -8
  59. package/dist/slots/Banner/index.module.less +10 -9
  60. package/dist/slots/CodeEditor/Toolbar.js +7 -25
  61. package/dist/slots/CodeEditor/index.js +34 -12
  62. package/dist/slots/CodeEditor/index.module.less +3 -1
  63. package/dist/slots/CodeEditor/utils.js +2 -1
  64. package/dist/slots/CodePreview/index.module.less +0 -3
  65. package/dist/slots/CodeRunner/index.js +23 -11
  66. package/dist/slots/ContentTable/index.module.less +2 -1
  67. package/dist/slots/Detail/News.module.less +9 -9
  68. package/dist/slots/Detail/index.js +2 -1
  69. package/dist/slots/Detail/index.module.less +11 -14
  70. package/dist/slots/ExampleSider/index.module.less +3 -4
  71. package/dist/slots/Footer/index.module.less +2 -2
  72. package/dist/slots/Header/Products/Product.module.less +2 -2
  73. package/dist/slots/Header/Search/SearchResult.js +20 -8
  74. package/dist/slots/Header/Search/SearchResult.module.less +1 -0
  75. package/dist/slots/Header/index.js +51 -25
  76. package/dist/slots/Header/index.module.less +13 -5
  77. package/dist/slots/LiveExample/index.module.less +1 -1
  78. package/dist/slots/Loading/index.module.less +30 -28
  79. package/dist/slots/ManualContent/index.module.less +14 -17
  80. package/dist/slots/_.less +9 -9
  81. package/dist/static/user.svg +3 -0
  82. package/dist/typings.d.ts +6 -0
  83. package/dist/utils/analytics.js +16 -0
  84. package/dist/utils/env.js +63 -0
  85. package/dist/utils/index.js +7 -0
  86. package/dist/utils/request.js +42 -0
  87. package/package.json +9 -5
  88. package/dist/static/SearchAiIcon.svg +0 -14
@@ -0,0 +1,54 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
3
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
4
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
5
+ import { pickBy } from 'lodash';
6
+ export var AuthScene = /*#__PURE__*/function (AuthScene) {
7
+ AuthScene["LOGIN"] = "login";
8
+ AuthScene["GET_ACCESS_TOKEN"] = "get_access_token";
9
+ return AuthScene;
10
+ }({});
11
+ var AUTH_BROADCAST_CHANNEL_NAME = 'WeaveFox-Auth';
12
+ var AuthSceneUrlMap = _defineProperty(_defineProperty({}, AuthScene.LOGIN, '/login/github/oauth'), AuthScene.GET_ACCESS_TOKEN, '/login/github/access_token');
13
+ export function openAuthWindow(params) {
14
+ try {
15
+ var _ref = params || {},
16
+ onSuccess = _ref.onSuccess,
17
+ onFail = _ref.onFail,
18
+ scene = _ref.scene,
19
+ sceneParams = _ref.sceneParams;
20
+ var broadcast = new BroadcastChannel(AUTH_BROADCAST_CHANNEL_NAME);
21
+ var cleanedParams = pickBy(sceneParams, function (val) {
22
+ return val !== undefined && val !== null;
23
+ });
24
+ var sceneParamsString = new URLSearchParams(cleanedParams).toString();
25
+ sceneParamsString = sceneParamsString ? "?".concat(sceneParamsString) : '';
26
+ window.open(AuthSceneUrlMap[scene] + sceneParamsString, 'github_auth', 'left=0,top=0,width=600,height=600');
27
+ var handler = function handler(event) {
28
+ if (event.data.source !== 'WeaveFox-Auth') return;
29
+ // 验证来源是否可信
30
+ if (event.origin !== window.location.origin) {
31
+ console.warn('Untrusted origin: ', event.origin);
32
+ return;
33
+ }
34
+ if (event.data.success) {
35
+ if (onSuccess) {
36
+ onSuccess(event.data);
37
+ }
38
+ } else if (onFail) {
39
+ onFail(event.data);
40
+ }
41
+ window.removeEventListener('message', handler);
42
+ broadcast.removeEventListener('message', handler);
43
+ };
44
+ window.addEventListener('message', handler, false);
45
+ broadcast.addEventListener('message', handler, false);
46
+
47
+ // 未解之谜,窗口可能会丢失 opener 信息,暂时用 5s 后强制刷新解决
48
+ setTimeout(function () {
49
+ window.location.reload();
50
+ }, 5000);
51
+ } catch (e) {
52
+ console.error('auth unexpected error', e);
53
+ }
54
+ }
@@ -0,0 +1,5 @@
1
+ export var STEP = /*#__PURE__*/function (STEP) {
2
+ STEP["Login"] = "Login";
3
+ STEP["CompleteUserInfo"] = "CompleteUserInfo";
4
+ return STEP;
5
+ }({});
@@ -0,0 +1,47 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
+ import FingerprintJS from '@fingerprintjs/fingerprintjs';
6
+ export var chinaMobilePhoneRE = /^(13\d|14\d|15[012356789]|16[567]|17[01235678]|18\d|19\d)\d{8}(\+\d+)?$/;
7
+ export var SignupRegion = /*#__PURE__*/function (SignupRegion) {
8
+ SignupRegion["oversea"] = "oversea";
9
+ SignupRegion["possible_oversea"] = "possible_oversea";
10
+ return SignupRegion;
11
+ }({}); // 可能是海外(不确定/待确认)
12
+ export function getFingerprint() {
13
+ return _getFingerprint.apply(this, arguments);
14
+ }
15
+ function _getFingerprint() {
16
+ _getFingerprint = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
17
+ var fp, result;
18
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
19
+ while (1) switch (_context.prev = _context.next) {
20
+ case 0:
21
+ _context.next = 2;
22
+ return FingerprintJS.load();
23
+ case 2:
24
+ fp = _context.sent;
25
+ _context.next = 5;
26
+ return fp.get();
27
+ case 5:
28
+ result = _context.sent;
29
+ return _context.abrupt("return", result);
30
+ case 7:
31
+ case "end":
32
+ return _context.stop();
33
+ }
34
+ }, _callee);
35
+ }));
36
+ return _getFingerprint.apply(this, arguments);
37
+ }
38
+ export var NC_SCENE = /*#__PURE__*/function (NC_SCENE) {
39
+ NC_SCENE["login"] = "login";
40
+ NC_SCENE["register"] = "register";
41
+ NC_SCENE["verifyUser"] = "verify_user";
42
+ NC_SCENE["registerH5"] = "nc_register_h5";
43
+ NC_SCENE["loginH5"] = "nc_login_h5";
44
+ NC_SCENE["reset"] = "nc_reset";
45
+ return NC_SCENE;
46
+ }({});
47
+ export var UIA_UA_RE = /Macaca UI Robot/;
@@ -1,7 +1,8 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
+ import { getBaseSiteDataUrl } from "../utils/env";
2
3
  export function getProducts() {
3
4
  // 如需要修改产品信息,请到 https://yuyan.antfin-inc.com/antv/site-data/sprints 修改区块内容
4
- return fetch('https://assets.antv.antgroup.com/antv/products.json' // 生产环境
5
+ return fetch("".concat(getBaseSiteDataUrl(), "/antv/products.json") // 生产环境
5
6
  // 'https://site-data-pre.alipay.com/antv/products.json', // 预发测试
6
7
  ).then(function (res) {
7
8
  return res.json();
@@ -15,4 +16,24 @@ export function useProducts() {
15
16
  queryFn: getProducts,
16
17
  staleTime: 24 * 60 * 60 * 1000 // 一天内数据不会被认为是 "stale",不会触发后台刷新
17
18
  });
19
+ }
20
+ export function getAntVConfig() {
21
+ // 如需要修改产品信息,请到 https://yuyan.antfin-inc.com/antv/site-data/sprints 修改区块内容
22
+ return fetch("".concat(getBaseSiteDataUrl(), "/antv/config.json") // 生产环境
23
+ // 'https://site-data-pre.alipay.com/antv/products.json', // 预发测试
24
+ ).then(function (res) {
25
+ return res.json();
26
+ });
27
+ }
28
+
29
+ // 封装了 queryKey 和 fetcher 的自定义 Hook
30
+ export function useAntVConfig() {
31
+ return useQuery({
32
+ queryKey: ['antv-config'],
33
+ queryFn: getAntVConfig,
34
+ initialData: {
35
+ "VisionSnapVersion": "3.4.11",
36
+ "library": ["G2", "F2", "G6"]
37
+ }
38
+ });
18
39
  }
@@ -14,6 +14,7 @@ import ManualLayout from "./ManualLayout";
14
14
  import GlobalStyles from "../common/GlobalStyles";
15
15
  import { defaultToken } from "../common/styles/theme";
16
16
  import "../static/style";
17
+ import { LoginModal } from "../components/Login";
17
18
  /**
18
19
  * DocLayout 是 dumi2 的内置 layout 入口,在这里使用页面路径进行区分成自己不同的 Layout。
19
20
  */
@@ -107,5 +108,5 @@ export default (function () {
107
108
  token: defaultToken,
108
109
  hashed: false
109
110
  }
110
- }, /*#__PURE__*/React.createElement(GlobalStyles, null), content)));
111
+ }, /*#__PURE__*/React.createElement(GlobalStyles, null), content, /*#__PURE__*/React.createElement(LoginModal, null))));
111
112
  });
@@ -1,12 +1,19 @@
1
- import React, { useEffect } from 'react';
2
- import { useOutlet } from 'dumi';
3
1
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
4
- import { initializeStore } from "../../model/AIChat";
2
+ import * as antd from 'antd';
3
+ import { useOutlet } from 'dumi';
4
+ import React, { useEffect } from 'react';
5
+ import { initializeAIChat } from "../../model/AIChat";
6
+ import { initializeAuth } from "../../model/auth";
5
7
  var queryClient = new QueryClient();
6
8
  var GlobalLayout = function GlobalLayout() {
7
9
  var outlet = useOutlet();
8
10
  useEffect(function () {
9
- initializeStore();
11
+ initializeAIChat();
12
+ initializeAuth();
13
+ if (typeof window !== 'undefined') {
14
+ window.antd = antd;
15
+ }
16
+ console.log("%c @antv/dumi-theme-antv %c ".concat("0.8.0-beta.21", " %c"), 'background:#35495e; padding: 1px; border-radius: 3px 0 0 3px; color: #fff;', 'background:#41b883; padding: 1px; border-radius: 0 3px 3px 0; color: #fff;', 'background:transparent;');
10
17
  }, []);
11
18
  return outlet && /*#__PURE__*/React.createElement(QueryClientProvider, {
12
19
  client: queryClient
@@ -182,7 +182,9 @@
182
182
  "ai.placeholder.implement": "What would you like to visualize today?",
183
183
  "ai.placeholder.solve": "What visualization problem would you like to solve today?",
184
184
  "ai.mode.implement": "Develop",
185
+ "ai.mode.implement.short": "Develop",
185
186
  "ai.mode.solve": "Q&A",
187
+ "ai.mode.solve.short": "Q&A",
186
188
  "ai.upload.tooltip": "Only supports csv,json,tsv,txt files. For performance and cost reasons, only the first few lines will be used as samples",
187
189
  "ai.upload.data": "Upload Data",
188
190
  "ai.upload.image": "Upload Image",
@@ -205,6 +207,7 @@
205
207
  "ai.msgbox.start.new.chat": "Start New Chat",
206
208
  "ai.msgbox.send.tip": "Please enter content before sending",
207
209
  "ai.msgbox.error.response": "Sorry, I couldn't successfully process your request, please try again later",
210
+ "ai.msgbox.continue.from.here": "Continue from here",
208
211
  "ai.recommend.title": "Featured Cases",
209
212
  "ai.recommend.refresh": "Refresh",
210
213
  "ai.recommend.card.caseName": "Case Name",
@@ -218,6 +221,7 @@
218
221
  "ai.toolbar.open.stackblitz": "Open in StackBlitz",
219
222
  "ai.toolbar.open.riddle": "Open in Riddle",
220
223
  "ai.toolbar.html.code": "HTML Code",
224
+ "ai.toolbar.clear.conversation": "Clear Conversation",
221
225
  "ai.conversations.expand": "Expand",
222
226
  "ai.conversations.collapse": "Collapse",
223
227
  "ai.conversations.new": "Start New Chat",
@@ -226,12 +230,19 @@
226
230
  "ai.conversations.pin": "Pin",
227
231
  "ai.conversations.delete": "Delete",
228
232
  "ai.conversations.edit.title": "Edit Conversation Name",
233
+ "ai.conversations.ok": "OK",
234
+ "ai.conversations.cancel": "Cancel",
235
+ "ai.msgbox.delete": "Delete",
236
+ "ai.msgbox.auto.fix": "Auto Fix",
237
+ "ai.msgbox.auto.fix.prompt": "This code encountered a problem during execution. Here is the exact error message it threw.",
229
238
  "ai.chooseLib.placeholder": "Choose Technology Stack",
230
239
  "ai.search.try": "Try",
231
240
  "ai.search.visualization": "Q&A",
232
241
  "ai.assistant.editor.intro": "I am AntV AI Assistant. You can ask me questions at any time to:\n1. Interpret the code configuration of the current chart.\n2. Generate new code based on the current case through natural language dialogue to customize the chart.",
233
242
  "ai.placeholder.whatis": "What is {title}?",
234
- "header.ai.code": "AI Code Generation",
243
+ "header.user.history": "History",
244
+ "header.user.logout": "Logout",
245
+ "header.user.deleteAccount": "Delete Account",
235
246
  "header.china.mirror.title": "AntV series websites are deployed on gh-pages. If the access speed is poor, you can visit the domestic mirror site.",
236
247
  "header.china.mirror.temp.close": "Close Temporarily",
237
248
  "header.china.mirror.no.more": "Don't Remind Again",
@@ -268,5 +279,35 @@
268
279
  "feedback.result.demo.error": "Demo code error, please check",
269
280
  "feedback.result.reading.time": "Reading needs",
270
281
  "feedback.result.minutes": "minutes",
271
- "feedback.result.no.results": "No query result found"
282
+ "feedback.result.no.results": "No query result found",
283
+ "login.user.protocol.title": "User Agreement",
284
+ "login.user.protocol.content": "To better protect your legitimate rights and interests, please read and agree to WeaveFox ",
285
+ "login.user.protocol.link": "User Agreement",
286
+ "login.protocol.agree": "Agree",
287
+ "login.protocol.disagree": "Disagree",
288
+ "login.placeholder.phone": "Please enter your mobile number",
289
+ "login.placeholder.phone.or.email": "Please enter your mobile number or email",
290
+ "login.error.invalid.phone": "Please enter a valid mobile number",
291
+ "login.error.invalid.phone.or.email": "Please enter a valid mobile number or email",
292
+ "login.button.login.or.register": "Sign In / Sign Up",
293
+ "login.protocol.read.agree": "I have read and agree to AntV ",
294
+ "login.protocol.link": "User Agreement",
295
+ "login.link.home": "Return to Home Page",
296
+ "login.checkcode.get": "Get Code",
297
+ "login.checkcode.send.success": "Verification code sent successfully",
298
+ "login.checkcode.error.incomplete": "Please complete the captcha verification first",
299
+ "login.checkcode.sent": "The Verification code has been sent",
300
+ "login.checkcode.required": "Verification code is required",
301
+ "login.checkcode.invalid": "Please enter a valid 6-digit verification code",
302
+ "login.checkcode.placeholder": "Verification code",
303
+ "login.countdown.resend": "Resend({time})",
304
+ "login.countdown.resend.simple": "Resend",
305
+ "login.captcha.drag": "Hold and drag the slider right",
306
+ "login.captcha.success": "Verification successful",
307
+ "login.captcha.loading": "Loading...",
308
+ "login.captcha.error.wrong": "Oops! Something went wrong. Click",
309
+ "login.captcha.error.network": "Poor connection. Click",
310
+ "login.captcha.error.refresh": "Refresh",
311
+ "login.captcha.required": "Please drag the slider to verify",
312
+ "login.modal.title": "Verification Code Login"
272
313
  }
@@ -181,7 +181,9 @@
181
181
  "ai.placeholder.implement": "今天,你想可视化什么?",
182
182
  "ai.placeholder.solve": "今天,你想解决什么可视化问题?",
183
183
  "ai.mode.implement": "可视化研发",
184
+ "ai.mode.implement.short": "研发",
184
185
  "ai.mode.solve": "可视化答疑",
186
+ "ai.mode.solve.short": "答疑",
185
187
  "ai.upload.tooltip": "仅支持csv,json,tsv,txt文件,为了性能和成本,只会使用文件的前几行作为样本",
186
188
  "ai.upload.data": "上传数据",
187
189
  "ai.upload.image": "上传图片",
@@ -217,20 +219,29 @@
217
219
  "ai.toolbar.open.stackblitz": "在 StackBlitz 中打开",
218
220
  "ai.toolbar.open.riddle": "在 Riddle 中打开",
219
221
  "ai.toolbar.html.code": "HTML 代码",
222
+ "ai.toolbar.clear.conversation": "清空对话",
220
223
  "ai.conversations.expand": "展开",
221
224
  "ai.conversations.collapse": "收起",
225
+ "ai.msgbox.continue.from.here": "从这里继续",
222
226
  "ai.conversations.new": "开始新对话",
223
227
  "ai.conversations.history": "历史对话",
224
228
  "ai.conversations.rename": "重命名",
225
229
  "ai.conversations.pin": "置顶",
226
230
  "ai.conversations.delete": "删除",
227
231
  "ai.conversations.edit.title": "编辑对话名称",
232
+ "ai.conversations.ok": "确定",
233
+ "ai.conversations.cancel": "取消",
234
+ "ai.msgbox.delete": "删除",
235
+ "ai.msgbox.auto.fix": "自动修复",
236
+ "ai.msgbox.auto.fix.prompt": "这个代码在执行时遇到了问题。下面是它抛出的确切错误信息。",
228
237
  "ai.chooseLib.placeholder": "选择技术栈",
229
238
  "ai.search.try": "试试",
230
239
  "ai.search.visualization": "可视化答疑",
231
240
  "ai.assistant.editor.intro": "我是AntV AI助手。您可以随时向我提问,让我为您:\n\n1、解读当前图表的代码配置。\n2、通过自然语言对话,基于当前案例生成新代码以定制图表。",
232
241
  "ai.placeholder.whatis": "{title}是什么?",
233
- "header.ai.code": "AI生码",
242
+ "header.user.history": "历史会话",
243
+ "header.user.logout": "退出登录",
244
+ "header.user.deleteAccount": "注销账号",
234
245
  "header.china.mirror.title": "AntV 系列网站部署在 gh-pages 上,若访问速度不佳,可以前往国内镜像站点。",
235
246
  "header.china.mirror.temp.close": "暂时关闭",
236
247
  "header.china.mirror.no.more": "不再提醒",
@@ -267,5 +278,35 @@
267
278
  "feedback.result.demo.error": "演示代码报错,请检查",
268
279
  "feedback.result.reading.time": "阅读时间约",
269
280
  "feedback.result.minutes": "分钟",
270
- "feedback.result.no.results": "没有找到查询结果"
281
+ "feedback.result.no.results": "没有找到查询结果",
282
+ "login.user.protocol.title": "用户协议 ",
283
+ "login.user.protocol.content": "为更好地保护你的合法权益,请阅读并同意 WeaveFox ",
284
+ "login.user.protocol.link": "用户协议 ",
285
+ "login.protocol.agree": "同意",
286
+ "login.protocol.disagree": "不同意",
287
+ "login.placeholder.phone": "请输入手机号",
288
+ "login.placeholder.phone.or.email": "请输入手机号或邮箱",
289
+ "login.error.invalid.phone": "请输入正确的手机号",
290
+ "login.error.invalid.phone.or.email": "请输入正确的手机号或邮箱",
291
+ "login.button.login.or.register": "登录 / 注册",
292
+ "login.protocol.read.agree": "我已阅读并同意 AntV ",
293
+ "login.protocol.link": "用户协议 ",
294
+ "login.link.home": "返回首页",
295
+ "login.checkcode.get": "获取验证码",
296
+ "login.checkcode.send.success": "验证码发送成功",
297
+ "login.checkcode.error.incomplete": "先完成滑块验证",
298
+ "login.checkcode.sent": "已发送验证码",
299
+ "login.checkcode.required": "验证码不能为空",
300
+ "login.checkcode.invalid": "请输入有效的 6 位数字验证码",
301
+ "login.checkcode.placeholder": "6 位验证码",
302
+ "login.countdown.resend": "重新获取({time})",
303
+ "login.countdown.resend.simple": "重新获取",
304
+ "login.captcha.drag": "按住滑块,拖动到最右边",
305
+ "login.captcha.success": "验证通过",
306
+ "login.captcha.loading": "加载中",
307
+ "login.captcha.error.wrong": "哎呀,出错了,单击",
308
+ "login.captcha.error.network": "网络不给力,单击",
309
+ "login.captcha.error.refresh": "刷新",
310
+ "login.captcha.required": "拖动滑块验证",
311
+ "login.modal.title": "验证码登录"
271
312
  }
@@ -13,6 +13,9 @@ import { derive, subscribeKey } from 'valtio/utils';
13
13
  import localforage from 'localforage';
14
14
  import FingerprintJS from '@fingerprintjs/fingerprintjs';
15
15
  import { history } from "dumi";
16
+ import { message } from "antd";
17
+ import { AIMode } from "../components/AI/constant";
18
+ import { trackEvent } from "../utils/analytics";
16
19
 
17
20
  // --- 配置 ---
18
21
  // 定义需要持久化的 state key
@@ -26,7 +29,10 @@ var initialState = {
26
29
  sessions: [],
27
30
  activeSessionId: null,
28
31
  tempMessage: null,
29
- codeBlock: null
32
+ codeBlock: null,
33
+ lib: null,
34
+ mode: AIMode.implement,
35
+ errorMsg: null
30
36
  };
31
37
 
32
38
  // --- valtio Store 创建 ---
@@ -52,10 +58,15 @@ export var clearEmptySession = function clearEmptySession() {
52
58
  AIChatStore.sessions = AIChatStore.sessions.filter(function (s) {
53
59
  return s.messages.length > 0;
54
60
  });
61
+ if (AIChatStore.sessions.every(function (s) {
62
+ return s.id !== AIChatStore.activeSessionId;
63
+ }) && AIChatStore.sessions.length > 0) {
64
+ AIChatStore.activeSessionId = AIChatStore.sessions[0].id;
65
+ }
55
66
  };
56
67
 
57
68
  // --- 初始化逻辑 ---
58
- export var initializeStore = /*#__PURE__*/function () {
69
+ export var initializeAIChat = /*#__PURE__*/function () {
59
70
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
60
71
  var persistedState, fp, result, newSession, _AIChatStore$sessions;
61
72
  return _regeneratorRuntime().wrap(function _callee$(_context) {
@@ -129,7 +140,7 @@ export var initializeStore = /*#__PURE__*/function () {
129
140
  }
130
141
  }, _callee, null, [[5, 15]]);
131
142
  }));
132
- return function initializeStore() {
143
+ return function initializeAIChat() {
133
144
  return _ref.apply(this, arguments);
134
145
  };
135
146
  }();
@@ -195,17 +206,24 @@ subscribeKey(AIChatStore, 'activeSessionId', function () {
195
206
  AIChatStore.codeBlock = null;
196
207
  });
197
208
  export var createPureNewSession = function createPureNewSession(title) {
209
+ var newConversationName = 'New Conversation';
210
+ var existNewSession = AIChatStore.sessions.find(function (s) {
211
+ return s.title === newConversationName && s.messages.length === 0;
212
+ });
213
+ if (existNewSession) {
214
+ AIChatStore.activeSessionId = existNewSession.id;
215
+ return;
216
+ }
198
217
  var newSessionId = crypto.randomUUID();
199
218
  AIChatStore.sessions.unshift({
200
219
  id: newSessionId,
201
- title: title !== null && title !== void 0 ? title : 'New Conversation',
220
+ title: title !== null && title !== void 0 ? title : newConversationName,
202
221
  createdAt: Date.now(),
203
222
  messages: []
204
223
  });
205
224
  AIChatStore.activeSessionId = newSessionId;
206
225
  };
207
226
  export var createNewSession = function createNewSession(config) {
208
- // todo 埋点
209
227
  // 1. 创建一个新的会话
210
228
  createPureNewSession(config.promptText);
211
229
 
@@ -223,4 +241,73 @@ export var createNewSession = function createNewSession(config) {
223
241
  var _config$lang;
224
242
  history.push("/".concat((_config$lang = config.lang) !== null && _config$lang !== void 0 ? _config$lang : 'zh', "/ai-playground"));
225
243
  }
226
- };
244
+ // 埋点
245
+ if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object') {
246
+ trackEvent('start_ai_chat', {
247
+ entry_point: config.entry_point,
248
+ mode: AIChatStore.mode,
249
+ lib: AIChatStore.lib,
250
+ page_title: document.title,
251
+ location: location.href
252
+ });
253
+ }
254
+ };
255
+
256
+ /**
257
+ * 清空所有本地AI对话记录和相关状态。用户注销账户或手动请求清除数据时调用。
258
+ *
259
+ * 该函数会执行以下操作:
260
+ * 1. 从 localforage 中删除持久化的状态数据。
261
+ * 2. 将内存中的 AIChatStore 重置为初始状态。
262
+ *
263
+ */
264
+ export var clearAllChatData = /*#__PURE__*/function () {
265
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
266
+ var initialKeys, _i, _initialKeys, key;
267
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
268
+ while (1) switch (_context2.prev = _context2.next) {
269
+ case 0:
270
+ _context2.prev = 0;
271
+ _context2.next = 3;
272
+ return localforage.removeItem(STORAGE_KEY);
273
+ case 3:
274
+ console.log("[AIChat] Persistent state with key \"".concat(STORAGE_KEY, "\" has been removed."));
275
+
276
+ // 步骤 2: 将内存中的 valtio store 重置为初始状态。
277
+ // 这会立即更新UI,让所有对话记录从界面上消失。
278
+ // 注意:我们不能直接做 AIChatStore = initialState,
279
+ // 因为 proxy 对象是不可替换的。我们必须逐个属性地重置。
280
+ initialKeys = Object.keys(initialState);
281
+ for (_i = 0, _initialKeys = initialKeys; _i < _initialKeys.length; _i++) {
282
+ key = _initialKeys[_i];
283
+ // @ts-ignore
284
+ AIChatStore[key] = initialState[key];
285
+ }
286
+ console.log('[AIChat] In-memory state has been reset to initial values.');
287
+ _context2.next = 13;
288
+ break;
289
+ case 9:
290
+ _context2.prev = 9;
291
+ _context2.t0 = _context2["catch"](0);
292
+ console.error('[AIChat] Failed to clear all chat data:', _context2.t0);
293
+ message.error('清空对话记录失败,请刷新页面后重试。');
294
+ case 13:
295
+ case "end":
296
+ return _context2.stop();
297
+ }
298
+ }, _callee2, null, [[0, 9]]);
299
+ }));
300
+ return function clearAllChatData() {
301
+ return _ref2.apply(this, arguments);
302
+ };
303
+ }();
304
+ export function deleteMessage(msgId) {
305
+ derivedState.activeSession.messages = derivedState.activeSession.messages.filter(function (m) {
306
+ return m.id !== msgId;
307
+ });
308
+ }
309
+ export function branchMessage(index) {
310
+ var messages = derivedState.activeSession.messages.slice(0, index + 1);
311
+ createPureNewSession(messages[0].content);
312
+ AIChatStore.sessions[0].messages = messages;
313
+ }