Files
micro-frontend/ng-ttc-frontend/src/app/component/chat-widget-component/chat-widget-component.ts

102 lines
3.5 KiB
TypeScript
Raw Normal View History

2025-12-01 14:16:19 +07:00
import { ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';
import { Component, HostListener } from '@angular/core';
2025-12-01 14:06:46 +07:00
@Component({
selector: 'app-chat-widget-component',
standalone: false,
templateUrl: './chat-widget-component.html',
styleUrl: './chat-widget-component.css',
})
export class ChatWidgetComponent {
2025-12-01 14:16:19 +07:00
isOpen = true;
2025-12-01 14:06:46 +07:00
newMessage = '';
2025-12-01 14:16:19 +07:00
chatForm!: FormGroup;
// State สำหรับจัดการขนาด
isMaximized = false;
isResizing = false;
// ขนาดเริ่มต้น (px)
chatWidth = 320;
chatHeight = 384;
// ตัวแปรสำหรับคำนวณการลาก
private startX = 0;
private startY = 0;
private startWidth = 0;
private startHeight = 0;
constructor() {
this.setupFormControl(); // เรียกใช้ตอนเริ่ม Component
}
setupFormControl() {
this.chatForm = new FormGroup({
message: new FormControl('', [Validators.required])
});
}
2025-12-01 14:06:46 +07:00
messages = [
2025-12-01 14:16:19 +07:00
{ text: 'สวัสดีครับ AI พร้อมช่วยเหลือครับ 👋', isUser: false },
{ text: 'ลองกดปุ่มขยายที่หัวมุม หรือลากมุมซ้ายบนของกล่องเพื่อปรับขนาดได้เลยครับ', isUser: false },
2025-12-01 14:06:46 +07:00
];
toggleChat() {
this.isOpen = !this.isOpen;
2025-12-01 14:16:19 +07:00
this.isMaximized = false; // Reset ขนาดเมื่อปิด
}
toggleMaximize() {
this.isMaximized = !this.isMaximized;
2025-12-01 14:06:46 +07:00
}
sendMessage() {
if (this.newMessage.trim()) {
this.messages.push({ text: this.newMessage, isUser: true });
this.newMessage = '';
setTimeout(() => {
this.messages.push({
2025-12-01 14:16:19 +07:00
text: 'รับทราบครับ ระบบกำลังประมวลผล...',
2025-12-01 14:06:46 +07:00
isUser: false
});
}, 1000);
}
}
2025-12-01 14:16:19 +07:00
// --- Logic สำหรับการ Resize (ลากขยาย) ---
startResizing(event: MouseEvent) {
event.preventDefault(); // ป้องกันการเลือก Text
this.isResizing = true;
// บันทึกตำแหน่งเมาส์และขนาดปัจจุบัน
this.startX = event.clientX;
this.startY = event.clientY;
this.startWidth = this.chatWidth;
this.startHeight = this.chatHeight;
}
// ใช้ @HostListener เพื่อดักจับ MouseMove ทั่วทั้ง Window
@HostListener('window:mousemove', ['$event'])
onMouseMove(event: MouseEvent) {
if (!this.isResizing) return;
// คำนวณความต่าง (Delta)
// หมายเหตุ: ลากไปทางซ้าย (ค่า X น้อยลง) ต้องทำให้กว้างขึ้น -> ใช้ startX - clientX
// ลากไปข้างบน (ค่า Y น้อยลง) ต้องทำให้สูงขึ้น -> ใช้ startY - clientY
const deltaX = this.startX - event.clientX;
const deltaY = this.startY - event.clientY;
// กำหนดขนาดใหม่ (จำกัดขนาดต่ำสุดไม่ให้เล็กเกินไป)
this.chatWidth = Math.max(300, this.startWidth + deltaX);
this.chatHeight = Math.max(350, this.startHeight + deltaY);
}
@HostListener('window:mouseup')
stopResizing() {
this.isResizing = false;
}
2025-12-01 14:06:46 +07:00
}