@saber2pr/ai-assistant 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ReadMe.md +57 -0
- package/lib/app.d.ts +1 -0
- package/lib/app.js +27 -0
- package/lib/chat.d.ts +3 -0
- package/lib/chat.js +222 -0
- package/lib/chat.style.d.ts +12 -0
- package/lib/chat.style.js +20 -0
- package/lib/components/Codeblock/index.d.ts +9 -0
- package/lib/components/Codeblock/index.js +55 -0
- package/lib/components/Codeblock/index.style.d.ts +1 -0
- package/lib/components/Codeblock/index.style.js +13 -0
- package/lib/components/MarkdownText/index.d.ts +3 -0
- package/lib/components/MarkdownText/index.js +71 -0
- package/lib/components/MyRuntimeProvider/index.d.ts +5 -0
- package/lib/components/MyRuntimeProvider/index.js +22 -0
- package/lib/components/MyRuntimeProvider/myModelAdapterStream.d.ts +4 -0
- package/lib/components/MyRuntimeProvider/myModelAdapterStream.js +180 -0
- package/lib/components/Thread/index.d.ts +2 -0
- package/lib/components/Thread/index.js +286 -0
- package/lib/components/Thread/index.style.d.ts +15 -0
- package/lib/components/Thread/index.style.js +18 -0
- package/lib/components/ThreadList/index.d.ts +4 -0
- package/lib/components/ThreadList/index.js +131 -0
- package/lib/constants/index.d.ts +1 -0
- package/lib/constants/index.js +4 -0
- package/lib/context.d.ts +3 -0
- package/lib/context.js +8 -0
- package/lib/hooks/useAsync.d.ts +14 -0
- package/lib/hooks/useAsync.js +105 -0
- package/lib/hooks/useCopy.d.ts +5 -0
- package/lib/hooks/useCopy.js +48 -0
- package/lib/hooks/useI18n.d.ts +5 -0
- package/lib/hooks/useI18n.js +16 -0
- package/lib/i18n/i18n.d.ts +14 -0
- package/lib/i18n/i18n.js +31 -0
- package/lib/i18n/index.d.ts +6 -0
- package/lib/i18n/index.js +7 -0
- package/lib/i18n/locale.d.ts +4 -0
- package/lib/i18n/locale.js +7 -0
- package/lib/i18n/locales.d.ts +36 -0
- package/lib/i18n/locales.js +37 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +17 -0
- package/lib/llm/context.d.ts +3 -0
- package/lib/llm/context.js +10 -0
- package/lib/llm/engine.d.ts +6 -0
- package/lib/llm/engine.js +53 -0
- package/lib/styles.d.ts +6 -0
- package/lib/styles.js +18 -0
- package/lib/types/assistant.d.ts +53 -0
- package/lib/types/assistant.js +2 -0
- package/lib/utils/event.d.ts +8 -0
- package/lib/utils/event.js +28 -0
- package/lib/utils/parseStreamData.d.ts +5 -0
- package/lib/utils/parseStreamData.js +33 -0
- package/lib/utils/streamRequest.d.ts +4 -0
- package/lib/utils/streamRequest.js +150 -0
- package/package.json +75 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
3
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
4
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
5
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
6
|
+
function step(op) {
|
|
7
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
8
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
9
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
10
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
11
|
+
switch (op[0]) {
|
|
12
|
+
case 0: case 1: t = op; break;
|
|
13
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
14
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
15
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
16
|
+
default:
|
|
17
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
18
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
19
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
20
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
21
|
+
if (t[2]) _.ops.pop();
|
|
22
|
+
_.trys.pop(); continue;
|
|
23
|
+
}
|
|
24
|
+
op = body.call(thisArg, _);
|
|
25
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
26
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
30
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
31
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
32
|
+
var m = o[Symbol.asyncIterator], i;
|
|
33
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
34
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
35
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
36
|
+
};
|
|
37
|
+
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
38
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
39
|
+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
40
|
+
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
41
|
+
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
42
|
+
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
43
|
+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
44
|
+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
45
|
+
function fulfill(value) { resume("next", value); }
|
|
46
|
+
function reject(value) { resume("throw", value); }
|
|
47
|
+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.MyModelAdapterStream = void 0;
|
|
51
|
+
var event_1 = require("@/utils/event");
|
|
52
|
+
var constants_1 = require("@/constants");
|
|
53
|
+
var MyModelAdapterStream = function (llm, onBeforeChat) { return ({
|
|
54
|
+
run: function (_a) {
|
|
55
|
+
return __asyncGenerator(this, arguments, function run_1(_b) {
|
|
56
|
+
var chatMessages, chunks, reply, _c, chunks_1, chunks_1_1, chunk, e_1_1, summaryResponse, title, error_1;
|
|
57
|
+
var _d, e_1, _e, _f;
|
|
58
|
+
var _g, _h, _j;
|
|
59
|
+
var messages = _b.messages, abortSignal = _b.abortSignal;
|
|
60
|
+
return __generator(this, function (_k) {
|
|
61
|
+
switch (_k.label) {
|
|
62
|
+
case 0:
|
|
63
|
+
chatMessages = messages.map(function (item) { return ({
|
|
64
|
+
role: item.role,
|
|
65
|
+
content: item.content[0].text,
|
|
66
|
+
}); });
|
|
67
|
+
if (!onBeforeChat) return [3 /*break*/, 2];
|
|
68
|
+
return [4 /*yield*/, __await(onBeforeChat(chatMessages, llm))];
|
|
69
|
+
case 1:
|
|
70
|
+
chatMessages = _k.sent();
|
|
71
|
+
_k.label = 2;
|
|
72
|
+
case 2:
|
|
73
|
+
console.log('🚀 ~ myModelAdapterStream ~ chatMessages:', chatMessages);
|
|
74
|
+
return [4 /*yield*/, __await(llm.chat.completions.create({
|
|
75
|
+
messages: chatMessages,
|
|
76
|
+
temperature: 1,
|
|
77
|
+
stream: true,
|
|
78
|
+
}))];
|
|
79
|
+
case 3:
|
|
80
|
+
chunks = _k.sent();
|
|
81
|
+
reply = "";
|
|
82
|
+
_k.label = 4;
|
|
83
|
+
case 4:
|
|
84
|
+
_k.trys.push([4, 11, 12, 17]);
|
|
85
|
+
_c = true, chunks_1 = __asyncValues(chunks);
|
|
86
|
+
_k.label = 5;
|
|
87
|
+
case 5: return [4 /*yield*/, __await(chunks_1.next())];
|
|
88
|
+
case 6:
|
|
89
|
+
if (!(chunks_1_1 = _k.sent(), _d = chunks_1_1.done, !_d)) return [3 /*break*/, 10];
|
|
90
|
+
_f = chunks_1_1.value;
|
|
91
|
+
_c = false;
|
|
92
|
+
chunk = _f;
|
|
93
|
+
reply += ((_g = chunk.choices[0]) === null || _g === void 0 ? void 0 : _g.delta.content) || "";
|
|
94
|
+
return [4 /*yield*/, __await({
|
|
95
|
+
status: {
|
|
96
|
+
type: 'running',
|
|
97
|
+
},
|
|
98
|
+
content: [
|
|
99
|
+
{
|
|
100
|
+
text: reply,
|
|
101
|
+
type: 'text',
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
})];
|
|
105
|
+
case 7: return [4 /*yield*/, _k.sent()];
|
|
106
|
+
case 8:
|
|
107
|
+
_k.sent();
|
|
108
|
+
_k.label = 9;
|
|
109
|
+
case 9:
|
|
110
|
+
_c = true;
|
|
111
|
+
return [3 /*break*/, 5];
|
|
112
|
+
case 10: return [3 /*break*/, 17];
|
|
113
|
+
case 11:
|
|
114
|
+
e_1_1 = _k.sent();
|
|
115
|
+
e_1 = { error: e_1_1 };
|
|
116
|
+
return [3 /*break*/, 17];
|
|
117
|
+
case 12:
|
|
118
|
+
_k.trys.push([12, , 15, 16]);
|
|
119
|
+
if (!(!_c && !_d && (_e = chunks_1.return))) return [3 /*break*/, 14];
|
|
120
|
+
return [4 /*yield*/, __await(_e.call(chunks_1))];
|
|
121
|
+
case 13:
|
|
122
|
+
_k.sent();
|
|
123
|
+
_k.label = 14;
|
|
124
|
+
case 14: return [3 /*break*/, 16];
|
|
125
|
+
case 15:
|
|
126
|
+
if (e_1) throw e_1.error;
|
|
127
|
+
return [7 /*endfinally*/];
|
|
128
|
+
case 16: return [7 /*endfinally*/];
|
|
129
|
+
case 17: return [4 /*yield*/, __await({
|
|
130
|
+
status: {
|
|
131
|
+
type: 'complete',
|
|
132
|
+
reason: 'stop',
|
|
133
|
+
},
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
text: reply,
|
|
137
|
+
type: 'text',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
}
|
|
141
|
+
// 对话完成后,如果这是第一轮对话,生成标题
|
|
142
|
+
)];
|
|
143
|
+
case 18: return [4 /*yield*/, _k.sent()];
|
|
144
|
+
case 19:
|
|
145
|
+
_k.sent();
|
|
146
|
+
if (!(messages.length === 1)) return [3 /*break*/, 23];
|
|
147
|
+
_k.label = 20;
|
|
148
|
+
case 20:
|
|
149
|
+
_k.trys.push([20, 22, , 23]);
|
|
150
|
+
return [4 /*yield*/, __await(llm.chat.completions.create({
|
|
151
|
+
messages: [
|
|
152
|
+
{
|
|
153
|
+
role: 'system',
|
|
154
|
+
content: 'You are a title generation assistant. Please summarize a short title (no more than 10 words) based on the user\'s input, without punctuation.'
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
role: 'user',
|
|
158
|
+
content: messages[0].content[0].text
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
temperature: 0.5,
|
|
162
|
+
}))];
|
|
163
|
+
case 21:
|
|
164
|
+
summaryResponse = _k.sent();
|
|
165
|
+
title = (_j = (_h = summaryResponse.choices[0]) === null || _h === void 0 ? void 0 : _h.message.content) === null || _j === void 0 ? void 0 : _j.trim();
|
|
166
|
+
if (title) {
|
|
167
|
+
event_1.Dispatcher.instance.dispatch(constants_1.EVENT_THREAD_SET_TITLE, { data: title });
|
|
168
|
+
}
|
|
169
|
+
return [3 /*break*/, 23];
|
|
170
|
+
case 22:
|
|
171
|
+
error_1 = _k.sent();
|
|
172
|
+
console.error('Failed to generate summary title:', error_1);
|
|
173
|
+
return [3 /*break*/, 23];
|
|
174
|
+
case 23: return [2 /*return*/];
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
}); };
|
|
180
|
+
exports.MyModelAdapterStream = MyModelAdapterStream;
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
47
|
+
var t = {};
|
|
48
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
49
|
+
t[p] = s[p];
|
|
50
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
51
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
52
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
53
|
+
t[p[i]] = s[p[i]];
|
|
54
|
+
}
|
|
55
|
+
return t;
|
|
56
|
+
};
|
|
57
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
58
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
59
|
+
};
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.Thread = void 0;
|
|
62
|
+
var antd_1 = require("antd");
|
|
63
|
+
var react_1 = __importStar(require("react"));
|
|
64
|
+
var react_hook_speech_to_text_1 = __importDefault(require("react-hook-speech-to-text"));
|
|
65
|
+
var icons_1 = require("@ant-design/icons");
|
|
66
|
+
var react_2 = require("@assistant-ui/react");
|
|
67
|
+
var MarkdownText_1 = require("../MarkdownText");
|
|
68
|
+
var index_style_1 = require("./index.style");
|
|
69
|
+
var context_1 = require("../../context");
|
|
70
|
+
var useI18n_1 = require("../../hooks/useI18n");
|
|
71
|
+
// 当前聊天对话上下文
|
|
72
|
+
var Thread = function () {
|
|
73
|
+
var config = (0, react_1.useContext)(context_1.AIConfigContext);
|
|
74
|
+
var t = (0, useI18n_1.useI18n)().t;
|
|
75
|
+
return (react_1.default.createElement(react_2.ThreadPrimitive.Root, { style: { height: '100%' } },
|
|
76
|
+
react_1.default.createElement(react_2.ThreadPrimitive.Viewport, { style: { height: '100%', overflowY: 'scroll' } },
|
|
77
|
+
react_1.default.createElement("div", { style: {
|
|
78
|
+
display: 'flex',
|
|
79
|
+
flexDirection: 'column',
|
|
80
|
+
minHeight: '100%',
|
|
81
|
+
} },
|
|
82
|
+
react_1.default.createElement("div", { style: {
|
|
83
|
+
flexGrow: 1,
|
|
84
|
+
paddingBottom: 24,
|
|
85
|
+
} },
|
|
86
|
+
react_1.default.createElement("div", { style: { padding: '0px 24px' } },
|
|
87
|
+
react_1.default.createElement(ThreadWelcome, null),
|
|
88
|
+
react_1.default.createElement(react_2.ThreadPrimitive.Messages, { components: {
|
|
89
|
+
UserMessage: UserMessage,
|
|
90
|
+
EditComposer: EditComposer,
|
|
91
|
+
AssistantMessage: AssistantMessage,
|
|
92
|
+
} }),
|
|
93
|
+
react_1.default.createElement(react_2.ThreadPrimitive.If, { empty: true },
|
|
94
|
+
react_1.default.createElement(antd_1.Alert, { style: {
|
|
95
|
+
margin: '16px 0px',
|
|
96
|
+
maxWidth: '100%',
|
|
97
|
+
}, type: "warning", message: config.emptyMessage || t('defaultEmpty') })))),
|
|
98
|
+
react_1.default.createElement(index_style_1.ButtomSpace, { style: { width: '100%', boxSizing: 'border-box', paddingBottom: 16 } },
|
|
99
|
+
react_1.default.createElement(ThreadScrollToBottom, null),
|
|
100
|
+
react_1.default.createElement(Composer, null))))));
|
|
101
|
+
};
|
|
102
|
+
exports.Thread = Thread;
|
|
103
|
+
// 滚动到消息底部
|
|
104
|
+
var ThreadScrollToBottom = function () {
|
|
105
|
+
return (react_1.default.createElement(react_2.ThreadPrimitive.ScrollToBottom, { asChild: true },
|
|
106
|
+
react_1.default.createElement(antd_1.Button, { style: {
|
|
107
|
+
width: '47px',
|
|
108
|
+
height: '47px',
|
|
109
|
+
borderRadius: 12,
|
|
110
|
+
}, type: "dashed", icon: react_1.default.createElement(icons_1.ArrowDownOutlined, null) })));
|
|
111
|
+
};
|
|
112
|
+
// 顶部的欢迎语
|
|
113
|
+
var ThreadWelcome = function () {
|
|
114
|
+
var config = (0, react_1.useContext)(context_1.AIConfigContext);
|
|
115
|
+
var t = (0, useI18n_1.useI18n)().t;
|
|
116
|
+
return (react_1.default.createElement(react_2.ThreadPrimitive.Empty, null,
|
|
117
|
+
react_1.default.createElement(antd_1.Alert, { style: {
|
|
118
|
+
maxWidth: '100%',
|
|
119
|
+
}, message: config.welcomeMessage || t('defaultWelcome') }),
|
|
120
|
+
react_1.default.createElement(ThreadWelcomeSuggestions, null)));
|
|
121
|
+
};
|
|
122
|
+
// 推荐的预置几个问答
|
|
123
|
+
var ThreadWelcomeSuggestions = function () {
|
|
124
|
+
var config = (0, react_1.useContext)(context_1.AIConfigContext);
|
|
125
|
+
var _a = (0, useI18n_1.useI18n)(), t = _a.t, locale = _a.locale;
|
|
126
|
+
var suggestions = config.suggestions || (locale === 'zh-CN'
|
|
127
|
+
? ["如何用 Typescript 实现 Helloworld?", "物联网是什么?"]
|
|
128
|
+
: ["How to implement Helloworld in Typescript?", "What is IoT?"]);
|
|
129
|
+
return (react_1.default.createElement(antd_1.Space, { style: { marginTop: 24 } }, suggestions.map(function (suggestion, index) { return (react_1.default.createElement(react_2.ThreadPrimitive.Suggestion, { key: index, prompt: suggestion, method: "replace", style: { border: 'none', padding: 0 }, autoSend: true },
|
|
130
|
+
react_1.default.createElement(antd_1.Card, { hoverable: true }, suggestion))); })));
|
|
131
|
+
};
|
|
132
|
+
// 底部的输入框
|
|
133
|
+
var Composer = function () {
|
|
134
|
+
var config = (0, react_1.useContext)(context_1.AIConfigContext);
|
|
135
|
+
var t = (0, useI18n_1.useI18n)().t;
|
|
136
|
+
return (react_1.default.createElement(react_2.ComposerPrimitive.Root, null,
|
|
137
|
+
react_1.default.createElement(index_style_1.InputSpace, null,
|
|
138
|
+
react_1.default.createElement(index_style_1.UserInput, { rows: 1, autoFocus: true, placeholder: config.placeholder || t('defaultPlaceholder') }),
|
|
139
|
+
react_1.default.createElement(ComposerAction, null))));
|
|
140
|
+
};
|
|
141
|
+
// 小鸟叽叽喳喳地唱着动听的歌,五颜六色的花朵随风舞动,像是在跟我打招呼,真是太美妙啦!
|
|
142
|
+
var SpeechInputButton = function () {
|
|
143
|
+
var _a = (0, react_hook_speech_to_text_1.default)({
|
|
144
|
+
continuous: true,
|
|
145
|
+
useLegacyResults: false,
|
|
146
|
+
}), error = _a.error, interimResult = _a.interimResult, isRecording = _a.isRecording, results = _a.results, startSpeechToText = _a.startSpeechToText, stopSpeechToText = _a.stopSpeechToText;
|
|
147
|
+
var threadRuntime = (0, react_2.useThreadRuntime)();
|
|
148
|
+
(0, react_1.useEffect)(function () {
|
|
149
|
+
if (interimResult) {
|
|
150
|
+
threadRuntime.composer.setText(interimResult);
|
|
151
|
+
}
|
|
152
|
+
}, [interimResult]);
|
|
153
|
+
if (error) {
|
|
154
|
+
console.log("Web Speech API is not available in this browser.", error);
|
|
155
|
+
return react_1.default.createElement(react_1.default.Fragment, null);
|
|
156
|
+
}
|
|
157
|
+
return (react_1.default.createElement(antd_1.Button, { style: {
|
|
158
|
+
width: '47px',
|
|
159
|
+
height: '47px',
|
|
160
|
+
borderRadius: 12,
|
|
161
|
+
}, onClick: function () {
|
|
162
|
+
if (isRecording) {
|
|
163
|
+
stopSpeechToText();
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
startSpeechToText();
|
|
167
|
+
}
|
|
168
|
+
}, icon: isRecording ? react_1.default.createElement(icons_1.LoadingOutlined, null) : react_1.default.createElement(icons_1.AudioOutlined, null) }));
|
|
169
|
+
};
|
|
170
|
+
// 底部的发送/停止对话消息按钮
|
|
171
|
+
var ComposerAction = function () {
|
|
172
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
173
|
+
react_1.default.createElement(react_2.ThreadPrimitive.If, { running: false },
|
|
174
|
+
react_1.default.createElement(antd_1.Space, null,
|
|
175
|
+
react_1.default.createElement(react_2.ComposerPrimitive.Send, { asChild: true },
|
|
176
|
+
react_1.default.createElement(antd_1.Button, { style: {
|
|
177
|
+
width: '47px',
|
|
178
|
+
height: '47px',
|
|
179
|
+
borderRadius: 12,
|
|
180
|
+
}, icon: react_1.default.createElement(icons_1.SendOutlined, null) })),
|
|
181
|
+
react_1.default.createElement(SpeechInputButton, null))),
|
|
182
|
+
react_1.default.createElement(react_2.ThreadPrimitive.If, { running: true },
|
|
183
|
+
react_1.default.createElement(react_2.ComposerPrimitive.Cancel, { asChild: true },
|
|
184
|
+
react_1.default.createElement(antd_1.Button, { style: {
|
|
185
|
+
width: '47px',
|
|
186
|
+
height: '47px',
|
|
187
|
+
borderRadius: 12,
|
|
188
|
+
}, icon: react_1.default.createElement(icons_1.StopOutlined, null) })))));
|
|
189
|
+
};
|
|
190
|
+
// 用户询问的消息框
|
|
191
|
+
var UserMessage = function () {
|
|
192
|
+
return (react_1.default.createElement(react_2.MessagePrimitive.Root, { style: {
|
|
193
|
+
display: 'flex',
|
|
194
|
+
justifyContent: 'flex-end',
|
|
195
|
+
marginTop: 16,
|
|
196
|
+
} },
|
|
197
|
+
react_1.default.createElement(antd_1.Space, { align: "start" },
|
|
198
|
+
react_1.default.createElement("div", null,
|
|
199
|
+
react_1.default.createElement(antd_1.Space, null,
|
|
200
|
+
react_1.default.createElement(UserActionBar, null),
|
|
201
|
+
react_1.default.createElement(index_style_1.MessageContainer, null,
|
|
202
|
+
react_1.default.createElement(react_2.MessagePrimitive.Content, null))),
|
|
203
|
+
react_1.default.createElement(BranchPicker, { style: { marginTop: 8 } })),
|
|
204
|
+
react_1.default.createElement(antd_1.Avatar, null, "Y"))));
|
|
205
|
+
};
|
|
206
|
+
// 上下文用户消息框的工具栏
|
|
207
|
+
var UserActionBar = function () {
|
|
208
|
+
return (react_1.default.createElement(react_2.ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last" },
|
|
209
|
+
react_1.default.createElement(react_2.ActionBarPrimitive.Edit, { asChild: true },
|
|
210
|
+
react_1.default.createElement(icons_1.EditOutlined, null))));
|
|
211
|
+
};
|
|
212
|
+
// 编辑上下文询问的输入框
|
|
213
|
+
var EditComposer = function () {
|
|
214
|
+
var t = (0, useI18n_1.useI18n)().t;
|
|
215
|
+
return (react_1.default.createElement(react_2.ComposerPrimitive.Root, { style: {
|
|
216
|
+
padding: '16px 8px',
|
|
217
|
+
} },
|
|
218
|
+
react_1.default.createElement(react_2.ComposerPrimitive.Input, { style: {
|
|
219
|
+
width: '100%',
|
|
220
|
+
height: 300,
|
|
221
|
+
boxSizing: 'border-box',
|
|
222
|
+
whiteSpace: 'pre-wrap',
|
|
223
|
+
wordBreak: 'break-word',
|
|
224
|
+
backgroundColor: '#eff6ff',
|
|
225
|
+
borderRadius: '14px',
|
|
226
|
+
border: 'none',
|
|
227
|
+
padding: '8px 20px',
|
|
228
|
+
// @ts-ignore
|
|
229
|
+
borderRadius: '14px',
|
|
230
|
+
} }),
|
|
231
|
+
react_1.default.createElement("div", { style: {
|
|
232
|
+
display: 'flex',
|
|
233
|
+
justifyContent: 'flex-end',
|
|
234
|
+
} },
|
|
235
|
+
react_1.default.createElement(antd_1.Space, null,
|
|
236
|
+
react_1.default.createElement(react_2.ComposerPrimitive.Cancel, { asChild: true },
|
|
237
|
+
react_1.default.createElement(antd_1.Button, { type: "default", size: "small" }, t('cancel'))),
|
|
238
|
+
react_1.default.createElement(react_2.ComposerPrimitive.Send, { asChild: true },
|
|
239
|
+
react_1.default.createElement(antd_1.Button, { type: "primary", size: "small" }, t('send')))))));
|
|
240
|
+
};
|
|
241
|
+
// AI 回答结果的消息框
|
|
242
|
+
var AssistantMessage = function () {
|
|
243
|
+
return (react_1.default.createElement(react_2.MessagePrimitive.Root, { style: {
|
|
244
|
+
marginTop: 16,
|
|
245
|
+
} },
|
|
246
|
+
react_1.default.createElement(antd_1.Space, { align: "start" },
|
|
247
|
+
react_1.default.createElement(antd_1.Avatar, null, "AI"),
|
|
248
|
+
react_1.default.createElement("div", { style: {
|
|
249
|
+
display: 'inline-block',
|
|
250
|
+
} },
|
|
251
|
+
react_1.default.createElement(react_2.MessagePrimitive.Content, { components: { Text: MarkdownText_1.MarkdownText } }),
|
|
252
|
+
react_1.default.createElement(AssistantActionBar, null),
|
|
253
|
+
react_1.default.createElement(BranchPicker, null)))));
|
|
254
|
+
};
|
|
255
|
+
var AssistantActionBar = function () {
|
|
256
|
+
return (react_1.default.createElement(react_2.ActionBarPrimitive.Root, { hideWhenRunning: true, autohide: "not-last", autohideFloat: "single-branch", style: {
|
|
257
|
+
marginTop: 8,
|
|
258
|
+
} },
|
|
259
|
+
react_1.default.createElement(antd_1.Space, null,
|
|
260
|
+
react_1.default.createElement(react_2.ActionBarPrimitive.Copy, { asChild: true },
|
|
261
|
+
react_1.default.createElement("div", { style: { cursor: 'pointer' } },
|
|
262
|
+
react_1.default.createElement(react_2.MessagePrimitive.If, { copied: true },
|
|
263
|
+
react_1.default.createElement(icons_1.CheckCircleOutlined, null)),
|
|
264
|
+
react_1.default.createElement(react_2.MessagePrimitive.If, { copied: false },
|
|
265
|
+
react_1.default.createElement(icons_1.CopyOutlined, null)))),
|
|
266
|
+
react_1.default.createElement(react_2.ActionBarPrimitive.Reload, { asChild: true },
|
|
267
|
+
react_1.default.createElement(icons_1.RedoOutlined, null)),
|
|
268
|
+
react_1.default.createElement(react_2.MessagePrimitive.If, { speaking: true },
|
|
269
|
+
react_1.default.createElement(react_2.ActionBarPrimitive.StopSpeaking, { asChild: true },
|
|
270
|
+
react_1.default.createElement(icons_1.PauseCircleOutlined, null))),
|
|
271
|
+
react_1.default.createElement(react_2.MessagePrimitive.If, { speaking: false },
|
|
272
|
+
react_1.default.createElement(react_2.ActionBarPrimitive.Speak, { asChild: true },
|
|
273
|
+
react_1.default.createElement(icons_1.PlayCircleOutlined, null))))));
|
|
274
|
+
};
|
|
275
|
+
var BranchPicker = function (_a) {
|
|
276
|
+
var className = _a.className, rest = __rest(_a, ["className"]);
|
|
277
|
+
return (react_1.default.createElement(react_2.BranchPickerPrimitive.Root, __assign({ hideWhenSingleBranch: true, style: __assign({ marginTop: 8 }, (rest.style || {})) }, rest),
|
|
278
|
+
react_1.default.createElement(react_2.BranchPickerPrimitive.Previous, { asChild: true },
|
|
279
|
+
react_1.default.createElement(icons_1.LeftOutlined, null)),
|
|
280
|
+
react_1.default.createElement("span", null,
|
|
281
|
+
react_1.default.createElement(react_2.BranchPickerPrimitive.Number, null),
|
|
282
|
+
" / ",
|
|
283
|
+
react_1.default.createElement(react_2.BranchPickerPrimitive.Count, null)),
|
|
284
|
+
react_1.default.createElement(react_2.BranchPickerPrimitive.Next, { asChild: true },
|
|
285
|
+
react_1.default.createElement(icons_1.RightOutlined, null))));
|
|
286
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const MessageContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
2
|
+
export declare const ButtomSpace: import("styled-components").StyledComponent<import("react").FC<import("antd").SpaceProps> & {
|
|
3
|
+
Compact: import("react").FC<import("antd/lib/space/Compact").SpaceCompactProps>;
|
|
4
|
+
}, any, {}, never>;
|
|
5
|
+
export declare const InputSpace: import("styled-components").StyledComponent<import("react").FC<import("antd").SpaceProps> & {
|
|
6
|
+
Compact: import("react").FC<import("antd/lib/space/Compact").SpaceCompactProps>;
|
|
7
|
+
}, any, {}, never>;
|
|
8
|
+
export declare const UserInput: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<import("react-textarea-autosize").TextareaAutosizeProps & {
|
|
9
|
+
asChild?: boolean | undefined;
|
|
10
|
+
submitOnEnter?: boolean | undefined;
|
|
11
|
+
cancelOnEscape?: boolean | undefined;
|
|
12
|
+
unstable_focusOnRunStart?: boolean | undefined;
|
|
13
|
+
unstable_focusOnScrollToBottom?: boolean | undefined;
|
|
14
|
+
unstable_focusOnThreadSwitched?: boolean | undefined;
|
|
15
|
+
} & import("react").RefAttributes<HTMLTextAreaElement>>, any, {}, never>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
3
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
4
|
+
return cooked;
|
|
5
|
+
};
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.UserInput = exports.InputSpace = exports.ButtomSpace = exports.MessageContainer = void 0;
|
|
11
|
+
var react_1 = require("@assistant-ui/react");
|
|
12
|
+
var antd_1 = require("antd");
|
|
13
|
+
var styled_components_1 = __importDefault(require("styled-components"));
|
|
14
|
+
exports.MessageContainer = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n box-sizing: border-box;\n white-space: pre-wrap;\n word-break: break-word;\n background-color: #eff6ff;\n border-radius: 14px;\n padding: 8px 20px;\n\n & > p {\n margin-bottom: 0;\n }\n"], ["\n box-sizing: border-box;\n white-space: pre-wrap;\n word-break: break-word;\n background-color: #eff6ff;\n border-radius: 14px;\n padding: 8px 20px;\n\n & > p {\n margin-bottom: 0;\n }\n"])));
|
|
15
|
+
exports.ButtomSpace = (0, styled_components_1.default)(antd_1.Space)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n position: sticky;\n bottom: 0;\n padding-top: 16px;\n background-color: #fff;\n padding: 0 24px;\n & > div:nth-child(2) {\n flex-grow: 1;\n }\n"], ["\n position: sticky;\n bottom: 0;\n padding-top: 16px;\n background-color: #fff;\n padding: 0 24px;\n & > div:nth-child(2) {\n flex-grow: 1;\n }\n"])));
|
|
16
|
+
exports.InputSpace = (0, styled_components_1.default)(antd_1.Space)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n width: 100%;\n & > div:nth-child(1) {\n flex-grow: 1;\n }\n"], ["\n width: 100%;\n & > div:nth-child(1) {\n flex-grow: 1;\n }\n"])));
|
|
17
|
+
exports.UserInput = (0, styled_components_1.default)(react_1.ComposerPrimitive.Input)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n flex-grow: 1;\n padding: 10px;\n background-color: #f7f7f8; /* \u7C7B\u4F3C ChatGPT \u7684\u6D45\u80CC\u666F */\n border-radius: 12px;\n border: 1px solid #d1d5db; /* \u8FB9\u6846\u989C\u8272 */\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* \u5FAE\u5999\u7684\u9634\u5F71\u6548\u679C */\n transition: border-color 0.3s ease; /* \u52A8\u753B\u6548\u679C */\n outline: none;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n font-size: 16px;\n color: #333;\n min-height: 40px;\n max-height: 200px;\n resize: none;\n transition: background-color 0.5s ease;\n overflow-y: auto;\n\n &:focus {\n background-color: #fff;\n border-color: #40a9ff;\n }\n"], ["\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n flex-grow: 1;\n padding: 10px;\n background-color: #f7f7f8; /* \u7C7B\u4F3C ChatGPT \u7684\u6D45\u80CC\u666F */\n border-radius: 12px;\n border: 1px solid #d1d5db; /* \u8FB9\u6846\u989C\u8272 */\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); /* \u5FAE\u5999\u7684\u9634\u5F71\u6548\u679C */\n transition: border-color 0.3s ease; /* \u52A8\u753B\u6548\u679C */\n outline: none;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n font-size: 16px;\n color: #333;\n min-height: 40px;\n max-height: 200px;\n resize: none;\n transition: background-color 0.5s ease;\n overflow-y: auto;\n\n &:focus {\n background-color: #fff;\n border-color: #40a9ff;\n }\n"])));
|
|
18
|
+
var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.ThreadList = void 0;
|
|
48
|
+
var antd_1 = require("antd");
|
|
49
|
+
var react_1 = __importStar(require("react"));
|
|
50
|
+
var icons_1 = require("@ant-design/icons");
|
|
51
|
+
var react_2 = require("@assistant-ui/react");
|
|
52
|
+
var event_1 = require("@/utils/event");
|
|
53
|
+
var constants_1 = require("@/constants");
|
|
54
|
+
var antd_2 = require("antd");
|
|
55
|
+
var useI18n_1 = require("../../hooks/useI18n");
|
|
56
|
+
// 聊天列表
|
|
57
|
+
var ThreadList = function (_a) {
|
|
58
|
+
var onItemClick = _a.onItemClick;
|
|
59
|
+
return (react_1.default.createElement(react_2.ThreadListPrimitive.Root, { style: {
|
|
60
|
+
display: 'flex',
|
|
61
|
+
flexDirection: 'column',
|
|
62
|
+
} },
|
|
63
|
+
react_1.default.createElement(ThreadListItems, { onItemClick: onItemClick })));
|
|
64
|
+
};
|
|
65
|
+
exports.ThreadList = ThreadList;
|
|
66
|
+
// 点击创建新聊天
|
|
67
|
+
var ThreadListNew = function () {
|
|
68
|
+
var t = (0, useI18n_1.useI18n)().t;
|
|
69
|
+
return (react_1.default.createElement(react_2.ThreadListPrimitive.New, { asChild: true },
|
|
70
|
+
react_1.default.createElement(antd_1.Button, { type: "primary", icon: react_1.default.createElement(icons_1.PlusOutlined, null), style: { width: '100%', marginBottom: 16 } }, t('newChat'))));
|
|
71
|
+
};
|
|
72
|
+
// 聊天列表
|
|
73
|
+
var ThreadListItems = function (_a) {
|
|
74
|
+
var onItemClick = _a.onItemClick;
|
|
75
|
+
var runtime = (0, react_2.useAssistantRuntime)();
|
|
76
|
+
var threads = runtime.threads.getState().threads;
|
|
77
|
+
var t = (0, useI18n_1.useI18n)().t;
|
|
78
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
79
|
+
react_1.default.createElement(react_2.ThreadListPrimitive.Items, { components: {
|
|
80
|
+
ThreadListItem: function (props) { return (react_1.default.createElement(ThreadListItem, __assign({}, props, { onClick: onItemClick }))); },
|
|
81
|
+
} }),
|
|
82
|
+
threads.length === 0 && (react_1.default.createElement(antd_2.Empty, { description: t('noHistory'), style: { marginTop: 48 } }))));
|
|
83
|
+
};
|
|
84
|
+
var ThreadListItem = function (_a) {
|
|
85
|
+
var onClick = _a.onClick;
|
|
86
|
+
return (react_1.default.createElement(react_2.ThreadListItemPrimitive.Root, { className: "ant-btn", style: {
|
|
87
|
+
marginTop: '8px',
|
|
88
|
+
display: 'flex',
|
|
89
|
+
alignItems: 'center',
|
|
90
|
+
justifyContent: 'space-between',
|
|
91
|
+
width: '100%',
|
|
92
|
+
padding: '8px 12px',
|
|
93
|
+
height: 'auto'
|
|
94
|
+
} },
|
|
95
|
+
react_1.default.createElement(react_2.ThreadListItemPrimitive.Trigger, { onClick: onClick, style: {
|
|
96
|
+
border: 'none',
|
|
97
|
+
padding: 0,
|
|
98
|
+
background: 'transparent',
|
|
99
|
+
flex: 1,
|
|
100
|
+
overflow: 'hidden',
|
|
101
|
+
textOverflow: 'ellipsis',
|
|
102
|
+
display: 'block',
|
|
103
|
+
textAlign: 'left',
|
|
104
|
+
cursor: 'pointer'
|
|
105
|
+
} },
|
|
106
|
+
react_1.default.createElement(ThreadListItemTitle, null)),
|
|
107
|
+
react_1.default.createElement(ThreadListItemDelete, null)));
|
|
108
|
+
};
|
|
109
|
+
// 点击切换聊天
|
|
110
|
+
var ThreadListItemTitle = function () {
|
|
111
|
+
var runtime = (0, react_2.useThreadListItemRuntime)();
|
|
112
|
+
var t = (0, useI18n_1.useI18n)().t;
|
|
113
|
+
(0, react_1.useEffect)(function () {
|
|
114
|
+
var handle = function (event) {
|
|
115
|
+
var state = runtime.getState();
|
|
116
|
+
if (state.isMain) {
|
|
117
|
+
runtime.rename(event.data);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
event_1.Dispatcher.instance.addEventListener(constants_1.EVENT_THREAD_SET_TITLE, handle);
|
|
121
|
+
return function () {
|
|
122
|
+
event_1.Dispatcher.instance.removeEventListener(constants_1.EVENT_THREAD_SET_TITLE, handle);
|
|
123
|
+
};
|
|
124
|
+
}, [runtime]);
|
|
125
|
+
return react_1.default.createElement(react_2.ThreadListItemPrimitive.Title, { fallback: react_1.default.createElement("div", null, t('newChatFallback')) });
|
|
126
|
+
};
|
|
127
|
+
// 归档按钮
|
|
128
|
+
var ThreadListItemDelete = function () {
|
|
129
|
+
return (react_1.default.createElement(react_2.ThreadListItemPrimitive.Delete, { asChild: true },
|
|
130
|
+
react_1.default.createElement(icons_1.DeleteOutlined, null)));
|
|
131
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const EVENT_THREAD_SET_TITLE = "thread-set-title";
|