diff --git a/vite/package-lock.json b/vite/package-lock.json index 8fdb990..cec92e4 100644 --- a/vite/package-lock.json +++ b/vite/package-lock.json @@ -2644,6 +2644,7 @@ "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", "engines": { "node": "*" } diff --git a/vite/src/App.css b/vite/src/App.css index 117d13e..2d6ed67 100644 --- a/vite/src/App.css +++ b/vite/src/App.css @@ -9,4 +9,8 @@ main{ @apply flex-1 grid grid-cols-2 gap-4 justify-start p-8 overflow-hidden; +} + +label{ + @apply !text-sm !font-bold !bg-blue-500 text-white lowercase px-2 rounded-full; } \ No newline at end of file diff --git a/vite/src/comps/debug.jsx b/vite/src/comps/debug.jsx index 35d2e40..399ca01 100644 --- a/vite/src/comps/debug.jsx +++ b/vite/src/comps/debug.jsx @@ -24,7 +24,7 @@ export function DebugControl({refLight}){
- +
diff --git a/vite/src/comps/numpad.jsx b/vite/src/comps/numpad.jsx index ab10895..9b5bcfc 100644 --- a/vite/src/comps/numpad.jsx +++ b/vite/src/comps/numpad.jsx @@ -13,7 +13,7 @@ const TMP_MAP_KEY={ 7:9, } -export default function NumPad({onSend}){ +export default function NumPad({onSend, disabled}){ const [input, _setInput]=useState(); const refInput=useRef(); @@ -30,7 +30,11 @@ export default function NumPad({onSend}){ const refAudio=useRef([]); function onkeydown(e){ + + console.log(e.key); + if(disabled) return; // Ignore key events if disabled + if(e.key===KEY_ENTER){ @@ -89,16 +93,19 @@ export default function NumPad({onSend}){ useEffect(()=>{ + if(disabled) return; + window.onkeydown=onkeydown; return () => { window.onkeydown=null; // Clean up the event listener }; - },[]); + },[disabled]); return ( -
+
+ {input}
); diff --git a/vite/src/main.jsx b/vite/src/main.jsx index b9a2413..ce0d88c 100644 --- a/vite/src/main.jsx +++ b/vite/src/main.jsx @@ -10,10 +10,12 @@ import { Conversation } from './pages/conversation.jsx'; import { ChatProvider } from './util/useChat.jsx'; import { DataProvider } from './util/useData.jsx'; import { FreeFlow } from './pages/flow_free.jsx'; +import { UserProvider } from './util/useUser.jsx'; createRoot(document.getElementById('root')).render( + @@ -25,6 +27,7 @@ createRoot(document.getElementById('root')).render( + , diff --git a/vite/src/pages/flow_free.jsx b/vite/src/pages/flow_free.jsx index 2e7acdd..805f59a 100644 --- a/vite/src/pages/flow_free.jsx +++ b/vite/src/pages/flow_free.jsx @@ -12,6 +12,7 @@ import { useData } from "../util/useData"; import VoiceAnalysis from "../comps/voiceanalysis"; import { sendOsc, OSC_ADDRESS, updatePrompt } from "../util/osc"; import { DebugControl, TEST_PROMPT } from "../comps/debug"; +import { useUser } from "../util/useUser"; const EmojiType={ @@ -28,6 +29,8 @@ const ChatStatus={ User: 'user', Processing: 'processing', Clear: 'clear', + End: 'end', + Playing: 'playing', } const Voice={ @@ -44,12 +47,13 @@ export function FreeFlow(){ const [chatWelcome, setChatWelcome] = useState(null); const [audioInput, setAudioInput] = useState(true); const [autoSend, setAutoSend] = useState(true); - const [userId, setUserId] = useState(); + // const [userId, setUserId] = useState(); const [summary, setSummary] = useState(null); const [voice, setVoice] = useState(Voice.ONYX); //const [speechPaused, setSpeechPaused]=useState(false); const [chatStatus, setChatStatus] = useState(ChatStatus.System); // System, User, Processing + const { userId, setUserId, getFileId } = useUser(); const refTimer=useRef(); const refAudio=useRef(); @@ -121,13 +125,15 @@ export function FreeFlow(){ refTimer.current?.restart(audio.duration*1000 || 0); }else{ if(refCurrentCue.current?.type=='chat') setChatStatus(()=>ChatStatus.System); - else setChatStatus(()=>ChatStatus.Clear); + else setChatStatus(()=>ChatStatus.Playing); } }); audio.onended = () => { - if(refCurrentCue.current?.type!='chat') onCueEnd(); - else{ + if(refCurrentCue.current?.type!='chat'){ + onCueEnd(); + setChatStatus(ChatStatus.End); + }else{ setChatStatus(ChatStatus.User); // Reset chat status to User after audio ends @@ -202,14 +208,17 @@ export function FreeFlow(){ console.log('Getting summary...'); setChatStatus(ChatStatus.Clear); // Set chat status to Processing - getSummary(history.map(el=>`${el.role}:${el.content}`).join('\n'), data).then(summary => { + getSummary(history.map(el=>`${el.role}:${el.content}`).join('\n'), data).then(summary_ => { - console.log('Summary:', summary); + console.log('Summary:', summary_); onCueEnd(); // End the current cue after getting summary - setSummary(summary); + setSummary(summary_); refContainer.current.scrollTop = refContainer.current.scrollHeight; // Scroll to bottom + // sendOsc(OSC_ADDRESS.SUMMARY, summary_?.result); + sendOsc(OSC_ADDRESS.SAVE, `${getFileId()}#${summary_?.result}`); // Save summary with file ID + }).catch(error => { console.error('Error getting summary:', error); }); @@ -481,7 +490,7 @@ export function FreeFlow(){ {/* */} - + {/*
@@ -489,9 +498,16 @@ export function FreeFlow(){
*/} - + +
+ + + UserId{userId} + FileId{getFileId()} + +
diff --git a/vite/src/util/osc.js b/vite/src/util/osc.js index 6ed8fa4..35c07b4 100644 --- a/vite/src/util/osc.js +++ b/vite/src/util/osc.js @@ -10,7 +10,7 @@ export const OSC_ADDRESS={ SCRIPT: '/script', SUMMARY: '/summary', PROMPT: '/prompt', - + SAVE: '/save', } diff --git a/vite/src/util/useUser.jsx b/vite/src/util/useUser.jsx new file mode 100644 index 0000000..7854ca9 --- /dev/null +++ b/vite/src/util/useUser.jsx @@ -0,0 +1,62 @@ +import { createContext, useState, useEffect, useContext } from "react"; +import moment from "moment"; + +const userContext=createContext(); + +const SesstionTime={ + A:["12:00", "13:30"], + B:["13:30", "15:00"], + C:["15:00", "17:30"], + D:["17:30", "19:00"], + E:["19:00", "20:30"], + F:["20:30", "22:00"] +} + + +export function UserProvider({children}) { + + const [userId, setUserId] = useState(null); + const [sessionId, setSessionId] = useState(null); + + + function getFileId(){ + if(!userId) return `test-${moment().format("YYYYMMDDmmss")}-${sessionId}`; + return `${moment().format("YYYYMMDD").substring(2)}-${sessionId}-${userId}`; + } + + + useEffect(() => { + + let symbol=''; + + for(const [key, value] of Object.entries(SesstionTime)){ + const start=moment(value[0], "HH:mm"); + const end=moment(value[1], "HH:mm"); + + if(moment().isBetween(start, end)){ + symbol=key; + break; + } + } + setSessionId(symbol); + + + }, [userId]); + + return ( + + {children} + + ); +} + + +export function useUser() { + const context = useContext(userContext); + if (!context) { + throw new Error("useUser must be used within a UserProvider"); + } + return context; +} + +export { userContext }; \ No newline at end of file