Introduce a footer-triggered Version History drawer with categorized release notes, hardcoded release data, and semver tracking at v0.3.0. Also ships blog blockquote/table styling, site-wide typography, home page image updates, header refinements, and related bug fixes. Co-authored-by: Cursor <cursoragent@cursor.com>
57 lines
2.8 KiB
TypeScript
57 lines
2.8 KiB
TypeScript
import type { ChatMessage, SendMessageOptions } from "./types";
|
|
|
|
const MOCK_RESPONSES = [
|
|
"درخواست شما دریافت شد. این پاسخ آزمایشی است و پس از اتصال به سرویس واقعی، خروجی دقیقتری دریافت خواهید کرد.",
|
|
"بر اساس متن ارسالی، میتوانم یک خلاصه کوتاه ارائه دهم. در نسخه فعلی، این بخش بهصورت شبیهسازیشده پاسخ میدهد.",
|
|
"سناریوی انتخابشده برای آزمایش مناسب است. میتوانید تنظیمات مدل و حالت پاسخ را از پنل کناری تغییر دهید.",
|
|
];
|
|
|
|
function pickMockResponse(userText: string): string {
|
|
const lower = userText.toLowerCase();
|
|
|
|
if (lower.includes("خلاصه") || lower.includes("summary")) {
|
|
return "خلاصه آزمایشی: متن شما شامل چند نکته کلیدی است که میتوان آنها را در قالب گزارش کوتاه ارائه داد. پس از اتصال API، این بخش با مدل واقعی تکمیل میشود.";
|
|
}
|
|
|
|
if (lower.includes("ایمیل") || lower.includes("email")) {
|
|
return "پیشنویس ایمیل آزمایشی:\n\nبا سلام و احترام،\n\nاز پیام شما سپاسگزاریم. در حال بررسی درخواست هستیم و بهزودی پاسخ کامل ارسال خواهد شد.\n\nبا تشکر";
|
|
}
|
|
|
|
if (lower.includes("پشتیبانی") || lower.includes("مشتری")) {
|
|
return "پاسخ پیشنهادی پشتیبانی: مشکل شما ثبت شد. لطفاً شماره پیگیری را نگه دارید. تیم ما در اسرع وقت با شما تماس خواهد گرفت.";
|
|
}
|
|
|
|
const index = userText.length % MOCK_RESPONSES.length;
|
|
return MOCK_RESPONSES[index]!;
|
|
}
|
|
|
|
function delay(ms: number, signal?: AbortSignal): Promise<void> {
|
|
return new Promise((resolve, reject) => {
|
|
const timer = setTimeout(resolve, ms);
|
|
signal?.addEventListener("abort", () => {
|
|
clearTimeout(timer);
|
|
reject(new DOMException("Aborted", "AbortError"));
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Mock AI handler — swap this function body for a real API call later.
|
|
* Example future signature: POST /api/playground/chat with messages + options.
|
|
*/
|
|
export async function sendMessageToAI(
|
|
messages: ChatMessage[],
|
|
options?: SendMessageOptions
|
|
): Promise<string> {
|
|
const lastUserMessage = [...messages].reverse().find((m) => m.role === "user");
|
|
const userText = lastUserMessage?.content ?? "";
|
|
|
|
const baseDelay = 700 + Math.min(userText.length * 8, 1200);
|
|
const temperature = options?.settings?.temperature ?? 0.7;
|
|
const adjustedDelay = Math.round(baseDelay * (0.8 + temperature * 0.4));
|
|
|
|
await delay(adjustedDelay, options?.signal);
|
|
|
|
return pickMockResponse(userText);
|
|
}
|