mehdi-akbari-ai-assistant-free 0.2.0 → 0.4.0
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/dist/index.js +1 -79
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -52
- package/dist/index.mjs.map +1 -1
- package/dist/react.js +1 -186
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +1 -150
- package/dist/react.mjs.map +1 -1
- package/package.json +3 -2
package/dist/index.js
CHANGED
|
@@ -1,80 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
|
-
var index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
AiRobot: () => AiRobot
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(index_exports);
|
|
26
|
-
|
|
27
|
-
// src/core/ai-robot.ts
|
|
28
|
-
var import_groq = require("@langchain/groq");
|
|
29
|
-
var AiRobot = class {
|
|
30
|
-
constructor(config) {
|
|
31
|
-
if (!config.apiKey) {
|
|
32
|
-
throw new Error("API Key is required for AiRobot.");
|
|
33
|
-
}
|
|
34
|
-
this.systemPrompt = config.systemPrompt || "You are a helpful assistant.";
|
|
35
|
-
this.model = new import_groq.ChatGroq({
|
|
36
|
-
apiKey: config.apiKey,
|
|
37
|
-
model: config.model || "llama3-8b-8192"
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
/**
|
|
42
|
-
* این متد پیامها را به فرمت مورد نیاز LangChain تبدیل میکند.
|
|
43
|
-
* تایپ خروجی برای سازگاری با نسخههای جدید LangChain اصلاح شده است.
|
|
44
|
-
*
|
|
45
|
-
* Return plain message objects with explicit `role` and `content` to match
|
|
46
|
-
* the BaseMessageLike / MessageFieldWithRole shape expected by model.invoke().
|
|
47
|
-
*/
|
|
48
|
-
formatMessages(messages) {
|
|
49
|
-
const formatted = [
|
|
50
|
-
{ role: "system", content: this.systemPrompt }
|
|
51
|
-
];
|
|
52
|
-
messages.forEach((msg) => {
|
|
53
|
-
if (msg.role === "user") {
|
|
54
|
-
formatted.push({ role: "user", content: msg.content });
|
|
55
|
-
} else if (msg.role === "assistant") {
|
|
56
|
-
formatted.push({ role: "assistant", content: msg.content });
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
return formatted;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* متد اصلی برای ارسال پیام و دریافت پاسخ.
|
|
63
|
-
* شامل حالت Mock برای جلوگیری از خطا در صورت قطعی اینترنت.
|
|
64
|
-
*/
|
|
65
|
-
async chat(messages) {
|
|
66
|
-
try {
|
|
67
|
-
const formattedMessages = this.formatMessages(messages);
|
|
68
|
-
const response = await this.model.invoke(formattedMessages);
|
|
69
|
-
return response.content;
|
|
70
|
-
} catch (error) {
|
|
71
|
-
console.warn("AI connection failed. Returning a mock response.", error);
|
|
72
|
-
return "\u0627\u06CC\u0646\u062A\u0631\u0646\u062A \u0634\u0645\u0627 \u0645\u062A\u0635\u0644 \u0646\u06CC\u0633\u062A\u060C \u0627\u0645\u0627 \u067E\u06A9\u06CC\u062C \u0628\u0647 \u062F\u0631\u0633\u062A\u06CC \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F! \u2705 (\u0627\u06CC\u0646 \u06CC\u06A9 \u067E\u06CC\u0627\u0645 \u062A\u0633\u062A\u06CC \u0627\u0633\u062A)";
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
77
|
-
0 && (module.exports = {
|
|
78
|
-
AiRobot
|
|
79
|
-
});
|
|
1
|
+
"use strict";var a=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(s,t)=>{for(var e in t)a(s,e,{get:t[e],enumerable:!0})},f=(s,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of p(t))!c.call(s,o)&&o!==e&&a(s,o,{get:()=>t[o],enumerable:!(r=m(t,o))||r.enumerable});return s};var h=s=>f(a({},"__esModule",{value:!0}),s);var u={};l(u,{AiRobot:()=>n});module.exports=h(u);var i=require("@langchain/groq"),n=class{constructor(t){if(!t.apiKey)throw new Error("API Key is required for AiRobot.");this.systemPrompt=t.systemPrompt||"You are a helpful assistant.",this.model=new i.ChatGroq({apiKey:t.apiKey,model:t.model||"llama3-8b-8192"})}formatMessages(t){let e=[{role:"system",content:this.systemPrompt}];return t.forEach(r=>{r.role==="user"?e.push({role:"user",content:r.content}):r.role==="assistant"&&e.push({role:"assistant",content:r.content})}),e}async chat(t){try{let e=this.formatMessages(t);return(await this.model.invoke(e)).content}catch(e){return console.warn("AI connection failed. Returning a mock response.",e),"\u0627\u06CC\u0646\u062A\u0631\u0646\u062A \u0634\u0645\u0627 \u0645\u062A\u0635\u0644 \u0646\u06CC\u0633\u062A\u060C \u0627\u0645\u0627 \u067E\u06A9\u06CC\u062C \u0628\u0647 \u062F\u0631\u0633\u062A\u06CC \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F! \u2705 (\u0627\u06CC\u0646 \u06CC\u06A9 \u067E\u06CC\u0627\u0645 \u062A\u0633\u062A\u06CC \u0627\u0633\u062A)"}}};0&&(module.exports={AiRobot});
|
|
80
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/ai-robot.ts"],"sourcesContent":["export * from \"./types\";\r\nexport { AiRobot } from \"./core/ai-robot\";","import { ChatGroq } from \"@langchain/groq\";\r\nimport { AiRobotConfig, Message } from \"../types\";\r\n\r\nexport class AiRobot {\r\n private model: ChatGroq;\r\n private systemPrompt: string;\r\n\r\n constructor(config: AiRobotConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"API Key is required for AiRobot.\");\r\n }\r\n\r\n this.systemPrompt = config.systemPrompt || \"You are a helpful assistant.\";\r\n\r\n this.model = new ChatGroq({\r\n apiKey: config.apiKey,\r\n model: config.model || \"llama3-8b-8192\",\r\n });\r\n }\r\n\r\n /**\r\n /**\r\n * این متد پیامها را به فرمت مورد نیاز LangChain تبدیل میکند.\r\n * تایپ خروجی برای سازگاری با نسخههای جدید LangChain اصلاح شده است.\r\n *\r\n * Return plain message objects with explicit `role` and `content` to match\r\n * the BaseMessageLike / MessageFieldWithRole shape expected by model.invoke().\r\n */\r\n private formatMessages(messages: Message[]): { role: 'system' | 'user' | 'assistant' | string; content: string }[] {\r\n const formatted: { role: 'system' | 'user' | 'assistant' | string; content: string }[] = [\r\n { role: 'system', content: this.systemPrompt }\r\n ];\r\n\r\n messages.forEach((msg) => {\r\n if (msg.role === 'user') {\r\n formatted.push({ role: 'user', content: msg.content });\r\n } else if (msg.role === 'assistant') {\r\n formatted.push({ role: 'assistant', content: msg.content });\r\n }\r\n });\r\n\r\n return formatted;\r\n }\r\n /**\r\n * متد اصلی برای ارسال پیام و دریافت پاسخ.\r\n * شامل حالت Mock برای جلوگیری از خطا در صورت قطعی اینترنت.\r\n */\r\n async chat(messages: Message[]): Promise<string> {\r\n try {\r\n const formattedMessages = this.formatMessages(messages);\r\n const response = await this.model.invoke(formattedMessages);\r\n return response.content as string;\r\n } catch (error) {\r\n console.warn(\"AI connection failed. Returning a mock response.\", error);\r\n return \"اینترنت شما متصل نیست، اما پکیج به درستی کار میکند! ✅ (این یک پیام تستی است)\";\r\n }\r\n }\r\n}"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/ai-robot.ts"],"sourcesContent":["export * from \"./types\";\r\nexport { AiRobot } from \"./core/ai-robot\";","import { ChatGroq } from \"@langchain/groq\";\r\nimport { AiRobotConfig, Message } from \"../types\";\r\n\r\nexport class AiRobot {\r\n private model: ChatGroq;\r\n private systemPrompt: string;\r\n\r\n constructor(config: AiRobotConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"API Key is required for AiRobot.\");\r\n }\r\n\r\n this.systemPrompt = config.systemPrompt || \"You are a helpful assistant.\";\r\n\r\n this.model = new ChatGroq({\r\n apiKey: config.apiKey,\r\n model: config.model || \"llama3-8b-8192\",\r\n });\r\n }\r\n\r\n /**\r\n /**\r\n * این متد پیامها را به فرمت مورد نیاز LangChain تبدیل میکند.\r\n * تایپ خروجی برای سازگاری با نسخههای جدید LangChain اصلاح شده است.\r\n *\r\n * Return plain message objects with explicit `role` and `content` to match\r\n * the BaseMessageLike / MessageFieldWithRole shape expected by model.invoke().\r\n */\r\n private formatMessages(messages: Message[]): { role: 'system' | 'user' | 'assistant' | string; content: string }[] {\r\n const formatted: { role: 'system' | 'user' | 'assistant' | string; content: string }[] = [\r\n { role: 'system', content: this.systemPrompt }\r\n ];\r\n\r\n messages.forEach((msg) => {\r\n if (msg.role === 'user') {\r\n formatted.push({ role: 'user', content: msg.content });\r\n } else if (msg.role === 'assistant') {\r\n formatted.push({ role: 'assistant', content: msg.content });\r\n }\r\n });\r\n\r\n return formatted;\r\n }\r\n /**\r\n * متد اصلی برای ارسال پیام و دریافت پاسخ.\r\n * شامل حالت Mock برای جلوگیری از خطا در صورت قطعی اینترنت.\r\n */\r\n async chat(messages: Message[]): Promise<string> {\r\n try {\r\n const formattedMessages = this.formatMessages(messages);\r\n const response = await this.model.invoke(formattedMessages);\r\n return response.content as string;\r\n } catch (error) {\r\n console.warn(\"AI connection failed. Returning a mock response.\", error);\r\n return \"اینترنت شما متصل نیست، اما پکیج به درستی کار میکند! ✅ (این یک پیام تستی است)\";\r\n }\r\n }\r\n}"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GCAA,IAAAI,EAAyB,2BAGZC,EAAN,KAAc,CAInB,YAAYC,EAAuB,CACjC,GAAI,CAACA,EAAO,OACV,MAAM,IAAI,MAAM,kCAAkC,EAGpD,KAAK,aAAeA,EAAO,cAAgB,+BAE3C,KAAK,MAAQ,IAAI,WAAS,CACxB,OAAQA,EAAO,OACf,MAAOA,EAAO,OAAS,gBACzB,CAAC,CACH,CAUQ,eAAeC,EAA4F,CACjH,IAAMC,EAAmF,CACvF,CAAE,KAAM,SAAU,QAAS,KAAK,YAAa,CAC/C,EAEA,OAAAD,EAAS,QAASE,GAAQ,CACpBA,EAAI,OAAS,OACfD,EAAU,KAAK,CAAE,KAAM,OAAQ,QAASC,EAAI,OAAQ,CAAC,EAC5CA,EAAI,OAAS,aACtBD,EAAU,KAAK,CAAE,KAAM,YAAa,QAASC,EAAI,OAAQ,CAAC,CAE9D,CAAC,EAEMD,CACT,CAKA,MAAM,KAAKD,EAAsC,CAC/C,GAAI,CACF,IAAMG,EAAoB,KAAK,eAAeH,CAAQ,EAEtD,OADiB,MAAM,KAAK,MAAM,OAAOG,CAAiB,GAC1C,OAClB,OAASC,EAAO,CACd,eAAQ,KAAK,mDAAoDA,CAAK,EAC/D,sXACT,CACF,CACF","names":["index_exports","__export","AiRobot","__toCommonJS","import_groq","AiRobot","config","messages","formatted","msg","formattedMessages","error"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,53 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { ChatGroq } from "@langchain/groq";
|
|
3
|
-
var AiRobot = class {
|
|
4
|
-
constructor(config) {
|
|
5
|
-
if (!config.apiKey) {
|
|
6
|
-
throw new Error("API Key is required for AiRobot.");
|
|
7
|
-
}
|
|
8
|
-
this.systemPrompt = config.systemPrompt || "You are a helpful assistant.";
|
|
9
|
-
this.model = new ChatGroq({
|
|
10
|
-
apiKey: config.apiKey,
|
|
11
|
-
model: config.model || "llama3-8b-8192"
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
/**
|
|
16
|
-
* این متد پیامها را به فرمت مورد نیاز LangChain تبدیل میکند.
|
|
17
|
-
* تایپ خروجی برای سازگاری با نسخههای جدید LangChain اصلاح شده است.
|
|
18
|
-
*
|
|
19
|
-
* Return plain message objects with explicit `role` and `content` to match
|
|
20
|
-
* the BaseMessageLike / MessageFieldWithRole shape expected by model.invoke().
|
|
21
|
-
*/
|
|
22
|
-
formatMessages(messages) {
|
|
23
|
-
const formatted = [
|
|
24
|
-
{ role: "system", content: this.systemPrompt }
|
|
25
|
-
];
|
|
26
|
-
messages.forEach((msg) => {
|
|
27
|
-
if (msg.role === "user") {
|
|
28
|
-
formatted.push({ role: "user", content: msg.content });
|
|
29
|
-
} else if (msg.role === "assistant") {
|
|
30
|
-
formatted.push({ role: "assistant", content: msg.content });
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
return formatted;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* متد اصلی برای ارسال پیام و دریافت پاسخ.
|
|
37
|
-
* شامل حالت Mock برای جلوگیری از خطا در صورت قطعی اینترنت.
|
|
38
|
-
*/
|
|
39
|
-
async chat(messages) {
|
|
40
|
-
try {
|
|
41
|
-
const formattedMessages = this.formatMessages(messages);
|
|
42
|
-
const response = await this.model.invoke(formattedMessages);
|
|
43
|
-
return response.content;
|
|
44
|
-
} catch (error) {
|
|
45
|
-
console.warn("AI connection failed. Returning a mock response.", error);
|
|
46
|
-
return "\u0627\u06CC\u0646\u062A\u0631\u0646\u062A \u0634\u0645\u0627 \u0645\u062A\u0635\u0644 \u0646\u06CC\u0633\u062A\u060C \u0627\u0645\u0627 \u067E\u06A9\u06CC\u062C \u0628\u0647 \u062F\u0631\u0633\u062A\u06CC \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F! \u2705 (\u0627\u06CC\u0646 \u06CC\u06A9 \u067E\u06CC\u0627\u0645 \u062A\u0633\u062A\u06CC \u0627\u0633\u062A)";
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
export {
|
|
51
|
-
AiRobot
|
|
52
|
-
};
|
|
1
|
+
import{ChatGroq as o}from"@langchain/groq";var r=class{constructor(t){if(!t.apiKey)throw new Error("API Key is required for AiRobot.");this.systemPrompt=t.systemPrompt||"You are a helpful assistant.",this.model=new o({apiKey:t.apiKey,model:t.model||"llama3-8b-8192"})}formatMessages(t){let e=[{role:"system",content:this.systemPrompt}];return t.forEach(s=>{s.role==="user"?e.push({role:"user",content:s.content}):s.role==="assistant"&&e.push({role:"assistant",content:s.content})}),e}async chat(t){try{let e=this.formatMessages(t);return(await this.model.invoke(e)).content}catch(e){return console.warn("AI connection failed. Returning a mock response.",e),"\u0627\u06CC\u0646\u062A\u0631\u0646\u062A \u0634\u0645\u0627 \u0645\u062A\u0635\u0644 \u0646\u06CC\u0633\u062A\u060C \u0627\u0645\u0627 \u067E\u06A9\u06CC\u062C \u0628\u0647 \u062F\u0631\u0633\u062A\u06CC \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u062F! \u2705 (\u0627\u06CC\u0646 \u06CC\u06A9 \u067E\u06CC\u0627\u0645 \u062A\u0633\u062A\u06CC \u0627\u0633\u062A)"}}};export{r as AiRobot};
|
|
53
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/ai-robot.ts"],"sourcesContent":["import { ChatGroq } from \"@langchain/groq\";\r\nimport { AiRobotConfig, Message } from \"../types\";\r\n\r\nexport class AiRobot {\r\n private model: ChatGroq;\r\n private systemPrompt: string;\r\n\r\n constructor(config: AiRobotConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"API Key is required for AiRobot.\");\r\n }\r\n\r\n this.systemPrompt = config.systemPrompt || \"You are a helpful assistant.\";\r\n\r\n this.model = new ChatGroq({\r\n apiKey: config.apiKey,\r\n model: config.model || \"llama3-8b-8192\",\r\n });\r\n }\r\n\r\n /**\r\n /**\r\n * این متد پیامها را به فرمت مورد نیاز LangChain تبدیل میکند.\r\n * تایپ خروجی برای سازگاری با نسخههای جدید LangChain اصلاح شده است.\r\n *\r\n * Return plain message objects with explicit `role` and `content` to match\r\n * the BaseMessageLike / MessageFieldWithRole shape expected by model.invoke().\r\n */\r\n private formatMessages(messages: Message[]): { role: 'system' | 'user' | 'assistant' | string; content: string }[] {\r\n const formatted: { role: 'system' | 'user' | 'assistant' | string; content: string }[] = [\r\n { role: 'system', content: this.systemPrompt }\r\n ];\r\n\r\n messages.forEach((msg) => {\r\n if (msg.role === 'user') {\r\n formatted.push({ role: 'user', content: msg.content });\r\n } else if (msg.role === 'assistant') {\r\n formatted.push({ role: 'assistant', content: msg.content });\r\n }\r\n });\r\n\r\n return formatted;\r\n }\r\n /**\r\n * متد اصلی برای ارسال پیام و دریافت پاسخ.\r\n * شامل حالت Mock برای جلوگیری از خطا در صورت قطعی اینترنت.\r\n */\r\n async chat(messages: Message[]): Promise<string> {\r\n try {\r\n const formattedMessages = this.formatMessages(messages);\r\n const response = await this.model.invoke(formattedMessages);\r\n return response.content as string;\r\n } catch (error) {\r\n console.warn(\"AI connection failed. Returning a mock response.\", error);\r\n return \"اینترنت شما متصل نیست، اما پکیج به درستی کار میکند! ✅ (این یک پیام تستی است)\";\r\n }\r\n }\r\n}"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/core/ai-robot.ts"],"sourcesContent":["import { ChatGroq } from \"@langchain/groq\";\r\nimport { AiRobotConfig, Message } from \"../types\";\r\n\r\nexport class AiRobot {\r\n private model: ChatGroq;\r\n private systemPrompt: string;\r\n\r\n constructor(config: AiRobotConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"API Key is required for AiRobot.\");\r\n }\r\n\r\n this.systemPrompt = config.systemPrompt || \"You are a helpful assistant.\";\r\n\r\n this.model = new ChatGroq({\r\n apiKey: config.apiKey,\r\n model: config.model || \"llama3-8b-8192\",\r\n });\r\n }\r\n\r\n /**\r\n /**\r\n * این متد پیامها را به فرمت مورد نیاز LangChain تبدیل میکند.\r\n * تایپ خروجی برای سازگاری با نسخههای جدید LangChain اصلاح شده است.\r\n *\r\n * Return plain message objects with explicit `role` and `content` to match\r\n * the BaseMessageLike / MessageFieldWithRole shape expected by model.invoke().\r\n */\r\n private formatMessages(messages: Message[]): { role: 'system' | 'user' | 'assistant' | string; content: string }[] {\r\n const formatted: { role: 'system' | 'user' | 'assistant' | string; content: string }[] = [\r\n { role: 'system', content: this.systemPrompt }\r\n ];\r\n\r\n messages.forEach((msg) => {\r\n if (msg.role === 'user') {\r\n formatted.push({ role: 'user', content: msg.content });\r\n } else if (msg.role === 'assistant') {\r\n formatted.push({ role: 'assistant', content: msg.content });\r\n }\r\n });\r\n\r\n return formatted;\r\n }\r\n /**\r\n * متد اصلی برای ارسال پیام و دریافت پاسخ.\r\n * شامل حالت Mock برای جلوگیری از خطا در صورت قطعی اینترنت.\r\n */\r\n async chat(messages: Message[]): Promise<string> {\r\n try {\r\n const formattedMessages = this.formatMessages(messages);\r\n const response = await this.model.invoke(formattedMessages);\r\n return response.content as string;\r\n } catch (error) {\r\n console.warn(\"AI connection failed. Returning a mock response.\", error);\r\n return \"اینترنت شما متصل نیست، اما پکیج به درستی کار میکند! ✅ (این یک پیام تستی است)\";\r\n }\r\n }\r\n}"],"mappings":"AAAA,OAAS,YAAAA,MAAgB,kBAGlB,IAAMC,EAAN,KAAc,CAInB,YAAYC,EAAuB,CACjC,GAAI,CAACA,EAAO,OACV,MAAM,IAAI,MAAM,kCAAkC,EAGpD,KAAK,aAAeA,EAAO,cAAgB,+BAE3C,KAAK,MAAQ,IAAIF,EAAS,CACxB,OAAQE,EAAO,OACf,MAAOA,EAAO,OAAS,gBACzB,CAAC,CACH,CAUQ,eAAeC,EAA4F,CACjH,IAAMC,EAAmF,CACvF,CAAE,KAAM,SAAU,QAAS,KAAK,YAAa,CAC/C,EAEA,OAAAD,EAAS,QAASE,GAAQ,CACpBA,EAAI,OAAS,OACfD,EAAU,KAAK,CAAE,KAAM,OAAQ,QAASC,EAAI,OAAQ,CAAC,EAC5CA,EAAI,OAAS,aACtBD,EAAU,KAAK,CAAE,KAAM,YAAa,QAASC,EAAI,OAAQ,CAAC,CAE9D,CAAC,EAEMD,CACT,CAKA,MAAM,KAAKD,EAAsC,CAC/C,GAAI,CACF,IAAMG,EAAoB,KAAK,eAAeH,CAAQ,EAEtD,OADiB,MAAM,KAAK,MAAM,OAAOG,CAAiB,GAC1C,OAClB,OAASC,EAAO,CACd,eAAQ,KAAK,mDAAoDA,CAAK,EAC/D,sXACT,CACF,CACF","names":["ChatGroq","AiRobot","config","messages","formatted","msg","formattedMessages","error"]}
|
package/dist/react.js
CHANGED
|
@@ -1,187 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
"use client";
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __export = (target, all) => {
|
|
10
|
-
for (var name in all)
|
|
11
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
-
};
|
|
13
|
-
var __copyProps = (to, from, except, desc) => {
|
|
14
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
-
for (let key of __getOwnPropNames(from))
|
|
16
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
-
}
|
|
19
|
-
return to;
|
|
20
|
-
};
|
|
21
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
-
mod
|
|
28
|
-
));
|
|
29
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
-
|
|
31
|
-
// src/react.ts
|
|
32
|
-
var react_exports = {};
|
|
33
|
-
__export(react_exports, {
|
|
34
|
-
ChatWindow: () => ChatWindow
|
|
35
|
-
});
|
|
36
|
-
module.exports = __toCommonJS(react_exports);
|
|
37
|
-
|
|
38
|
-
// src/components/ChatWindow/ChatWindow.tsx
|
|
39
|
-
var import_react3 = require("react");
|
|
40
|
-
var import_clsx3 = __toESM(require("clsx"));
|
|
41
|
-
|
|
42
|
-
// src/components/MessageList/MessageList.tsx
|
|
43
|
-
var import_react = require("react");
|
|
44
|
-
|
|
45
|
-
// src/components/MessageBubble/MessageBubble.tsx
|
|
46
|
-
var import_clsx = __toESM(require("clsx"));
|
|
47
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
48
|
-
var MessageBubble = ({ message }) => {
|
|
49
|
-
const isUser = message.role === "user";
|
|
50
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_clsx.default)("flex w-full", isUser ? "justify-end" : "justify-start"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
51
|
-
"div",
|
|
52
|
-
{
|
|
53
|
-
className: (0, import_clsx.default)(
|
|
54
|
-
"max-w-[80%] px-3 py-2 rounded-xl text-sm break-all",
|
|
55
|
-
isUser ? "bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm" : "bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm"
|
|
56
|
-
),
|
|
57
|
-
children: message.content
|
|
58
|
-
}
|
|
59
|
-
) });
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
// src/components/MessageList/MessageList.tsx
|
|
63
|
-
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
64
|
-
var MessageList = ({ messages, isLoading }) => {
|
|
65
|
-
const messagesEndRef = (0, import_react.useRef)(null);
|
|
66
|
-
(0, import_react.useEffect)(() => {
|
|
67
|
-
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
68
|
-
}, [messages, isLoading]);
|
|
69
|
-
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth", children: [
|
|
70
|
-
messages.map((msg, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MessageBubble, { message: msg }, index)),
|
|
71
|
-
isLoading && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex justify-start", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center", children: [
|
|
72
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce", style: { animationDelay: "-0.32s" } }),
|
|
73
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce", style: { animationDelay: "-0.16s" } }),
|
|
74
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce" })
|
|
75
|
-
] }) }),
|
|
76
|
-
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { ref: messagesEndRef })
|
|
77
|
-
] });
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// src/components/ChatInput/ChatInput.tsx
|
|
81
|
-
var import_react2 = require("react");
|
|
82
|
-
var import_clsx2 = __toESM(require("clsx"));
|
|
83
|
-
var import_lucide_react = require("lucide-react");
|
|
84
|
-
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
85
|
-
var ChatInput = ({ onSendMessage, isLoading }) => {
|
|
86
|
-
const [inputValue, setInputValue] = (0, import_react2.useState)("");
|
|
87
|
-
const handleSend = () => {
|
|
88
|
-
if (inputValue.trim()) {
|
|
89
|
-
onSendMessage(inputValue);
|
|
90
|
-
setInputValue("");
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
const handleKeyDown = (e) => {
|
|
94
|
-
if (e.key === "Enter" && !e.shiftKey) {
|
|
95
|
-
e.preventDefault();
|
|
96
|
-
handleSend();
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)", children: [
|
|
100
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
101
|
-
"input",
|
|
102
|
-
{
|
|
103
|
-
className: (0, import_clsx2.default)(
|
|
104
|
-
"flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none",
|
|
105
|
-
"font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)",
|
|
106
|
-
"focus:border-(--ai-primary) disabled:opacity-50"
|
|
107
|
-
),
|
|
108
|
-
value: inputValue,
|
|
109
|
-
onChange: (e) => setInputValue(e.target.value),
|
|
110
|
-
onKeyDown: handleKeyDown,
|
|
111
|
-
placeholder: "\u067E\u06CC\u0627\u0645 \u062E\u0648\u062F \u0631\u0627 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F...",
|
|
112
|
-
disabled: isLoading
|
|
113
|
-
}
|
|
114
|
-
),
|
|
115
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
116
|
-
"button",
|
|
117
|
-
{
|
|
118
|
-
className: (0, import_clsx2.default)(
|
|
119
|
-
"px-3 py-2 rounded-lg flex items-center justify-center transition-opacity",
|
|
120
|
-
"bg-(--ai-primary) text-(--ai-primary-fg)",
|
|
121
|
-
"hover:opacity-90",
|
|
122
|
-
(isLoading || !inputValue.trim()) && "opacity-50 cursor-not-allowed"
|
|
123
|
-
),
|
|
124
|
-
onClick: handleSend,
|
|
125
|
-
disabled: isLoading || !inputValue.trim(),
|
|
126
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Send, { size: 18 })
|
|
127
|
-
}
|
|
128
|
-
)
|
|
129
|
-
] });
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
// src/components/ChatWindow/ChatWindow.tsx
|
|
133
|
-
var import_lucide_react2 = require("lucide-react");
|
|
134
|
-
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
135
|
-
var ChatWindow = ({
|
|
136
|
-
apiEndpoint,
|
|
137
|
-
title = "AI Assistant",
|
|
138
|
-
welcomeMessage = "\u0633\u0644\u0627\u0645! \u0686\u0637\u0648\u0631 \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u0645 \u06A9\u0645\u06A9\u062A\u0627\u0646 \u06A9\u0646\u0645\u061F"
|
|
139
|
-
}) => {
|
|
140
|
-
const [messages, setMessages] = (0, import_react3.useState)([]);
|
|
141
|
-
const [isLoading, setIsLoading] = (0, import_react3.useState)(false);
|
|
142
|
-
(0, import_react3.useEffect)(() => {
|
|
143
|
-
if (welcomeMessage && messages.length === 0) {
|
|
144
|
-
setMessages([{ role: "assistant", content: welcomeMessage }]);
|
|
145
|
-
}
|
|
146
|
-
}, [welcomeMessage]);
|
|
147
|
-
const handleSendMessage = async (userMessage) => {
|
|
148
|
-
const newUserMsg = { role: "user", content: userMessage };
|
|
149
|
-
const currentMessages = [...messages, newUserMsg];
|
|
150
|
-
setMessages(currentMessages);
|
|
151
|
-
setIsLoading(true);
|
|
152
|
-
try {
|
|
153
|
-
const response = await fetch(apiEndpoint, {
|
|
154
|
-
method: "POST",
|
|
155
|
-
headers: { "Content-Type": "application/json" },
|
|
156
|
-
body: JSON.stringify({ messages: currentMessages })
|
|
157
|
-
});
|
|
158
|
-
if (!response.ok) throw new Error("Network response was not ok");
|
|
159
|
-
const data = await response.json();
|
|
160
|
-
const botMsg = { role: "assistant", content: data.content };
|
|
161
|
-
setMessages((prev) => [...prev, botMsg]);
|
|
162
|
-
} catch (error) {
|
|
163
|
-
console.error("Chat Error:", error);
|
|
164
|
-
const errorMsg = { role: "assistant", content: "\u062E\u0637\u0627\u06CC\u06CC \u0631\u062E \u062F\u0627\u062F\u0647 \u0627\u0633\u062A." };
|
|
165
|
-
setMessages((prev) => [...prev, errorMsg]);
|
|
166
|
-
} finally {
|
|
167
|
-
setIsLoading(false);
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: (0, import_clsx3.default)(
|
|
171
|
-
"flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)",
|
|
172
|
-
"bg-(--ai-bg) overflow-hidden shadow-lg relative",
|
|
173
|
-
"font-inherit text-base leading-6 box-border"
|
|
174
|
-
), children: [
|
|
175
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50", children: [
|
|
176
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react2.Bot, { size: 20 }),
|
|
177
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "font-semibold", children: title })
|
|
178
|
-
] }),
|
|
179
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MessageList, { messages, isLoading }),
|
|
180
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ChatInput, { onSendMessage: handleSendMessage, isLoading })
|
|
181
|
-
] });
|
|
182
|
-
};
|
|
183
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
184
|
-
0 && (module.exports = {
|
|
185
|
-
ChatWindow
|
|
186
|
-
});
|
|
1
|
+
"use strict";"use client";var W=Object.create;var p=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var j=(e,t)=>{for(var s in t)p(e,s,{get:t[s],enumerable:!0})},w=(e,t,s,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of K(t))!V.call(e,o)&&o!==s&&p(e,o,{get:()=>t[o],enumerable:!(a=F(t,o))||a.enumerable});return e};var u=(e,t,s)=>(s=e!=null?W(T(e)):{},w(t||!e||!e.__esModule?p(s,"default",{value:e,enumerable:!0}):s,e)),z=e=>w(p({},"__esModule",{value:!0}),e);var A={};j(A,{ChatWindow:()=>I});module.exports=z(A);var d=require("react"),E=u(require("clsx"));var g=require("react");var b=u(require("clsx")),x=require("react/jsx-runtime"),M=({message:e})=>{let t=e.role==="user";return(0,x.jsx)("div",{className:(0,b.default)("flex w-full",t?"justify-end":"justify-start"),children:(0,x.jsx)("div",{className:(0,b.default)("max-w-[80%] px-3 py-2 rounded-xl text-sm break-all",t?"bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm":"bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm"),children:e.content})})};var r=require("react/jsx-runtime"),C=({messages:e,isLoading:t})=>{let s=(0,g.useRef)(null);return(0,g.useEffect)(()=>{s.current?.scrollIntoView({behavior:"smooth"})},[e,t]),(0,r.jsxs)("div",{className:"flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth",children:[e.map((a,o)=>(0,r.jsx)(M,{message:a},o)),t&&(0,r.jsx)("div",{className:"flex justify-start",children:(0,r.jsxs)("div",{className:"max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center",children:[(0,r.jsx)("div",{className:"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce",style:{animationDelay:"-0.32s"}}),(0,r.jsx)("div",{className:"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce",style:{animationDelay:"-0.16s"}}),(0,r.jsx)("div",{className:"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce"})]})}),(0,r.jsx)("div",{ref:s})]})};var N=require("react"),y=u(require("clsx")),R=require("lucide-react"),l=require("react/jsx-runtime"),P=({onSendMessage:e,isLoading:t})=>{let[s,a]=(0,N.useState)(""),o=()=>{s.trim()&&(e(s),a(""))},c=n=>{n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),o())};return(0,l.jsxs)("div",{className:"flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)",children:[(0,l.jsx)("input",{className:(0,y.default)("flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none","font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)","focus:border-(--ai-primary) disabled:opacity-50"),value:s,onChange:n=>a(n.target.value),onKeyDown:c,placeholder:"\u067E\u06CC\u0627\u0645 \u062E\u0648\u062F \u0631\u0627 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F...",disabled:t}),(0,l.jsx)("button",{className:(0,y.default)("px-3 py-2 rounded-lg flex items-center justify-center transition-opacity","bg-(--ai-primary) text-(--ai-primary-fg)","hover:opacity-90",(t||!s.trim())&&"opacity-50 cursor-not-allowed"),onClick:o,disabled:t||!s.trim(),children:(0,l.jsx)(R.Send,{size:18})})]})};var S=require("lucide-react"),i=require("react/jsx-runtime"),I=({apiEndpoint:e,title:t="AI Assistant",welcomeMessage:s="\u0633\u0644\u0627\u0645! \u0686\u0637\u0648\u0631 \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u0645 \u06A9\u0645\u06A9\u062A\u0627\u0646 \u06A9\u0646\u0645\u061F"})=>{let[a,o]=(0,d.useState)([]),[c,n]=(0,d.useState)(!1);(0,d.useEffect)(()=>{s&&a.length===0&&o([{role:"assistant",content:s}])},[s]);let L=async k=>{let D={role:"user",content:k},h=[...a,D];o(h),n(!0);try{let m=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({messages:h})});if(!m.ok)throw new Error("Network response was not ok");let f={role:"assistant",content:(await m.json()).content};o(B=>[...B,f])}catch(m){console.error("Chat Error:",m);let v={role:"assistant",content:"\u062E\u0637\u0627\u06CC\u06CC \u0631\u062E \u062F\u0627\u062F\u0647 \u0627\u0633\u062A."};o(f=>[...f,v])}finally{n(!1)}};return(0,i.jsxs)("div",{className:(0,E.default)("flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)","bg-(--ai-bg) overflow-hidden shadow-lg relative","font-inherit text-base leading-6 box-border"),children:[(0,i.jsxs)("div",{className:"flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50",children:[(0,i.jsx)(S.Bot,{size:20}),(0,i.jsx)("span",{className:"font-semibold",children:t})]}),(0,i.jsx)(C,{messages:a,isLoading:c}),(0,i.jsx)(P,{onSendMessage:L,isLoading:c})]})};0&&(module.exports={ChatWindow});
|
|
187
2
|
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.ts","../src/components/ChatWindow/ChatWindow.tsx","../src/components/MessageList/MessageList.tsx","../src/components/MessageBubble/MessageBubble.tsx","../src/components/ChatInput/ChatInput.tsx"],"sourcesContent":["\"use client\";\r\n\r\n\r\n\r\n\r\nexport { ChatWindow, type ChatWindowProps } from \"./components/ChatWindow/ChatWindow\";\r\n\r\n\r\nexport * from \"./types\";","// src/components/ChatWindow/ChatWindow.tsx\r\n\"use client\";\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageList } from '../MessageList/MessageList';\r\nimport { ChatInput } from '../ChatInput/ChatInput';\r\nimport { Message } from '../../types';\r\nimport { Bot } from 'lucide-react';\r\n\r\nexport interface ChatWindowProps {\r\n apiEndpoint: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n}\r\n\r\nexport const ChatWindow: React.FC<ChatWindowProps> = ({\r\n apiEndpoint,\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"سلام! چطور میتوانم کمکتان کنم؟\"\r\n}) => {\r\n const [messages, setMessages] = useState<Message[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (welcomeMessage && messages.length === 0) {\r\n setMessages([{ role: 'assistant', content: welcomeMessage }]);\r\n }\r\n }, [welcomeMessage]);\r\n\r\n const handleSendMessage = async (userMessage: string) => {\r\n const newUserMsg: Message = { role: 'user', content: userMessage };\r\n const currentMessages = [...messages, newUserMsg];\r\n setMessages(currentMessages);\r\n setIsLoading(true);\r\n\r\n try {\r\n const response = await fetch(apiEndpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ messages: currentMessages }),\r\n });\r\n\r\n if (!response.ok) throw new Error(\"Network response was not ok\");\r\n \r\n const data = await response.json();\r\n const botMsg: Message = { role: 'assistant', content: data.content };\r\n setMessages(prev => [...prev, botMsg]);\r\n\r\n } catch (error) {\r\n console.error(\"Chat Error:\", error);\r\n const errorMsg: Message = { role: 'assistant', content: \"خطایی رخ داده است.\" };\r\n setMessages(prev => [...prev, errorMsg]);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={clsx(\r\n \"flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)\",\r\n \"bg-(--ai-bg) overflow-hidden shadow-lg relative\",\r\n \"font-inherit text-base leading-6 box-border\"\r\n )}>\r\n <div className=\"flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50\">\r\n <Bot size={20} />\r\n <span className=\"font-semibold\">{title}</span>\r\n </div>\r\n\r\n <MessageList messages={messages} isLoading={isLoading} />\r\n <ChatInput onSendMessage={handleSendMessage} isLoading={isLoading} />\r\n </div>\r\n );\r\n};","// src/components/MessageList/MessageList.tsx\r\n\"use client\";\r\n\r\nimport React, { useRef, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageBubble } from '../MessageBubble/MessageBubble';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageListProps {\r\n messages: Message[];\r\n isLoading: boolean;\r\n}\r\n\r\nexport const MessageList: React.FC<MessageListProps> = ({ messages, isLoading }) => {\r\n const messagesEndRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\r\n }, [messages, isLoading]);\r\n\r\n return (\r\n <div className=\"flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth\">\r\n {messages.map((msg, index) => (\r\n <MessageBubble key={index} message={msg} />\r\n ))}\r\n\r\n {isLoading && (\r\n <div className=\"flex justify-start\">\r\n <div className=\"max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center\">\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.32s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.16s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div ref={messagesEndRef} />\r\n </div>\r\n );\r\n};","// src/components/MessageBubble/MessageBubble.tsx\r\n\"use client\";\r\n\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageBubbleProps {\r\n message: Message;\r\n}\r\n\r\nexport const MessageBubble: React.FC<MessageBubbleProps> = ({ message }) => {\r\n const isUser = message.role === 'user';\r\n\r\n return (\r\n <div className={clsx(\"flex w-full\", isUser ? \"justify-end\" : \"justify-start\")}>\r\n <div\r\n className={clsx(\r\n \"max-w-[80%] px-3 py-2 rounded-xl text-sm break-all\",\r\n isUser\r\n ? \"bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm\"\r\n : \"bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm\"\r\n )}\r\n >\r\n {message.content}\r\n </div>\r\n </div>\r\n );\r\n};","// src/components/ChatInput/ChatInput.tsx\r\n\"use client\";\r\n\r\nimport React, { useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Send } from 'lucide-react';\r\n\r\ninterface ChatInputProps {\r\n onSendMessage: (message: string) => void;\r\n isLoading: boolean;\r\n}\r\n\r\nexport const ChatInput: React.FC<ChatInputProps> = ({ onSendMessage, isLoading }) => {\r\n const [inputValue, setInputValue] = useState('');\r\n\r\n const handleSend = () => {\r\n if (inputValue.trim()) {\r\n onSendMessage(inputValue);\r\n setInputValue('');\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSend();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)\">\r\n <input\r\n className={clsx(\r\n \"flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none\",\r\n \"font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)\",\r\n \"focus:border-(--ai-primary) disabled:opacity-50\"\r\n )}\r\n value={inputValue}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"پیام خود را بنویسید...\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n className={clsx(\r\n \"px-3 py-2 rounded-lg flex items-center justify-center transition-opacity\",\r\n \"bg-(--ai-primary) text-(--ai-primary-fg)\",\r\n \"hover:opacity-90\",\r\n (isLoading || !inputValue.trim()) && \"opacity-50 cursor-not-allowed\"\r\n )}\r\n onClick={handleSend}\r\n disabled={isLoading || !inputValue.trim()}\r\n >\r\n <Send size={18} />\r\n </button>\r\n </div>\r\n );\r\n};"],"mappings":"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","names":["import_react","import_clsx","clsx","import_jsx_runtime","import_react","import_clsx","import_jsx_runtime","clsx","import_lucide_react","import_jsx_runtime","clsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/react.ts","../src/components/ChatWindow/ChatWindow.tsx","../src/components/MessageList/MessageList.tsx","../src/components/MessageBubble/MessageBubble.tsx","../src/components/ChatInput/ChatInput.tsx"],"sourcesContent":["\"use client\";\r\n\r\n\r\nexport { ChatWindow, type ChatWindowProps } from \"./components/ChatWindow/ChatWindow\";\r\nexport * from \"./types\";","// src/components/ChatWindow/ChatWindow.tsx\r\n\"use client\";\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageList } from '../MessageList/MessageList';\r\nimport { ChatInput } from '../ChatInput/ChatInput';\r\nimport { Message } from '../../types';\r\nimport { Bot } from 'lucide-react';\r\n\r\nexport interface ChatWindowProps {\r\n apiEndpoint: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n}\r\n\r\nexport const ChatWindow: React.FC<ChatWindowProps> = ({\r\n apiEndpoint,\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"سلام! چطور میتوانم کمکتان کنم؟\"\r\n}) => {\r\n const [messages, setMessages] = useState<Message[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (welcomeMessage && messages.length === 0) {\r\n setMessages([{ role: 'assistant', content: welcomeMessage }]);\r\n }\r\n }, [welcomeMessage]);\r\n\r\n const handleSendMessage = async (userMessage: string) => {\r\n const newUserMsg: Message = { role: 'user', content: userMessage };\r\n const currentMessages = [...messages, newUserMsg];\r\n setMessages(currentMessages);\r\n setIsLoading(true);\r\n\r\n try {\r\n const response = await fetch(apiEndpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ messages: currentMessages }),\r\n });\r\n\r\n if (!response.ok) throw new Error(\"Network response was not ok\");\r\n \r\n const data = await response.json();\r\n const botMsg: Message = { role: 'assistant', content: data.content };\r\n setMessages(prev => [...prev, botMsg]);\r\n\r\n } catch (error) {\r\n console.error(\"Chat Error:\", error);\r\n const errorMsg: Message = { role: 'assistant', content: \"خطایی رخ داده است.\" };\r\n setMessages(prev => [...prev, errorMsg]);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={clsx(\r\n \"flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)\",\r\n \"bg-(--ai-bg) overflow-hidden shadow-lg relative\",\r\n \"font-inherit text-base leading-6 box-border\"\r\n )}>\r\n <div className=\"flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50\">\r\n <Bot size={20} />\r\n <span className=\"font-semibold\">{title}</span>\r\n </div>\r\n\r\n <MessageList messages={messages} isLoading={isLoading} />\r\n <ChatInput onSendMessage={handleSendMessage} isLoading={isLoading} />\r\n </div>\r\n );\r\n};","// src/components/MessageList/MessageList.tsx\r\n\"use client\";\r\n\r\nimport React, { useRef, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageBubble } from '../MessageBubble/MessageBubble';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageListProps {\r\n messages: Message[];\r\n isLoading: boolean;\r\n}\r\n\r\nexport const MessageList: React.FC<MessageListProps> = ({ messages, isLoading }) => {\r\n const messagesEndRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\r\n }, [messages, isLoading]);\r\n\r\n return (\r\n <div className=\"flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth\">\r\n {messages.map((msg, index) => (\r\n <MessageBubble key={index} message={msg} />\r\n ))}\r\n\r\n {isLoading && (\r\n <div className=\"flex justify-start\">\r\n <div className=\"max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center\">\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.32s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.16s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div ref={messagesEndRef} />\r\n </div>\r\n );\r\n};","// src/components/MessageBubble/MessageBubble.tsx\r\n\"use client\";\r\n\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageBubbleProps {\r\n message: Message;\r\n}\r\n\r\nexport const MessageBubble: React.FC<MessageBubbleProps> = ({ message }) => {\r\n const isUser = message.role === 'user';\r\n\r\n return (\r\n <div className={clsx(\"flex w-full\", isUser ? \"justify-end\" : \"justify-start\")}>\r\n <div\r\n className={clsx(\r\n \"max-w-[80%] px-3 py-2 rounded-xl text-sm break-all\",\r\n isUser\r\n ? \"bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm\"\r\n : \"bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm\"\r\n )}\r\n >\r\n {message.content}\r\n </div>\r\n </div>\r\n );\r\n};","// src/components/ChatInput/ChatInput.tsx\r\n\"use client\";\r\n\r\nimport React, { useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Send } from 'lucide-react';\r\n\r\ninterface ChatInputProps {\r\n onSendMessage: (message: string) => void;\r\n isLoading: boolean;\r\n}\r\n\r\nexport const ChatInput: React.FC<ChatInputProps> = ({ onSendMessage, isLoading }) => {\r\n const [inputValue, setInputValue] = useState('');\r\n\r\n const handleSend = () => {\r\n if (inputValue.trim()) {\r\n onSendMessage(inputValue);\r\n setInputValue('');\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSend();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)\">\r\n <input\r\n className={clsx(\r\n \"flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none\",\r\n \"font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)\",\r\n \"focus:border-(--ai-primary) disabled:opacity-50\"\r\n )}\r\n value={inputValue}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"پیام خود را بنویسید...\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n className={clsx(\r\n \"px-3 py-2 rounded-lg flex items-center justify-center transition-opacity\",\r\n \"bg-(--ai-primary) text-(--ai-primary-fg)\",\r\n \"hover:opacity-90\",\r\n (isLoading || !inputValue.trim()) && \"opacity-50 cursor-not-allowed\"\r\n )}\r\n onClick={handleSend}\r\n disabled={isLoading || !inputValue.trim()}\r\n >\r\n <Send size={18} />\r\n </button>\r\n </div>\r\n );\r\n};"],"mappings":"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","names":["react_exports","__export","ChatWindow","__toCommonJS","import_react","import_clsx","import_react","import_clsx","import_jsx_runtime","MessageBubble","message","isUser","clsx","import_jsx_runtime","MessageList","messages","isLoading","messagesEndRef","msg","index","MessageBubble","import_react","import_clsx","import_lucide_react","import_jsx_runtime","ChatInput","onSendMessage","isLoading","inputValue","setInputValue","handleSend","handleKeyDown","e","clsx","import_lucide_react","import_jsx_runtime","ChatWindow","apiEndpoint","title","welcomeMessage","messages","setMessages","isLoading","setIsLoading","handleSendMessage","userMessage","newUserMsg","currentMessages","response","botMsg","prev","error","errorMsg","clsx","MessageList","ChatInput"]}
|
package/dist/react.mjs
CHANGED
|
@@ -1,151 +1,2 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
// src/components/ChatWindow/ChatWindow.tsx
|
|
4
|
-
import { useState as useState2, useEffect as useEffect2 } from "react";
|
|
5
|
-
import clsx3 from "clsx";
|
|
6
|
-
|
|
7
|
-
// src/components/MessageList/MessageList.tsx
|
|
8
|
-
import { useRef, useEffect } from "react";
|
|
9
|
-
|
|
10
|
-
// src/components/MessageBubble/MessageBubble.tsx
|
|
11
|
-
import clsx from "clsx";
|
|
12
|
-
import { jsx } from "react/jsx-runtime";
|
|
13
|
-
var MessageBubble = ({ message }) => {
|
|
14
|
-
const isUser = message.role === "user";
|
|
15
|
-
return /* @__PURE__ */ jsx("div", { className: clsx("flex w-full", isUser ? "justify-end" : "justify-start"), children: /* @__PURE__ */ jsx(
|
|
16
|
-
"div",
|
|
17
|
-
{
|
|
18
|
-
className: clsx(
|
|
19
|
-
"max-w-[80%] px-3 py-2 rounded-xl text-sm break-all",
|
|
20
|
-
isUser ? "bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm" : "bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm"
|
|
21
|
-
),
|
|
22
|
-
children: message.content
|
|
23
|
-
}
|
|
24
|
-
) });
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
// src/components/MessageList/MessageList.tsx
|
|
28
|
-
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
29
|
-
var MessageList = ({ messages, isLoading }) => {
|
|
30
|
-
const messagesEndRef = useRef(null);
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
33
|
-
}, [messages, isLoading]);
|
|
34
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth", children: [
|
|
35
|
-
messages.map((msg, index) => /* @__PURE__ */ jsx2(MessageBubble, { message: msg }, index)),
|
|
36
|
-
isLoading && /* @__PURE__ */ jsx2("div", { className: "flex justify-start", children: /* @__PURE__ */ jsxs("div", { className: "max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center", children: [
|
|
37
|
-
/* @__PURE__ */ jsx2("div", { className: "w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce", style: { animationDelay: "-0.32s" } }),
|
|
38
|
-
/* @__PURE__ */ jsx2("div", { className: "w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce", style: { animationDelay: "-0.16s" } }),
|
|
39
|
-
/* @__PURE__ */ jsx2("div", { className: "w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce" })
|
|
40
|
-
] }) }),
|
|
41
|
-
/* @__PURE__ */ jsx2("div", { ref: messagesEndRef })
|
|
42
|
-
] });
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
// src/components/ChatInput/ChatInput.tsx
|
|
46
|
-
import { useState } from "react";
|
|
47
|
-
import clsx2 from "clsx";
|
|
48
|
-
import { Send } from "lucide-react";
|
|
49
|
-
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
50
|
-
var ChatInput = ({ onSendMessage, isLoading }) => {
|
|
51
|
-
const [inputValue, setInputValue] = useState("");
|
|
52
|
-
const handleSend = () => {
|
|
53
|
-
if (inputValue.trim()) {
|
|
54
|
-
onSendMessage(inputValue);
|
|
55
|
-
setInputValue("");
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
const handleKeyDown = (e) => {
|
|
59
|
-
if (e.key === "Enter" && !e.shiftKey) {
|
|
60
|
-
e.preventDefault();
|
|
61
|
-
handleSend();
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
return /* @__PURE__ */ jsxs2("div", { className: "flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)", children: [
|
|
65
|
-
/* @__PURE__ */ jsx3(
|
|
66
|
-
"input",
|
|
67
|
-
{
|
|
68
|
-
className: clsx2(
|
|
69
|
-
"flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none",
|
|
70
|
-
"font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)",
|
|
71
|
-
"focus:border-(--ai-primary) disabled:opacity-50"
|
|
72
|
-
),
|
|
73
|
-
value: inputValue,
|
|
74
|
-
onChange: (e) => setInputValue(e.target.value),
|
|
75
|
-
onKeyDown: handleKeyDown,
|
|
76
|
-
placeholder: "\u067E\u06CC\u0627\u0645 \u062E\u0648\u062F \u0631\u0627 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F...",
|
|
77
|
-
disabled: isLoading
|
|
78
|
-
}
|
|
79
|
-
),
|
|
80
|
-
/* @__PURE__ */ jsx3(
|
|
81
|
-
"button",
|
|
82
|
-
{
|
|
83
|
-
className: clsx2(
|
|
84
|
-
"px-3 py-2 rounded-lg flex items-center justify-center transition-opacity",
|
|
85
|
-
"bg-(--ai-primary) text-(--ai-primary-fg)",
|
|
86
|
-
"hover:opacity-90",
|
|
87
|
-
(isLoading || !inputValue.trim()) && "opacity-50 cursor-not-allowed"
|
|
88
|
-
),
|
|
89
|
-
onClick: handleSend,
|
|
90
|
-
disabled: isLoading || !inputValue.trim(),
|
|
91
|
-
children: /* @__PURE__ */ jsx3(Send, { size: 18 })
|
|
92
|
-
}
|
|
93
|
-
)
|
|
94
|
-
] });
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
// src/components/ChatWindow/ChatWindow.tsx
|
|
98
|
-
import { Bot } from "lucide-react";
|
|
99
|
-
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
100
|
-
var ChatWindow = ({
|
|
101
|
-
apiEndpoint,
|
|
102
|
-
title = "AI Assistant",
|
|
103
|
-
welcomeMessage = "\u0633\u0644\u0627\u0645! \u0686\u0637\u0648\u0631 \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u0645 \u06A9\u0645\u06A9\u062A\u0627\u0646 \u06A9\u0646\u0645\u061F"
|
|
104
|
-
}) => {
|
|
105
|
-
const [messages, setMessages] = useState2([]);
|
|
106
|
-
const [isLoading, setIsLoading] = useState2(false);
|
|
107
|
-
useEffect2(() => {
|
|
108
|
-
if (welcomeMessage && messages.length === 0) {
|
|
109
|
-
setMessages([{ role: "assistant", content: welcomeMessage }]);
|
|
110
|
-
}
|
|
111
|
-
}, [welcomeMessage]);
|
|
112
|
-
const handleSendMessage = async (userMessage) => {
|
|
113
|
-
const newUserMsg = { role: "user", content: userMessage };
|
|
114
|
-
const currentMessages = [...messages, newUserMsg];
|
|
115
|
-
setMessages(currentMessages);
|
|
116
|
-
setIsLoading(true);
|
|
117
|
-
try {
|
|
118
|
-
const response = await fetch(apiEndpoint, {
|
|
119
|
-
method: "POST",
|
|
120
|
-
headers: { "Content-Type": "application/json" },
|
|
121
|
-
body: JSON.stringify({ messages: currentMessages })
|
|
122
|
-
});
|
|
123
|
-
if (!response.ok) throw new Error("Network response was not ok");
|
|
124
|
-
const data = await response.json();
|
|
125
|
-
const botMsg = { role: "assistant", content: data.content };
|
|
126
|
-
setMessages((prev) => [...prev, botMsg]);
|
|
127
|
-
} catch (error) {
|
|
128
|
-
console.error("Chat Error:", error);
|
|
129
|
-
const errorMsg = { role: "assistant", content: "\u062E\u0637\u0627\u06CC\u06CC \u0631\u062E \u062F\u0627\u062F\u0647 \u0627\u0633\u062A." };
|
|
130
|
-
setMessages((prev) => [...prev, errorMsg]);
|
|
131
|
-
} finally {
|
|
132
|
-
setIsLoading(false);
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
return /* @__PURE__ */ jsxs3("div", { className: clsx3(
|
|
136
|
-
"flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)",
|
|
137
|
-
"bg-(--ai-bg) overflow-hidden shadow-lg relative",
|
|
138
|
-
"font-inherit text-base leading-6 box-border"
|
|
139
|
-
), children: [
|
|
140
|
-
/* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50", children: [
|
|
141
|
-
/* @__PURE__ */ jsx4(Bot, { size: 20 }),
|
|
142
|
-
/* @__PURE__ */ jsx4("span", { className: "font-semibold", children: title })
|
|
143
|
-
] }),
|
|
144
|
-
/* @__PURE__ */ jsx4(MessageList, { messages, isLoading }),
|
|
145
|
-
/* @__PURE__ */ jsx4(ChatInput, { onSendMessage: handleSendMessage, isLoading })
|
|
146
|
-
] });
|
|
147
|
-
};
|
|
148
|
-
export {
|
|
149
|
-
ChatWindow
|
|
150
|
-
};
|
|
1
|
+
"use client";import{useState as w,useEffect as D}from"react";import B from"clsx";import{useRef as E,useEffect as S}from"react";import f from"clsx";import{jsx as u}from"react/jsx-runtime";var b=({message:s})=>{let t=s.role==="user";return u("div",{className:f("flex w-full",t?"justify-end":"justify-start"),children:u("div",{className:f("max-w-[80%] px-3 py-2 rounded-xl text-sm break-all",t?"bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm":"bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm"),children:s.content})})};import{jsx as n,jsxs as x}from"react/jsx-runtime";var y=({messages:s,isLoading:t})=>{let e=E(null);return S(()=>{e.current?.scrollIntoView({behavior:"smooth"})},[s,t]),x("div",{className:"flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth",children:[s.map((a,o)=>n(b,{message:a},o)),t&&n("div",{className:"flex justify-start",children:x("div",{className:"max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center",children:[n("div",{className:"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce",style:{animationDelay:"-0.32s"}}),n("div",{className:"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce",style:{animationDelay:"-0.16s"}}),n("div",{className:"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce"})]})}),n("div",{ref:e})]})};import{useState as I}from"react";import h from"clsx";import{Send as L}from"lucide-react";import{jsx as m,jsxs as k}from"react/jsx-runtime";var v=({onSendMessage:s,isLoading:t})=>{let[e,a]=I(""),o=()=>{e.trim()&&(s(e),a(""))},i=r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),o())};return k("div",{className:"flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)",children:[m("input",{className:h("flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none","font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)","focus:border-(--ai-primary) disabled:opacity-50"),value:e,onChange:r=>a(r.target.value),onKeyDown:i,placeholder:"\u067E\u06CC\u0627\u0645 \u062E\u0648\u062F \u0631\u0627 \u0628\u0646\u0648\u06CC\u0633\u06CC\u062F...",disabled:t}),m("button",{className:h("px-3 py-2 rounded-lg flex items-center justify-center transition-opacity","bg-(--ai-primary) text-(--ai-primary-fg)","hover:opacity-90",(t||!e.trim())&&"opacity-50 cursor-not-allowed"),onClick:o,disabled:t||!e.trim(),children:m(L,{size:18})})]})};import{Bot as W}from"lucide-react";import{jsx as d,jsxs as M}from"react/jsx-runtime";var F=({apiEndpoint:s,title:t="AI Assistant",welcomeMessage:e="\u0633\u0644\u0627\u0645! \u0686\u0637\u0648\u0631 \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u0645 \u06A9\u0645\u06A9\u062A\u0627\u0646 \u06A9\u0646\u0645\u061F"})=>{let[a,o]=w([]),[i,r]=w(!1);D(()=>{e&&a.length===0&&o([{role:"assistant",content:e}])},[e]);let C=async N=>{let R={role:"user",content:N},p=[...a,R];o(p),r(!0);try{let l=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({messages:p})});if(!l.ok)throw new Error("Network response was not ok");let c={role:"assistant",content:(await l.json()).content};o(P=>[...P,c])}catch(l){console.error("Chat Error:",l);let g={role:"assistant",content:"\u062E\u0637\u0627\u06CC\u06CC \u0631\u062E \u062F\u0627\u062F\u0647 \u0627\u0633\u062A."};o(c=>[...c,g])}finally{r(!1)}};return M("div",{className:B("flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)","bg-(--ai-bg) overflow-hidden shadow-lg relative","font-inherit text-base leading-6 box-border"),children:[M("div",{className:"flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50",children:[d(W,{size:20}),d("span",{className:"font-semibold",children:t})]}),d(y,{messages:a,isLoading:i}),d(v,{onSendMessage:C,isLoading:i})]})};export{F as ChatWindow};
|
|
151
2
|
//# sourceMappingURL=react.mjs.map
|
package/dist/react.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ChatWindow/ChatWindow.tsx","../src/components/MessageList/MessageList.tsx","../src/components/MessageBubble/MessageBubble.tsx","../src/components/ChatInput/ChatInput.tsx"],"sourcesContent":["// src/components/ChatWindow/ChatWindow.tsx\r\n\"use client\";\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageList } from '../MessageList/MessageList';\r\nimport { ChatInput } from '../ChatInput/ChatInput';\r\nimport { Message } from '../../types';\r\nimport { Bot } from 'lucide-react';\r\n\r\nexport interface ChatWindowProps {\r\n apiEndpoint: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n}\r\n\r\nexport const ChatWindow: React.FC<ChatWindowProps> = ({\r\n apiEndpoint,\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"سلام! چطور میتوانم کمکتان کنم؟\"\r\n}) => {\r\n const [messages, setMessages] = useState<Message[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (welcomeMessage && messages.length === 0) {\r\n setMessages([{ role: 'assistant', content: welcomeMessage }]);\r\n }\r\n }, [welcomeMessage]);\r\n\r\n const handleSendMessage = async (userMessage: string) => {\r\n const newUserMsg: Message = { role: 'user', content: userMessage };\r\n const currentMessages = [...messages, newUserMsg];\r\n setMessages(currentMessages);\r\n setIsLoading(true);\r\n\r\n try {\r\n const response = await fetch(apiEndpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ messages: currentMessages }),\r\n });\r\n\r\n if (!response.ok) throw new Error(\"Network response was not ok\");\r\n \r\n const data = await response.json();\r\n const botMsg: Message = { role: 'assistant', content: data.content };\r\n setMessages(prev => [...prev, botMsg]);\r\n\r\n } catch (error) {\r\n console.error(\"Chat Error:\", error);\r\n const errorMsg: Message = { role: 'assistant', content: \"خطایی رخ داده است.\" };\r\n setMessages(prev => [...prev, errorMsg]);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={clsx(\r\n \"flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)\",\r\n \"bg-(--ai-bg) overflow-hidden shadow-lg relative\",\r\n \"font-inherit text-base leading-6 box-border\"\r\n )}>\r\n <div className=\"flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50\">\r\n <Bot size={20} />\r\n <span className=\"font-semibold\">{title}</span>\r\n </div>\r\n\r\n <MessageList messages={messages} isLoading={isLoading} />\r\n <ChatInput onSendMessage={handleSendMessage} isLoading={isLoading} />\r\n </div>\r\n );\r\n};","// src/components/MessageList/MessageList.tsx\r\n\"use client\";\r\n\r\nimport React, { useRef, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageBubble } from '../MessageBubble/MessageBubble';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageListProps {\r\n messages: Message[];\r\n isLoading: boolean;\r\n}\r\n\r\nexport const MessageList: React.FC<MessageListProps> = ({ messages, isLoading }) => {\r\n const messagesEndRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\r\n }, [messages, isLoading]);\r\n\r\n return (\r\n <div className=\"flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth\">\r\n {messages.map((msg, index) => (\r\n <MessageBubble key={index} message={msg} />\r\n ))}\r\n\r\n {isLoading && (\r\n <div className=\"flex justify-start\">\r\n <div className=\"max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center\">\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.32s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.16s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div ref={messagesEndRef} />\r\n </div>\r\n );\r\n};","// src/components/MessageBubble/MessageBubble.tsx\r\n\"use client\";\r\n\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageBubbleProps {\r\n message: Message;\r\n}\r\n\r\nexport const MessageBubble: React.FC<MessageBubbleProps> = ({ message }) => {\r\n const isUser = message.role === 'user';\r\n\r\n return (\r\n <div className={clsx(\"flex w-full\", isUser ? \"justify-end\" : \"justify-start\")}>\r\n <div\r\n className={clsx(\r\n \"max-w-[80%] px-3 py-2 rounded-xl text-sm break-all\",\r\n isUser\r\n ? \"bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm\"\r\n : \"bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm\"\r\n )}\r\n >\r\n {message.content}\r\n </div>\r\n </div>\r\n );\r\n};","// src/components/ChatInput/ChatInput.tsx\r\n\"use client\";\r\n\r\nimport React, { useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Send } from 'lucide-react';\r\n\r\ninterface ChatInputProps {\r\n onSendMessage: (message: string) => void;\r\n isLoading: boolean;\r\n}\r\n\r\nexport const ChatInput: React.FC<ChatInputProps> = ({ onSendMessage, isLoading }) => {\r\n const [inputValue, setInputValue] = useState('');\r\n\r\n const handleSend = () => {\r\n if (inputValue.trim()) {\r\n onSendMessage(inputValue);\r\n setInputValue('');\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSend();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)\">\r\n <input\r\n className={clsx(\r\n \"flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none\",\r\n \"font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)\",\r\n \"focus:border-(--ai-primary) disabled:opacity-50\"\r\n )}\r\n value={inputValue}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"پیام خود را بنویسید...\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n className={clsx(\r\n \"px-3 py-2 rounded-lg flex items-center justify-center transition-opacity\",\r\n \"bg-(--ai-primary) text-(--ai-primary-fg)\",\r\n \"hover:opacity-90\",\r\n (isLoading || !inputValue.trim()) && \"opacity-50 cursor-not-allowed\"\r\n )}\r\n onClick={handleSend}\r\n disabled={isLoading || !inputValue.trim()}\r\n >\r\n <Send size={18} />\r\n </button>\r\n </div>\r\n );\r\n};"],"mappings":"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","names":["useState","useEffect","clsx","jsx","clsx","jsx","jsxs","jsx","jsxs","useState","useEffect","clsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/ChatWindow/ChatWindow.tsx","../src/components/MessageList/MessageList.tsx","../src/components/MessageBubble/MessageBubble.tsx","../src/components/ChatInput/ChatInput.tsx"],"sourcesContent":["// src/components/ChatWindow/ChatWindow.tsx\r\n\"use client\";\r\n\r\nimport React, { useState, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageList } from '../MessageList/MessageList';\r\nimport { ChatInput } from '../ChatInput/ChatInput';\r\nimport { Message } from '../../types';\r\nimport { Bot } from 'lucide-react';\r\n\r\nexport interface ChatWindowProps {\r\n apiEndpoint: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n}\r\n\r\nexport const ChatWindow: React.FC<ChatWindowProps> = ({\r\n apiEndpoint,\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"سلام! چطور میتوانم کمکتان کنم؟\"\r\n}) => {\r\n const [messages, setMessages] = useState<Message[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (welcomeMessage && messages.length === 0) {\r\n setMessages([{ role: 'assistant', content: welcomeMessage }]);\r\n }\r\n }, [welcomeMessage]);\r\n\r\n const handleSendMessage = async (userMessage: string) => {\r\n const newUserMsg: Message = { role: 'user', content: userMessage };\r\n const currentMessages = [...messages, newUserMsg];\r\n setMessages(currentMessages);\r\n setIsLoading(true);\r\n\r\n try {\r\n const response = await fetch(apiEndpoint, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ messages: currentMessages }),\r\n });\r\n\r\n if (!response.ok) throw new Error(\"Network response was not ok\");\r\n \r\n const data = await response.json();\r\n const botMsg: Message = { role: 'assistant', content: data.content };\r\n setMessages(prev => [...prev, botMsg]);\r\n\r\n } catch (error) {\r\n console.error(\"Chat Error:\", error);\r\n const errorMsg: Message = { role: 'assistant', content: \"خطایی رخ داده است.\" };\r\n setMessages(prev => [...prev, errorMsg]);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={clsx(\r\n \"flex flex-col h-[500px] w-full max-w-md rounded-xl border border-(--ai-border)\",\r\n \"bg-(--ai-bg) overflow-hidden shadow-lg relative\",\r\n \"font-inherit text-base leading-6 box-border\"\r\n )}>\r\n <div className=\"flex items-center gap-2 px-4 py-4 border-b border-(--ai-border) bg-gray-50\">\r\n <Bot size={20} />\r\n <span className=\"font-semibold\">{title}</span>\r\n </div>\r\n\r\n <MessageList messages={messages} isLoading={isLoading} />\r\n <ChatInput onSendMessage={handleSendMessage} isLoading={isLoading} />\r\n </div>\r\n );\r\n};","// src/components/MessageList/MessageList.tsx\r\n\"use client\";\r\n\r\nimport React, { useRef, useEffect } from 'react';\r\nimport clsx from 'clsx';\r\nimport { MessageBubble } from '../MessageBubble/MessageBubble';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageListProps {\r\n messages: Message[];\r\n isLoading: boolean;\r\n}\r\n\r\nexport const MessageList: React.FC<MessageListProps> = ({ messages, isLoading }) => {\r\n const messagesEndRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\r\n }, [messages, isLoading]);\r\n\r\n return (\r\n <div className=\"flex-1 overflow-y-auto p-4 flex flex-col gap-3 scroll-smooth\">\r\n {messages.map((msg, index) => (\r\n <MessageBubble key={index} message={msg} />\r\n ))}\r\n\r\n {isLoading && (\r\n <div className=\"flex justify-start\">\r\n <div className=\"max-w-[80%] px-3 py-2 rounded-xl bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm flex gap-1 items-center\">\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.32s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '-0.16s' }}></div>\r\n <div className=\"w-1.5 h-1.5 bg-gray-400 rounded-full animate-bounce\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div ref={messagesEndRef} />\r\n </div>\r\n );\r\n};","// src/components/MessageBubble/MessageBubble.tsx\r\n\"use client\";\r\n\r\nimport React from 'react';\r\nimport clsx from 'clsx';\r\nimport { Message } from '../../types';\r\n\r\ninterface MessageBubbleProps {\r\n message: Message;\r\n}\r\n\r\nexport const MessageBubble: React.FC<MessageBubbleProps> = ({ message }) => {\r\n const isUser = message.role === 'user';\r\n\r\n return (\r\n <div className={clsx(\"flex w-full\", isUser ? \"justify-end\" : \"justify-start\")}>\r\n <div\r\n className={clsx(\r\n \"max-w-[80%] px-3 py-2 rounded-xl text-sm break-all\",\r\n isUser\r\n ? \"bg-(--ai-user-bg) text-(--ai-user-text) rounded-br-sm\"\r\n : \"bg-(--ai-bot-bg) text-(--ai-text) rounded-bl-sm\"\r\n )}\r\n >\r\n {message.content}\r\n </div>\r\n </div>\r\n );\r\n};","// src/components/ChatInput/ChatInput.tsx\r\n\"use client\";\r\n\r\nimport React, { useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Send } from 'lucide-react';\r\n\r\ninterface ChatInputProps {\r\n onSendMessage: (message: string) => void;\r\n isLoading: boolean;\r\n}\r\n\r\nexport const ChatInput: React.FC<ChatInputProps> = ({ onSendMessage, isLoading }) => {\r\n const [inputValue, setInputValue] = useState('');\r\n\r\n const handleSend = () => {\r\n if (inputValue.trim()) {\r\n onSendMessage(inputValue);\r\n setInputValue('');\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSend();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"flex gap-2 p-3 border-t border-(--ai-border) bg-(--ai-bg)\">\r\n <input\r\n className={clsx(\r\n \"flex-1 px-3 py-2 border border-(--ai-border) rounded-lg outline-none\",\r\n \"font-inherit text-(--ai-text) placeholder:text-(--ai-text-secondary)\",\r\n \"focus:border-(--ai-primary) disabled:opacity-50\"\r\n )}\r\n value={inputValue}\r\n onChange={(e) => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"پیام خود را بنویسید...\"\r\n disabled={isLoading}\r\n />\r\n <button\r\n className={clsx(\r\n \"px-3 py-2 rounded-lg flex items-center justify-center transition-opacity\",\r\n \"bg-(--ai-primary) text-(--ai-primary-fg)\",\r\n \"hover:opacity-90\",\r\n (isLoading || !inputValue.trim()) && \"opacity-50 cursor-not-allowed\"\r\n )}\r\n onClick={handleSend}\r\n disabled={isLoading || !inputValue.trim()}\r\n >\r\n <Send size={18} />\r\n </button>\r\n </div>\r\n );\r\n};"],"mappings":"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","names":["useState","useEffect","clsx","useRef","useEffect","clsx","jsx","MessageBubble","message","isUser","jsx","jsxs","MessageList","messages","isLoading","messagesEndRef","useRef","useEffect","msg","index","MessageBubble","useState","clsx","Send","jsx","jsxs","ChatInput","onSendMessage","isLoading","inputValue","setInputValue","handleSend","handleKeyDown","e","Bot","jsx","jsxs","ChatWindow","apiEndpoint","title","welcomeMessage","messages","setMessages","useState","isLoading","setIsLoading","useEffect","handleSendMessage","userMessage","newUserMsg","currentMessages","response","botMsg","prev","error","errorMsg","clsx","MessageList","ChatInput"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mehdi-akbari-ai-assistant-free",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Professional AI Chatbot Library with Tailwind CSS",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"react": ">=18",
|
|
30
|
-
"react-dom": ">=18"
|
|
30
|
+
"react-dom": ">=18",
|
|
31
|
+
"tailwindcss": "^4.0.0"
|
|
31
32
|
},
|
|
32
33
|
"dependencies": {
|
|
33
34
|
"@langchain/core": "^0.1.0",
|