══════════ فاز ۳ — چت واقعی (پیام‌رسان) ══════════

چه چیزی اضافه شد
  • صفحهٔ چت مشتری:  chat.html  (دکمهٔ «چت با ما» در index.html حالا به آن می‌رود)
      متن + آپلود عکس/PDF، وضعیت ✓ ارسال شد / ✓✓ دیده شد، بالا کشیدن = پیام‌های قدیمی‌تر،
      تلاش دوباره برای پیام‌های ناموفق، کوچک‌سازی خودکار عکس‌های سنگین، اعلان پاسخ مدیر (اختیاری)
  • صندوق گفتگوی مدیر:  inbox.html  (لینک سبز در نوار کناری admin.html)
      لیست گفتگوها (آخرین پیام، زمان، تعداد نخوانده، نقطهٔ آنلاین)، جستجو (نام/موبایل/کد درخواست)،
      فیلتر: همه / خوانده‌نشده / امروز / مربوط به درخواست، پاسخ سریع (قابل ویرایش)، پیوست فایل
  • ماژول سرور:  server-part/chat3.js   (SQLite + Socket.io روی namespace جدا: /c3)

چت قدیمی (فاز ۰) دست نخورده است؛ فقط دیگر از دکمه‌ها به آن لینک نمی‌شود.

────────── نصب روی سرور Node ──────────
1) فایل‌ها را مثل فازهای قبل جایگزین کنید. فایل جدید  server-part/chat3.js  را کنار server.js بگذارید
   (کنار services-admin.js).

2) یک بسته نصب کنید:
       npm install better-sqlite3
   (اختیاری، فقط برای اعلان Push روی گوشی مشتری:  npm install web-push )

3) در server.js، بعد از ساخته شدن app و io و requireAdmin، این را اضافه کنید:

       const mountChat = require('./chat3');
       const chat3 = mountChat({
         app, io, requireAdmin,
         dataDir: path.join(__dirname, 'data')
       });

   • اگر متغیر سوکت در server.js اسم دیگری دارد (مثلاً  const io = new Server(server) )، همان را بدهید.
   • اگر پوشه‌ای از بالادست مثل «cafenetakbari/» را استاتیک سرو می‌کنید، فایل‌های جدید
     (chat.html، inbox.html، chat3.css، chat3-ui.js) باید کنار index.html باشند.

4) سرور را ری‌استارت کنید. صفحهٔ  /cafenetakbari/inbox.html  را (بعد از ورود به admin.html) باز کنید.

داده‌ها: data/chat.db (پیام‌ها)، data/c3-files/ (فایل‌های آپلودی)، data/c3-quick.json (پاسخ‌های سریع)،
data/c3-vapid.json (کلید اعلان). موقع آپدیت این‌ها را پاک نکنید و از data/ پشتیبان بگیرید.

────────── نکات مهم ──────────
  • مشتری با همان شناسهٔ مرورگر قبلی (ak_cid) شناخته می‌شود؛ پاک شدن مرورگر = گفتگو برای او گم می‌شود.
    (ورود با کد پیامکی در فاز ۴ همین را حل می‌کند.)
  • تست چند مشتری روی یک سیستم:  chat.html?c=1  و  chat.html?c=2  (مثل index.html)
  • حجم هر فایل حداکثر ۱۰ مگابایت و فقط JPG/PNG/WebP/GIF/PDF. نوع فایل از روی محتوایش بررسی می‌شود.
  • اگر جلوی Node، Nginx دارید:  client_max_body_size 12m;  و پشتیبانی WebSocket را فعال نگه دارید.
  • اگر در server.js از helmet/CSP استفاده می‌کنید، اجازهٔ  connect-src 'self' ws: wss:  و  img-src 'self' blob:  لازم است.
  • اعلان Push فقط روی https کار می‌کند. در سرور می‌توانید  VAPID_SUBJECT=mailto:شما@example.com  را در .env بگذارید.
    کاربر آیفون فقط وقتی اعلان می‌گیرد که سایت را «افزودن به صفحهٔ اصلی» کرده باشد.
  • برای سبک ماندن با هزاران مشتری: لیست مدیر ۴۰تا‌۴۰تا و پیام‌ها ۳۰تا‌۳۰تا از دیتابیس می‌آیند؛
    فقط اتصال مشتریانِ آنلاین زنده است و پیام آفلاین‌ها در SQLite می‌ماند. (Redis فعلاً لازم نیست.)
  • سرویس‌ورکر به v2 رفت؛ دفعهٔ اول یک بار صفحه را تازه‌سازی کنید.

آمادگی برای فاز ۴: ماژول دو قلاب دارد (onClientMessage و onAdminMessage) که بعداً برای واتساپ/پیامک وصل می‌شوند،
و چت‌صفحه آدرس  chat.html?req=کدپیگیری  را می‌شناسد تا گفتگو به همان درخواست وصل شود.
