@bash-dev/ai-chat-widget
Version:
Готовый к использованию AI чат-виджет для интеграции на любые сайты с поддержкой русского языка
300 lines (212 loc) • 8.04 kB
TypeScript
/**
* TypeScript определения для AI Chat Widget
*/
export interface ChatWidgetConfig {
/** URL API для чата */
apiUrl?: string;
/** ID сайта в системе */
siteId?: string;
/** Заголовок виджета */
title?: string;
/** Подзаголовок виджета */
subtitle?: string;
/** Основной цвет виджета */
primaryColor?: string;
/** Позиция виджета на странице */
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
/** Приветственное сообщение */
greeting?: string;
/** Placeholder для поля ввода */
placeholder?: string;
/** Показывать ли toast уведомления */
showToast?: boolean;
/** Текст toast уведомления */
toastMessage?: string;
/** Задержка перед показом toast (мс) */
toastDelay?: number;
/** Длительность показа toast (мс) */
toastDuration?: number;
}
export interface UserInfo {
/** Имя пользователя */
user_name?: string;
/** Email пользователя */
user_email?: string;
/** Телефон пользователя */
user_phone?: string;
/** User agent браузера */
userAgent?: string;
/** Язык браузера */
language?: string;
/** Текущий URL */
url?: string;
/** Реферер */
referrer?: string;
/** Timestamp */
timestamp?: string;
}
export interface ChatMessage {
/** Текст сообщения */
text: string;
/** Отправитель сообщения */
sender: 'user' | 'ai' | 'admin';
/** Время отправки */
timestamp: Date;
/** Информация об администраторе (если sender === 'admin') */
adminInfo?: {
adminName?: string;
adminId?: string;
};
}
export interface APIResponse {
/** Ответное сообщение */
message?: string;
/** ID сессии */
sessionId?: string;
/** Включен ли AI */
aiEnabled?: boolean;
/** Код ошибки */
code?: string;
}
export declare class AIChatWidget {
/** Конфигурация виджета */
config: ChatWidgetConfig;
/** Массив сообщений */
messages: ChatMessage[];
/** ID текущей сессии */
sessionId: string;
/** Открыт ли чат */
isOpen: boolean;
/** Загружается ли ответ */
isLoading: boolean;
/** Показан ли toast */
toastShown: boolean;
/** Timestamp последнего сообщения */
lastMessageTimestamp: string | null;
/** Интервал polling */
pollingInterval: NodeJS.Timeout | null;
/** Отправлял ли пользователь сообщения */
hasUserSentMessage: boolean;
/** Нужно ли загружать историю */
shouldLoadHistory: boolean;
/** Количество непрочитанных сообщений */
unreadCount: number;
/** Timestamp последнего прочтения */
lastReadTimestamp: string | null;
/** Информация о пользователе */
userInfo: UserInfo;
/** Собраны ли данные пользователя */
isUserInfoCollected: boolean;
/** DOM элементы виджета */
elements: {
toggle: HTMLButtonElement;
window: HTMLDivElement;
close: HTMLButtonElement;
messages: HTMLDivElement;
input: HTMLTextAreaElement;
send: HTMLButtonElement;
toast: HTMLDivElement;
toastClose: HTMLButtonElement;
toastAction: HTMLButtonElement;
toastMessage: HTMLDivElement;
unreadBadge: HTMLSpanElement;
};
/**
* Создает новый экземпляр виджета
* @param config Конфигурация виджета
*/
constructor(config?: ChatWidgetConfig);
/** Инициализация виджета */
init(): void;
/** Валидация сайта и инициализация */
validateSiteAndInit(): Promise<void>;
/** Скрытие виджета */
hideWidget(): void;
/** Генерация ID сессии */
generateSessionId(): string;
/** Инициализация сессии */
initializeSession(): string;
/** Сохранение сессии в localStorage */
saveSessionToStorage(): void;
/** Загрузка информации о пользователе */
loadUserInfo(): UserInfo;
/** Сохранение информации о пользователе */
saveUserInfo(userInfo: UserInfo): void;
/** Показ формы сбора данных пользователя */
showUserInfoForm(): boolean;
/** Автосохранение данных пользователя */
autoSaveUserInfo(): void;
/** Обработка отправки формы пользователя */
handleUserInfoSubmit(form: HTMLFormElement): void;
/** Показ ошибки в форме */
showFormError(message: string): void;
/** Скрытие формы пользователя */
hideUserInfoForm(): void;
/** Валидация email */
isValidEmail(email: string): boolean;
/** Валидация телефона */
isValidPhone(phone: string): boolean;
/** Создание стилей */
createStyles(): void;
/** Получение CSS стилей */
getStyles(): string;
/** Создание DOM структуры виджета */
createWidget(): void;
/** Привязка событий */
bindEvents(): void;
/** Переключение состояния чата */
toggleChat(): void;
/** Открытие чата */
openChat(): void;
/** Закрытие чата */
closeChat(): void;
/** Загрузка истории чата */
loadChatHistory(): Promise<void>;
/** Добавление приветственного сообщения */
addGreeting(): void;
/** Добавление сообщения в чат */
addMessage(text: string, sender?: 'user' | 'ai' | 'admin', adminInfo?: { adminName?: string; adminId?: string }): HTMLDivElement;
/** Показ индикатора печати */
showTypingIndicator(): HTMLDivElement;
/** Скрытие индикатора печати */
hideTypingIndicator(): void;
/** Отправка сообщения */
sendMessage(): Promise<void>;
/** Вызов API */
callAPI(message: string): Promise<APIResponse>;
/** Получение информации о пользователе */
getUserInfo(): UserInfo;
/** Прокрутка к низу */
scrollToBottom(): void;
/** Инициализация toast */
initToast(): void;
/** Показ toast */
showToast(): void;
/** Скрытие toast */
hideToast(): void;
/** Принудительный показ toast */
forceShowToast(): void;
/** Запуск polling */
startPolling(): void;
/** Остановка polling */
stopPolling(): void;
/** Проверка новых сообщений */
checkForNewMessages(): Promise<void>;
/** Обновление индикатора непрочитанных сообщений */
updateUnreadBadge(): void;
/** Показ toast уведомления о новом сообщении */
showNewMessageToast(messageContent: string): void;
/** Сброс счетчика непрочитанных сообщений */
markAllAsRead(): void;
/** Статический метод инициализации */
static init(config?: ChatWidgetConfig): AIChatWidget;
}
/**
* Глобальная переменная виджета в window
*/
declare global {
interface Window {
AIChatWidget: typeof AIChatWidget;
}
}
export default AIChatWidget;