/*
Copyright (C) 2023-2026 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { PlaygroundChat } from './components/chat/playground-chat'
import { PlaygroundInput } from './components/input/playground-input'
import {
useChatHandler,
usePlaygroundConversation,
usePlaygroundOptions,
usePlaygroundState,
} from './hooks'
export function Playground() {
const {
config,
parameterEnabled,
messages,
isLoadingMessages,
models,
groups,
updateMessages,
setModels,
setGroups,
updateConfig,
updateParameterEnabled,
clearMessages,
} = usePlaygroundState()
const { sendChat, stopGeneration, isGenerating } = useChatHandler({
config,
parameterEnabled,
onMessageUpdate: updateMessages,
})
const {
editingMessageKey,
handleSendMessage,
handleRegenerateMessage,
handleEditMessage,
handleEditOpenChange,
applyEdit,
handleDeleteMessage,
} = usePlaygroundConversation({
messages,
updateMessages,
sendChat,
})
const handleClearMessages = () => {
handleEditOpenChange(false)
clearMessages()
}
const { isLoadingModels } = usePlaygroundOptions({
currentGroup: config.group,
currentModel: config.model,
setGroups,
setModels,
updateConfig,
})
return (
{/* Full-width scroll container: scrolling works even over side whitespace */}
applyEdit(newContent, false)}
onSaveEditAndSubmit={(newContent) => applyEdit(newContent, true)}
/>
{/* Input area: center content and constrain to the same container width */}
updateConfig('group', value)}
onConfigChange={updateConfig}
onClearMessages={handleClearMessages}
onModelChange={(value) => updateConfig('model', value)}
onParameterEnabledChange={updateParameterEnabled}
onStop={stopGeneration}
onSubmit={handleSendMessage}
parameterEnabled={parameterEnabled}
hasMessages={messages.length > 0}
/>
)
}