Skip to content

Commit 4a3d530

Browse files
committed
added: header button to open/close settings on mobile
1 parent 05c0386 commit 4a3d530

File tree

3 files changed

+94
-36
lines changed

3 files changed

+94
-36
lines changed

src/components/Header.jsx

+19-7
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ import {useColorScheme} from '@mui/joy/styles';
1919
import Menu from '@mui/icons-material/Menu';
2020
import Input from '@mui/joy/Input';
2121
import Search from '@mui/icons-material/Search';
22+
import SettingsIcon from '@mui/icons-material/Settings';
2223

23-
const Header = () => {
24+
const Header = ({setOpenSettings}) => {
2425
const {mode} = useColorScheme();
2526
const [logoHeader, setLogoHeader] = useState(mode)
2627
const [menuNav, setMenuNav] = useState(false)
@@ -33,6 +34,10 @@ const Header = () => {
3334
setMenuNav(true)
3435
}
3536

37+
const handleOpenSettings = () => {
38+
setOpenSettings(true)
39+
}
40+
3641
const handleCloseMenu = () => {
3742
setMenuNav(false)
3843
}
@@ -118,10 +123,13 @@ const Header = () => {
118123
/>
119124
</Stack>
120125
<ModeToggle/>
126+
<IconButton variant="outlined" color="neutral" onClick={handleOpenSettings} sx={{display: {xs: "flex", md: "none"}}}>
127+
<SettingsIcon/>
128+
</IconButton>
121129
<IconButton variant="outlined" color="neutral" onClick={openMenu} sx={{display: {xs: "flex", md: "none"}}}>
122130
<Menu/>
123131
</IconButton>
124-
<Drawer open={menuNav} onClose={() => handleCloseMenu(false)}>
132+
<Drawer open={menuNav} onClose={handleCloseMenu}>
125133
<Box
126134
sx={{
127135
display: 'flex',
@@ -137,7 +145,7 @@ const Header = () => {
137145
htmlFor="close-icon"
138146
fontSize="sm"
139147
fontWeight="lg"
140-
sx={{cursor: 'pointer'}}
148+
sx={{cursor: 'pointer', pb: 0.3}}
141149
>
142150
Close
143151
</Typography>
@@ -179,10 +187,14 @@ const Header = () => {
179187
/>
180188
<List spacing={2}
181189
sx={{display: {xs: "flex", md: "none"}}}>
182-
<RouterLink to="/NeuraChatAi/"><ListItemButton
183-
sx={{justifyContent: "center"}}><Typography>Homepage</Typography></ListItemButton></RouterLink>
184-
<RouterLink to="/NeuraChatAi/about"><ListItemButton
185-
sx={{justifyContent: "center"}}><Typography>About</Typography></ListItemButton></RouterLink>
190+
<RouterLink to="/NeuraChatAi/">
191+
<ListItemButton sx={{justifyContent: "center"}}><Typography>Homepage</Typography>
192+
</ListItemButton>
193+
</RouterLink>
194+
<RouterLink to="/NeuraChatAi/about">
195+
<ListItemButton sx={{justifyContent: "center"}}><Typography>About</Typography>
196+
</ListItemButton>
197+
</RouterLink>
186198
</List>
187199
</Drawer>
188200
</Sheet>

src/components/Sidebar.jsx

+72-26
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@ import {
1010
Tooltip,
1111
IconButton,
1212
selectClasses,
13-
Button
13+
Button,
1414
} from "@mui/joy";
1515
import {useEffect, useState, useMemo} from "react";
1616
import {setOpenAiParams} from "../lib/OpenAi.jsx";
1717
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
1818
import KeyboardArrowDown from '@mui/icons-material/KeyboardArrowDown'
1919
import {SnackBar} from "./SnackBar.jsx";
20+
import CloseIcon from '@mui/icons-material/Close';
2021

21-
const Sidebar = ({ openSettings }) => {
22+
const Sidebar = ({openSettings, setOpenSettings}) => {
2223
const [model, setModel] = useState(localStorage.getItem('model') || 'gpt-3.5-turbo')
2324
const [temperature, setTemperature] = useState(parseFloat(localStorage.getItem('temperature')) || 0.7)
2425
const [frequencyPenalty, setFrequencyPenalty] = useState(parseFloat(localStorage.getItem('frequencyPenalty')) || 0)
@@ -48,7 +49,7 @@ const Sidebar = ({ openSettings }) => {
4849
top_p: topP,
4950
}), [model, temperature, maxTokens, frequencyPenalty, topP]);
5051

51-
useEffect( () => {
52+
useEffect(() => {
5253
if (initialLoad) {
5354
const timeout = setTimeout(() => {
5455
setOpenAiParams(params);
@@ -70,30 +71,70 @@ const Sidebar = ({ openSettings }) => {
7071
setInitialLoad(false);
7172
}
7273

73-
useEffect(()=>{
74-
console.log(openSettings)
75-
}, [openSettings])
74+
const handleCloseSettings = () => {
75+
setOpenSettings(false)
76+
}
7677

77-
return <Sheet sx={{display: {xs: "none", md: "flow"}, borderRight: '1px solid', borderColor: 'divider', overflowY: 'scroll', width: "25rem", p: 3}}>
78-
<Divider sx={{mb: 2}}><Chip variant="outlined">Settings</Chip></Divider>
79-
<Box sx={{my: 2, mb: 3}}>
78+
return <Sheet sx={{
79+
...(openSettings ? {
80+
display: {xs: "flow", md: "none"},
81+
position: "fixed",
82+
width: "100dvw",
83+
zIndex: 3
84+
} : {display: {xs: "none", md: "flow"}, position: "initial", width: "25rem"}),
85+
height: "calc(100dvh - var(--Header-height))",
86+
borderRight: '1px solid',
87+
borderColor: 'divider',
88+
overflowY: 'scroll',
89+
p: 3
90+
}}>
91+
<Box sx={{mb: 1, display: {xs: "auto", md: "none"}}}>
92+
<Box display="flex" flexDirection="row" justifyContent="space-between" alignItems="center" sx={{mb: 2}}>
93+
<Typography fontWeight="xl" fontSize="lg">Settings</Typography>
94+
<Button variant="outlined" onClick={handleCloseSettings}
95+
sx={{
96+
display: 'flex',
97+
alignItems: 'center',
98+
gap: 0.5,
99+
ml: 'auto',
100+
}}
101+
>
102+
<Typography
103+
component="label"
104+
htmlFor="close-icon"
105+
fontSize="sm"
106+
fontWeight="lg"
107+
sx={{cursor: 'pointer', pb: 0.3}}
108+
>
109+
Close
110+
</Typography>
111+
<CloseIcon id="close-icon" sx={{position: 'initial'}}/>
112+
</Button>
113+
</Box>
114+
<Divider/>
115+
</Box>
116+
<Divider sx={{mb: 2, display: {xs: "none", md: "flex"}}}><Chip variant="outlined">Settings</Chip></Divider>
117+
<Box sx={{mb: 3}}>
80118
<Box sx={{mb: 1}} display="flex" justifyContent="space-between" alignItems="center">
81-
<Typography component="div" level="title-sm" >Model:</Typography>
82-
<Tooltip title={<div>Choose the AI language model for your chat. <br/>Different models have varying capabilities and performance.</div>}
83-
size="sm" placement="top" sx={{ whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
119+
<Typography component="div" level="title-sm">Model:</Typography>
120+
<Tooltip title={<div>Choose the AI language model for your chat. <br/>Different models have varying
121+
capabilities and performance.</div>}
122+
size="sm" placement="top" sx={{whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
84123
<IconButton size="sm" sx={{borderRadius: 40}}>
85124
<InfoOutlinedIcon/>
86125
</IconButton>
87126
</Tooltip>
88127
</Box>
89-
<Select value={model} defaultValue={model} size="sm" onChange={(event, value) => setModel(value)} indicator={<KeyboardArrowDown />}
128+
<Select value={model} defaultValue={model} size="sm" onChange={(event, value) => setModel(value)}
129+
indicator={<KeyboardArrowDown/>}
90130
sx={{
91-
[`& .${selectClasses.indicator}`]: {
92-
transition: '0.2s',
93-
[`&.${selectClasses.expanded}`]: {
94-
transform: 'rotate(-180deg)',
95-
},
96-
}}}>
131+
[`& .${selectClasses.indicator}`]: {
132+
transition: '0.2s',
133+
[`&.${selectClasses.expanded}`]: {
134+
transform: 'rotate(-180deg)',
135+
},
136+
}
137+
}}>
97138
<Option value="gpt-3.5-turbo">gpt-3.5-turbo</Option>
98139
<Option value="gpt-3.5-turbo-0301">gpt-3.5-turbo-0301</Option>
99140
<Option value="gpt-3.5-turbo-0613">gpt-3.5-turbo-0613</Option>
@@ -110,11 +151,12 @@ const Sidebar = ({ openSettings }) => {
110151

111152
<Box sx={{my: 2}}>
112153
<Box display="flex" justifyContent="space-between" alignItems="center">
113-
<Typography component="div" level="title-sm">Temperature: <Chip variant="soft">{temperature}</Chip></Typography>
154+
<Typography component="div" level="title-sm">Temperature: <Chip
155+
variant="soft">{temperature}</Chip></Typography>
114156
<Tooltip title={<div>Control the randomness of AI responses. Higher values (e.g., 0.8) make output
115157
more<br/> diverse, while lower values (e.g., 0.2) yield focused and deterministic replies.<br/>
116158
Adjust alongside top-p, but not both. (Default: 1)</div>}
117-
size="sm" placement="top" sx={{ whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
159+
size="sm" placement="top" sx={{whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
118160
<IconButton size="sm" sx={{borderRadius: 40}}>
119161
<InfoOutlinedIcon/>
120162
</IconButton>
@@ -139,11 +181,12 @@ const Sidebar = ({ openSettings }) => {
139181

140182
<Box sx={{my: 2}}>
141183
<Box display="flex" justifyContent="space-between" alignItems="center">
142-
<Typography component="div" level="title-sm">Frequency Penalty: <Chip variant="soft">{frequencyPenalty}</Chip></Typography>
184+
<Typography component="div" level="title-sm">Frequency Penalty: <Chip
185+
variant="soft">{frequencyPenalty}</Chip></Typography>
143186
<Tooltip title={<div>Influence tendency to introduce new topics.<br/> Positive values (0 to 2.0)
144187
penalize new tokens based on their presence in the text,<br/> encouraging the AI to explore and
145188
discuss fresh ideas. (Default: 0)</div>}
146-
size="sm" placement="top" sx={{ whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
189+
size="sm" placement="top" sx={{whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
147190
<IconButton size="sm" sx={{borderRadius: 40}}>
148191
<InfoOutlinedIcon/>
149192
</IconButton>
@@ -168,11 +211,12 @@ const Sidebar = ({ openSettings }) => {
168211

169212
<Box sx={{my: 2}}>
170213
<Box display="flex" justifyContent="space-between" alignItems="center">
171-
<Typography component="div" level="title-sm">Max tokens: <Chip variant="soft">{maxTokens}</Chip></Typography>
214+
<Typography component="div" level="title-sm">Max tokens: <Chip
215+
variant="soft">{maxTokens}</Chip></Typography>
172216
<Tooltip title={<div>Limit the total tokens generated in chat completion.<br/> The sum of input and
173217
output tokens is restricted by the context length.<br/> Adjust this to manage the length of
174218
your AI-generated responses.</div>}
175-
size="sm" placement="top" sx={{ whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
219+
size="sm" placement="top" sx={{whiteSpace: 'pre-line', textAlign: "center", p: 1}}>
176220
<IconButton size="sm" sx={{borderRadius: 40}}>
177221
<InfoOutlinedIcon/>
178222
</IconButton>
@@ -226,7 +270,9 @@ const Sidebar = ({ openSettings }) => {
226270
</Box>
227271

228272
<Box sx={{my: 2}}>
229-
<Button onClick={() => {handleReset()}} color="primary" variant="soft" sx={{width: "100%"}}> Reset settings </Button>
273+
<Button onClick={() => {
274+
handleReset()
275+
}} color="primary" variant="soft" sx={{width: "100%"}}> Reset settings </Button>
230276
</Box>
231277
<SnackBar message={messageSnackbar} closeSnackBar={setMessageSnackbar}/>
232278
</Sheet>

src/pages/Home.jsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import Header from "../components/Header.jsx";
55
import {useState} from "react";
66

77
export function Home() {
8-
const [openSettingss] = useState();
8+
const [openSettings, setOpenSettings] = useState(false);
99

1010
return (
1111
<>
12-
<Header openSettings={openSettingss} />
12+
<Header setOpenSettings={setOpenSettings} />
1313
<Box sx={{display: 'flex', height: 'calc(100dvh - var(--Header-height))', justifyContent: 'space-between'}}>
14-
<Sidebar openSettings={openSettingss}/>
14+
<Sidebar openSettings={openSettings} setOpenSettings={setOpenSettings}/>
1515
<Container>
1616
<Chat />
1717
</Container>

0 commit comments

Comments
 (0)