Seth0330 commited on
Commit
4c86404
·
verified ·
1 Parent(s): bbaafe2

Create frontend/src/components/admin/AdminAIAssistant.jsx

Browse files
frontend/src/components/admin/AdminAIAssistant.jsx ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // frontend/src/components/admin/AdminAIAssistant.jsx
2
+ import React, { useState } from "react";
3
+ import api from "../../api/client";
4
+
5
+ export default function AdminAIAssistant({ open, onClose, memberships }) {
6
+ const [message, setMessage] = useState("");
7
+ const [answer, setAnswer] = useState("");
8
+ const [loading, setLoading] = useState(false);
9
+
10
+ if (!open) return null;
11
+
12
+ async function handleAsk(e) {
13
+ e.preventDefault();
14
+ if (!message.trim()) return;
15
+
16
+ setLoading(true);
17
+ setAnswer("");
18
+
19
+ try:
20
+ const res = await api.post("/ai/admin", {
21
+ question: message,
22
+ membership_count: memberships.length,
23
+ });
24
+ setAnswer(res.data?.answer || "AI assistant responded.");
25
+ } catch (err) {
26
+ setAnswer("Sorry, the AI assistant is not available right now.");
27
+ } finally {
28
+ setLoading(false);
29
+ }
30
+ }
31
+
32
+ return (
33
+ <div className="fixed inset-0 z-40 flex items-end sm:items-center justify-center bg-black/30">
34
+ <div className="w-full max-w-lg bg-white rounded-t-2xl sm:rounded-2xl shadow-xl border border-stone-200 p-4 sm:p-5">
35
+ <div className="flex items-center justify-between mb-3">
36
+ <div>
37
+ <h2 className="text-sm font-semibold text-stone-900">
38
+ Admin AI assistant
39
+ </h2>
40
+ <p className="text-xs text-stone-500">
41
+ Ask about renewals, churn risk, and membership health.
42
+ </p>
43
+ </div>
44
+ <button
45
+ type="button"
46
+ onClick={onClose}
47
+ className="text-xs text-stone-500 hover:text-stone-800"
48
+ >
49
+ Close
50
+ </button>
51
+ </div>
52
+
53
+ <form onSubmit={handleAsk} className="space-y-3">
54
+ <textarea
55
+ className="w-full rounded-lg border border-stone-200 px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500 min-h-[70px]"
56
+ placeholder="e.g., Which members are most at risk of churning this month?"
57
+ value={message}
58
+ onChange={(e) => setMessage(e.target.value)}
59
+ />
60
+
61
+ <div className="flex items-center justify-between gap-3">
62
+ <div className="text-[11px] text-stone-400">
63
+ This calls the <code>/api/ai/admin</code> endpoint.
64
+ </div>
65
+ <button
66
+ type="submit"
67
+ disabled={loading}
68
+ className="px-3 py-1.5 rounded-lg bg-purple-600 text-white text-xs font-medium hover:bg-purple-700 disabled:opacity-60"
69
+ >
70
+ {loading ? "Thinking…" : "Ask AI"}
71
+ </button>
72
+ </div>
73
+ </form>
74
+
75
+ {answer && (
76
+ <div className="mt-3 rounded-lg bg-stone-50 border border-stone-200 px-3 py-2 text-sm text-stone-800 whitespace-pre-wrap">
77
+ {answer}
78
+ </div>
79
+ )}
80
+ </div>
81
+ </div>
82
+ );
83
+ }