diff --git a/src/components/Chatbot.css b/src/components/Chatbot.css index bfd349d..b43ab47 100644 --- a/src/components/Chatbot.css +++ b/src/components/Chatbot.css @@ -1,111 +1,159 @@ /* Chatbot Container */ .chatbot-container { - background-color: #ffffff; /* Solid white background */ - border: 1px solid #ccc; /* Light gray border */ - border-radius: 8px; /* Rounded corners */ - padding: 15px; /* Inner padding */ - box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); /* Subtle shadow for depth */ - width: 350px; /* Chatbot width */ - position: fixed; /* Floating position */ - bottom: 20px; /* Distance from bottom */ - right: 20px; /* Distance from right */ - z-index: 1000; /* Ensure it appears on top */ - font-family: Arial, sans-serif; /* Font for consistency */ - } - - /* Chat Messages */ - .chat-messages { - max-height: 300px; /* Limit height for scrolling */ - overflow-y: auto; /* Enable vertical scrolling */ - margin-bottom: 10px; /* Space below the messages */ - padding-right: 10px; /* Prevent text from touching the edge */ - } - - /* Individual Message */ - .message { - margin: 5px 0; /* Spacing between messages */ - padding: 8px 10px; /* Inner padding for readability */ - border-radius: 6px; /* Rounded message boxes */ - font-size: 14px; /* Readable font size */ - line-height: 1.4; /* Comfortable line spacing */ - } - - /* User Message */ - .message.user { - align-self: flex-end; /* Align user messages to the right */ - background-color: #007bff; /* Blue background for user */ - color: #ffffff; /* White text for contrast */ - } - - /* Bot Message */ - .message.bot { - align-self: flex-start; /* Align bot messages to the left */ - background-color: #f1f1f1; /* Light gray background for bot */ - color: #333333; /* Dark text for readability */ - } - - /* Loading Indicator */ - .message.bot.typing { - font-style: italic; /* Italic text to indicate typing */ - color: #666666; /* Subtle color */ - } - - /* Chat Input Form */ - .chat-input-form { - display: flex; /* Arrange input and button side by side */ - gap: 5px; /* Space between input and button */ - align-items: center; /* Align input and button vertically */ - } - - /* Input Field */ - .chat-input-form input { - flex: 1; /* Take up remaining space */ - padding: 10px; /* Padding inside input */ - border: 1px solid #ccc; /* Light gray border */ - border-radius: 5px; /* Rounded corners */ - font-size: 14px; /* Font size */ - } - - /* Input Focus */ - .chat-input-form input:focus { - outline: none; /* Remove blue outline */ - border-color: #007bff; /* Blue border on focus */ - box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); /* Glow effect */ - } - - /* Send Button */ - .chat-input-form button { - background-color: #007bff; /* Blue background */ - color: #ffffff; /* White text */ - border: none; /* No border */ - padding: 10px 15px; /* Padding inside button */ - border-radius: 5px; /* Rounded corners */ - cursor: pointer; /* Pointer cursor on hover */ - font-size: 14px; /* Font size */ - } - - /* Send Button Hover */ - .chat-input-form button:hover { - background-color: #0056b3; /* Darker blue on hover */ - } - - /* Send Button Disabled */ - .chat-input-form button:disabled { - background-color: #cccccc; /* Gray background when disabled */ - cursor: not-allowed; /* Indicate disabled state */ - } - - /* Scrollbar Styling for Chat Messages */ - .chat-messages::-webkit-scrollbar { - width: 8px; /* Width of scrollbar */ - } - - .chat-messages::-webkit-scrollbar-thumb { - background: #cccccc; /* Gray scrollbar thumb */ - border-radius: 4px; /* Rounded scrollbar */ - } - - .chat-messages::-webkit-scrollbar-thumb:hover { - background: #aaaaaa; /* Darker gray on hover */ - } - \ No newline at end of file + background-color: #ffffff; /* Solid white background */ + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + padding: 15px; /* Inner padding */ + box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); /* Subtle shadow for depth */ + width: 350px; /* Chatbot width */ + position: fixed; /* Floating position */ + bottom: 20px; /* Distance from bottom */ + right: 20px; /* Distance from right */ + z-index: 1000; /* Ensure it appears on top */ + font-family: Arial, sans-serif; /* Font for consistency */ + + display: flex; /* For minimized mode */ + flex-direction: column; + transition: all 0.3s ease; /* Smooth transition for minimize/maximize */ +} + +/* Chat Messages */ +.chat-messages { + max-height: 300px; /* Limit height for scrolling */ + overflow-y: auto; /* Enable vertical scrolling */ + margin-bottom: 10px; /* Space below the messages */ + padding-right: 10px; /* Prevent text from touching the edge */ +} + +/* Individual Message */ +.message { + margin: 5px 0; /* Spacing between messages */ + padding: 8px 10px; /* Inner padding for readability */ + border-radius: 6px; /* Rounded message boxes */ + font-size: 14px; /* Readable font size */ + line-height: 1.4; /* Comfortable line spacing */ +} + +/* User Message */ +.message.user { + align-self: flex-end; /* Align user messages to the right */ + background-color: #007bff; /* Blue background for user */ + color: #ffffff; /* White text for contrast */ +} + +/* Bot Message */ +.message.bot { + align-self: flex-start; /* Align bot messages to the left */ + background-color: #f1f1f1; /* Light gray background for bot */ + color: #333333; /* Dark text for readability */ +} + +/* Loading Indicator */ +.message.bot.typing { + font-style: italic; /* Italic text to indicate typing */ + color: #666666; /* Subtle color */ +} + +/* Chat Input Form */ +.chat-input-form { + display: flex; /* Arrange input and button side by side */ + gap: 5px; /* Space between input and button */ + align-items: center; /* Align input and button vertically */ +} + +/* Input Field */ +.chat-input-form input { + flex: 1; /* Take up remaining space */ + padding: 10px; /* Padding inside input */ + border: 1px solid #ccc; /* Light gray border */ + border-radius: 5px; /* Rounded corners */ + font-size: 14px; /* Font size */ +} + +/* Input Focus */ +.chat-input-form input:focus { + outline: none; /* Remove blue outline */ + border-color: #007bff; /* Blue border on focus */ + box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); /* Glow effect */ +} + +/* Send Button */ +.chat-input-form button { + background-color: #007bff; /* Blue background */ + color: #ffffff; /* White text */ + border: none; /* No border */ + padding: 10px 15px; /* Padding inside button */ + border-radius: 5px; /* Rounded corners */ + cursor: pointer; /* Pointer cursor on hover */ + font-size: 14px; /* Font size */ +} + +/* Send Button Hover */ +.chat-input-form button:hover { + background-color: #0056b3; /* Darker blue on hover */ +} + +/* Send Button Disabled */ +.chat-input-form button:disabled { + background-color: #cccccc; /* Gray background when disabled */ + cursor: not-allowed; /* Indicate disabled state */ +} + +/* Scrollbar Styling for Chat Messages */ +.chat-messages::-webkit-scrollbar { + width: 8px; /* Width of scrollbar */ +} + +.chat-messages::-webkit-scrollbar-thumb { + background: #cccccc; /* Gray scrollbar thumb */ + border-radius: 4px; /* Rounded scrollbar */ +} + +.chat-messages::-webkit-scrollbar-thumb:hover { + background: #aaaaaa; /* Darker gray on hover */ +} + +/* ============================= */ +/* Minimize/Maximize Additions */ +/* ============================= */ + +/* Header Bar for Minimization */ +.chatbot-header { + display: flex; + align-items: center; + justify-content: space-between; + background-color: #f5f5f5; + border-bottom: 1px solid #ccc; + margin-bottom: 10px; /* Optional: slight spacing under the header */ + padding: 8px 10px; + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} + +/* Title in the header */ +.chatbot-title { + font-weight: bold; +} + +/* Minimize button in header */ +.minimize-btn { + background: none; + border: none; + font-size: 18px; + cursor: pointer; + color: #333; +} + +/* When minimized, hide all but the header */ +.chatbot-container.minimized { + height: auto; + width: 350px; + max-height: 50px; /* Just an example narrower width when minimized */ + padding: 0 0 10px 0; + overflow: hidden; +} + +.chatbot-container.minimized .chat-messages, +.chatbot-container.minimized .chat-input-form { + display: none; /* Hide chat body & input */ +} diff --git a/src/components/Chatbot.js b/src/components/Chatbot.js index 9360af4..a2cca1e 100644 --- a/src/components/Chatbot.js +++ b/src/components/Chatbot.js @@ -3,7 +3,6 @@ import axios from "axios"; import "./Chatbot.css"; const Chatbot = ({ context }) => { - const [messages, setMessages] = useState([ { role: "assistant", @@ -14,56 +13,27 @@ const Chatbot = ({ context }) => { const [input, setInput] = useState(""); const [loading, setLoading] = useState(false); + // NEW: track whether the chatbot is minimized or expanded + const [isMinimized, setIsMinimized] = useState(false); + + const toggleMinimize = () => { + setIsMinimized((prev) => !prev); + }; + const sendMessage = async (content) => { const userMessage = { role: "user", content }; - // Ensure career data is injected into every API call + // Build your context summary const contextSummary = ` - You are an advanced AI career advisor for AptivaAI. - Your role is to not only provide career suggestions but to analyze them based on salary potential, job stability, education costs, and market trends. - - Use the following user-specific data: - - Career Suggestions: ${context.careerSuggestions?.map((c) => c.title).join(", ") || "No suggestions available."} - - Selected Career: ${context.selectedCareer?.title || "None"} - - Job Description: ${context.careerDetails?.jobDescription || "No job description available."} - - Expected Tasks: ${context.careerDetails?.tasks?.join(", ") || "No tasks available."} - - Salary Data: - ${context.salaryData?.length > 0 - ? context.salaryData.map(sd => `${sd.percentile}: $${sd.regionalSalary || "N/A"} (Regional), $${sd.nationalSalary || "N/A"} (National)`).join(", ") - : "Not available"} - - Schools Available: ${ - context.schools?.length > 0 - ? context.schools - .map(school => `${school.INSTNM} (Distance: ${school.distance || "N/A"}, Tuition: $${school["In_state cost"] || "N/A"})`) - .join("; ") - : "No schools available." - } - - - Economic Projections: ${ - context.economicProjections && Object.keys(context.economicProjections).length > 0 - ? `2022 Employment: ${context.economicProjections["2022 Employment"] || "N/A"}, ` + - `2032 Employment: ${context.economicProjections["2032 Employment"] || "N/A"}, ` + - `Total Change: ${context.economicProjections["Total Change"] || "N/A"}` - : "Not available" - } - - - User State: ${context.userState || "Not provided"} - - User Area: ${context.areaTitle || "Not provided"} - - User Zipcode: ${context.userZipcode || "Not provided"} - - **Your response should ALWAYS provide analysis, not just list careers.** - Example responses: - - "If you're looking for a high salary right away, X might be a great option, but it has slow growth." - - "If you prefer job stability, Y is projected to grow in demand over the next 10 years." - - "If work-life balance is a priority, avoid Z as it has high stress and irregular hours." - - If the user asks about "the best career," do not assume a single best choice. Instead, explain trade-offs like: - - "If you want high pay now, X is great, but it has limited upward growth." - - "If you prefer stability, Y is a better long-term bet." -`; + You are an advanced AI career advisor for AptivaAI. + Your role is to provide analysis based on user data: + - ... + (Continue with your existing context data as before) + `; + // Combine with existing messages const messagesToSend = [ - { role: "system", content: contextSummary }, // Inject AptivaAI data on every request + { role: "system", content: contextSummary }, ...messages, userMessage, ]; @@ -86,13 +56,17 @@ const Chatbot = ({ context }) => { ); const botMessage = response.data.choices[0].message; + // The returned message has {role: "assistant", content: "..."} setMessages([...messages, userMessage, botMessage]); } catch (error) { console.error("Chatbot Error:", error); setMessages([ ...messages, userMessage, - { role: "assistant", content: "Error: Unable to fetch response. Please try again." }, + { + role: "assistant", + content: "Error: Unable to fetch response. Please try again.", + }, ]); } finally { setLoading(false); @@ -108,28 +82,48 @@ const Chatbot = ({ context }) => { }; return ( -