Skip to content

Add settings component and extra settings #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,4 @@
"eslint-plugin-prettier": "^4.0.0",
"prettier": "^2.6.2"
}
}
}
4 changes: 2 additions & 2 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import React from "react";

import "./styles/index.scss";
import { ConnectionSettings } from "./components/ConnectionSettings";
import { Prompt } from "./components/Prompt";
import { Conversation } from "./components/Conversation";
import { UpdateMessage } from "./components/updateMessage";
import { NavBar } from "./components/Navbar";
import { Settings } from "./components/Settings";

function App() {
return (
<div className="App">
<NavBar />
<UpdateMessage />
<ConnectionSettings />
<Settings />
<Conversation />
<Prompt />
</div>
Expand Down
61 changes: 0 additions & 61 deletions src/components/ConnectionSettings.tsx

This file was deleted.

13 changes: 7 additions & 6 deletions src/components/Prompt.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ export const Prompt = (): React.ReactElement => {
focus();
};
}, []);
const { connected, showSettings } = UIStore.useState((s) => ({
const { connected, showSettings, username } = UIStore.useState((s) => ({
connected: s.connection.connected,
showSettings: s.clientSettings.showSettings,
username: s.username,
}));
const [input, setInput] = useState<inputState>({
text: "",
Expand Down Expand Up @@ -49,7 +50,7 @@ export const Prompt = (): React.ReactElement => {
UIStore.update((s) => {
s.conversation.push({
text: input.text,
user: "user",
user: username,
timestamp: new Date(),
image: imageUrl,
});
Expand All @@ -59,7 +60,7 @@ export const Prompt = (): React.ReactElement => {
UIStore.update((s) => {
s.conversation.push({
text: input.text,
user: "user",
user: username,
timestamp: new Date(),
});
});
Expand Down Expand Up @@ -101,7 +102,7 @@ export const Prompt = (): React.ReactElement => {
};

return (
<div className="prompt">
<div className={showSettings ? "prompt inactive" : "prompt active"}>
<input
type="text"
ref={promptRef}
Expand All @@ -116,11 +117,11 @@ export const Prompt = (): React.ReactElement => {
<span
id="status-indicator"
onClick={toggleConnectionSettings}
className={connected ? "active" : "inactive"}
className={connected ? "show" : "hide"}
>
<span
id="status-indicator-tooltip"
className={input.showTooltip ? "active" : "inactive"}
className={input.showTooltip ? "show" : "inactive"}
>
{connected ? "connected" : "disconnected"}
</span>
Expand Down
67 changes: 67 additions & 0 deletions src/components/Settings/AppearanceSettings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import React from "react";
import { UIStore } from "../../store";
import PaletteSwatchOutlineIcon from "../../icons/paletteOutlineIcon";

export const AppearanceSettings = (): React.ReactElement => {
const { darkTheme } = UIStore.useState((s) => ({
darkTheme: s.appearance.darkTheme,
}));
const toggleDarkTheme = () => {
UIStore.update((s) => {
s.appearance.darkTheme = !darkTheme;
});
};

const updateAccentColor = (
e: React.MouseEvent<HTMLButtonElement, MouseEvent>
) => {
const color = e.currentTarget.value;
switch (color) {
case "green":
UIStore.update((s) => {
s.appearance.accentColor = "green";
});
break;
case "blue":
UIStore.update((s) => {
s.appearance.accentColor = "blue";
});
break;
}
};
return (
<div>
<h2 className="flex align-items-center">
<PaletteSwatchOutlineIcon className="settings-icon" />
{" Appearance Settings"}
</h2>
<div className="flex flex-column padding-left">
<div className="flex align-items-center">
<p className="padding-right settings-text">Dark Theme</p>
<label className="switch">
<input
type="checkbox"
role="triggerDarkTheme"
checked={darkTheme}
onChange={toggleDarkTheme}
/>
<span className="slider round" />
</label>
</div>
<div className="flex align-items-center">
<p className="padding-right settings-text">Accent Color</p>
<button
onClick={updateAccentColor}
value="blue"
className="accentButton blue padding-left"
/>
<button
onClick={updateAccentColor}
value="green"
className="accentButton green padding-right"
/>
</div>
</div>
</div>
);
};
72 changes: 72 additions & 0 deletions src/components/Settings/ConnectionSettings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import React from "react";
import { UIStore } from "../../store";
import BxLinkIcon from "../../icons/connectIcon";

export const ConnectionSettings = (): React.ReactElement => {
const { host, port, sslEnabled } = UIStore.useState((s) => ({
host: s.clientSettings.host,
port: s.clientSettings.port,
sslEnabled: s.clientSettings.sslEnabled,
}));

const toggleSSL = () => {
UIStore.update((s) => {
s.clientSettings.sslEnabled = !sslEnabled;
});
};

const updatePort = (e: React.FormEvent<HTMLInputElement>) => {
UIStore.update((s) => {
s.clientSettings.port = e.currentTarget.value;
});
};

const updateHost = (e: React.FormEvent<HTMLInputElement>) => {
UIStore.update((s) => {
s.clientSettings.host = e.currentTarget.value;
});
};

return (
<div id="connection-settings">
<h2 className="flex align-items-center">
<BxLinkIcon className="settings-icon" />
{" Connection Settings"}
</h2>
<div className="flex flex-column padding-left">
<div className="flex align-items-center">
<p className="padding-right settings-text">SSL</p>
<label className="switch">
<input
type="checkbox"
role="toggleSSL"
checked={sslEnabled}
onChange={toggleSSL}
/>
<span className="slider round" />
</label>
</div>
<div className="flex align-items-center">
<p className="padding-right settings-text">Host</p>
<input
type="text"
id="host"
placeholder={host}
defaultValue={host}
onChange={updateHost}
/>
</div>
<div className="flex align-items-center">
<p className="padding-right settings-text">Port</p>
<input
type="text"
id="port"
placeholder={port}
defaultValue={port}
onChange={updatePort}
/>
</div>
</div>
</div>
);
};
36 changes: 36 additions & 0 deletions src/components/Settings/SecuritySettings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import React from "react";
import { UIStore } from "../../store";
import LockIcon from "../../icons/lockOutlineIcon";

export const SecuritySettings = (): React.ReactElement => {
const { token } = UIStore.useState((s) => ({
token: s.clientSettings.token,
}));

const updateWebsocketToken = (e: React.FormEvent<HTMLInputElement>) => {
UIStore.update((s) => {
s.clientSettings.token = e.currentTarget.value;
});
};

return (
<div id="connection-settings">
<h2 className="flex align-items-center">
<LockIcon className="settings-icon" />
{" Security Settings"}
</h2>
<div className="flex flex-column padding-left">
<div className="flex align-items-center">
<p className="padding-right settings-text">Token</p>
<input
type="text"
id="token"
placeholder="websocket token"
defaultValue={token}
onChange={updateWebsocketToken}
/>
</div>
</div>
</div>
);
};
36 changes: 36 additions & 0 deletions src/components/Settings/UserSettings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import React from "react";
import { UIStore } from "../../store";
import PersonIcon from "../../icons/personOutlineIcon";

export const UserSettings = (): React.ReactElement => {
const { username } = UIStore.useState((s) => ({
username: s.username,
}));

const updateUsername = (e: React.FormEvent<HTMLInputElement>) => {
UIStore.update((s) => {
s.username = e.currentTarget.value;
});
};

return (
<div>
<h2 className="flex align-items-center">
<PersonIcon className="settings-icon" />
{" User Settings"}
</h2>
<div className="flex flex-column padding-left">
<div className="flex align-items-center">
<p className="padding-right settings-text">Username</p>
<input
type="text"
id="username"
placeholder={username}
defaultValue={username}
onChange={updateUsername}
/>
</div>
</div>
</div>
);
};
19 changes: 19 additions & 0 deletions src/components/Settings/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { UIStore } from "../../store";
import { ConnectionSettings } from "./ConnectionSettings";
import { SecuritySettings } from "./SecuritySettings";
import { UserSettings } from "./UserSettings";
import { AppearanceSettings } from "./AppearanceSettings";

export const Settings = (): React.ReactElement => {
const { showSettings } = UIStore.useState((s) => ({
showSettings: s.clientSettings.showSettings,
}));
return (
<div id="settings" className={showSettings ? "active" : "inactive"}>
<UserSettings />
<ConnectionSettings />
<SecuritySettings />
<AppearanceSettings />
</div>
);
};
Loading