fixed ui layout and integrated starting new chat session

This commit is contained in:
Yue Fung Lee
2023-11-29 23:19:51 -05:00
parent 0b3a13878e
commit 78ccd53419
4 changed files with 85 additions and 12 deletions
+1
View File
@@ -116,6 +116,7 @@ h1
justify-content: space-around justify-content: space-around
padding: 10px padding: 10px
color: $c-default-icon color: $c-default-icon
background-color: white
.navbar-item .navbar-item
text-decoration: none text-decoration: none
+71
View File
@@ -6,6 +6,8 @@ import Japanese from '../assets/img/lang/ja.svg'
// db.user: Current logged-in user // db.user: Current logged-in user
const db = localStorage const db = localStorage
const backendUrl = 'https://localhost:8000'
export interface Lang { export interface Lang {
name: string name: string
code: string code: string
@@ -26,6 +28,8 @@ export function signup(username: string, password: string, language: string)
users[username] = {password, language} users[username] = {password, language}
db.users = JSON.stringify(users) db.users = JSON.stringify(users)
db.user = username
} }
export function login(username: string, password: string) export function login(username: string, password: string)
@@ -46,3 +50,70 @@ export function isLoggedIn()
{ {
return !!db.user return !!db.user
} }
export function getLanguage(username: string)
{
const users = JSON.parse(db.users)
return users[username].language
}
export function getUsername()
{
return db.user
}
async function post(endpoint: string, body: any) {
const response = await fetch(`${backendUrl}/${endpoint}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(body),
});
return response;
}
export interface CharacterChatCreationRequest
{
character: string;
user_name: string;
language: string;
}
export interface CharacterChatCreationResponse
{
// this shoudl be of type UUID
chat_id: string;
}
export async function startFictionalChat(character: string): Promise<CharacterChatCreationResponse> {
const currUser = getUsername();
const language = getLanguage(currUser);
const request: CharacterChatCreationRequest = {
character: character,
user_name: currUser,
language: language
};
console.log('Sending request:', request);
const response = await fetch(`${backendUrl}/character-chat`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(request),
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`HTTP error! status: ${response.status}, message: ${errorData.message}`);
}
return await response.json();
}
// export interface
+3 -2
View File
@@ -6,7 +6,7 @@ import { useState } from 'react';
export default function Character() { export default function Character() {
const location = useLocation(); const location = useLocation();
const navigate = useNavigate(); const navigate = useNavigate();
const { name, image } = location.state; const { name, image , sessionId } = location.state;
const [messages, setMessages] = useState([ const [messages, setMessages] = useState([
{ text: 'Hello!', sender: 'me' }, { text: 'Hello!', sender: 'me' },
@@ -15,7 +15,8 @@ export default function Character() {
]); ]);
function handleRecord() { function handleRecord() {
// handle the recording console.log("Recording...");
console.log(sessionId)
} }
return ( return (
+10 -10
View File
@@ -3,35 +3,35 @@ import Ash from "../assets/img/ash.png"
import C3PO from "../assets/img/c3po.png" import C3PO from "../assets/img/c3po.png"
import { useNavigate } from "react-router-dom" import { useNavigate } from "react-router-dom"
import CharacterBadge from "../components/CharacterBadge" import CharacterBadge from "../components/CharacterBadge"
import { startFictionalChat } from "../logic/sdk"
export default function CharacterSelection() { export default function CharacterSelection() {
const navigate = useNavigate(); const navigate = useNavigate();
const characters = [ const characters = [
{ name: 'Ash', image: Ash }, { name: 'Ash', image: Ash, alias: 'ash_pokemon'},
{ name: 'C3PO', image: C3PO }, { name: 'C3PO', image: C3PO, alias: 'c3po_starwars'},
// Add more characters here // Add more characters here
]; ];
const startSession = () => { const handleCharacterClick = (characterName: string, characterImage: string, alias: string) => {
// Start a session with the selected character
}
const handleCharacterClick = (characterName: string, characterImage: string) => { startFictionalChat(alias).then((sessionId) => {
navigate('/character', { state: { name: characterName, image: characterImage } }); navigate('/character', { state: { name: characterName, image: characterImage, sessionId: sessionId } });
})
} }
return ( return (
<div > <div className="flex flex-col items-center justify-center">
<div className="v-layout p-10"> <div className="v-layout p-10">
<h1 className="text-center">Talk With...</h1> <h1 className="text-center">Talk With...</h1>
<div className="grid grid-cols-2 gap-3"> <div className="flex flex-wrap justify-center gap-3">
{characters.map(character => ( {characters.map(character => (
<CharacterBadge <CharacterBadge
key={character.name} key={character.name}
name={character.name} name={character.name}
image={character.image} image={character.image}
onClick={() => handleCharacterClick(character.name, character.image)} onClick={() => handleCharacterClick(character.name, character.image, character.alias)}
/> />
))} ))}
</div> </div>