Skip to content

Commit 0116fc0

Browse files
committed
feat: Improved settings page
- Improved settings page - Added indicator component - Disable refetchOnWindowFocus
1 parent 9732c15 commit 0116fc0

File tree

4 files changed

+71
-9
lines changed

4 files changed

+71
-9
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import clsx from "clsx";
2+
3+
type PropTypes = {
4+
variant: "primary" | "success" | "danger";
5+
};
6+
7+
const Indicator = ({ variant }: PropTypes) => {
8+
return (
9+
<span className="relative flex h-3 w-3">
10+
<span
11+
className={clsx("animate-ping absolute inline-flex h-full w-full rounded-full", {
12+
"bg-primary-500/75 dark:bg-primary-700/75": variant === "primary",
13+
"bg-green-500/75 dark:bg-green-700/75": variant === "success",
14+
"bg-red-500/75 dark:bg-red-700/75": variant === "danger",
15+
})}
16+
></span>
17+
<span
18+
className={clsx("relative inline-flex rounded-full h-3 w-3", {
19+
"bg-primary-600 dark:bg-primary-800": variant === "primary",
20+
"bg-green-600 dark:bg-green-800": variant === "success",
21+
"bg-red-600 dark:bg-red-800": variant === "danger",
22+
})}
23+
></span>
24+
</span>
25+
);
26+
};
27+
28+
export default Indicator;

src/components/general/Toast.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const Toast = ({ type, message, allowClose = true, onClose }: PropTypes) => {
1313
<div className="flex items-center w-full p-1 text-gray-700 bg-gray-200 rounded-lg shadow dark:text-gray-300 dark:bg-gray-600" role="alert">
1414
<div
1515
className={clsx("inline-flex items-center justify-center flex-shrink-0 w-8 h-8", {
16-
"text-green-500 bg-green-100 rounded-lg dark:bg-green-800 dark:text-green-200": type === "success",
17-
"text-red-500 bg-red-100 rounded-lg dark:bg-red-800 dark:text-red-200": type === "error",
16+
"text-green-700 bg-green-100 rounded-lg dark:bg-green-800 dark:text-green-200": type === "success",
17+
"text-red-700 bg-red-100 rounded-lg dark:bg-red-800 dark:text-red-200": type === "error",
1818
})}
1919
>
2020
{type === "success" && (

src/main.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ import "react-tooltip/dist/react-tooltip.css";
66
import App from "./App.tsx";
77
import "./index.css";
88

9-
const queryClient = new QueryClient();
9+
const queryClient = new QueryClient({
10+
defaultOptions: {
11+
queries: {
12+
refetchOnWindowFocus: false,
13+
},
14+
},
15+
});
1016

1117
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
1218
<React.StrictMode>

src/pages/SettingsPage.tsx

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Field, Form, Formik, FormikProps } from "formik";
44
import { useEffect, useRef, useState } from "react";
55
import * as Yup from "yup";
66
import CheckBox from "../components/general/CheckBox";
7+
import Indicator from "../components/general/Indicator";
78
import InputField from "../components/general/InputField";
89
import Toast from "../components/general/Toast";
910
import useMyAccount from "../hooks/useMyAccount";
@@ -51,11 +52,36 @@ const SettingsPage = () => {
5152
<div className="flex flex-col gap-y-2">
5253
<Field type="text" name="redmineURL" title="Redmine URL" placeholder="Redmine URL" required as={InputField} error={touched.redmineURL && errors.redmineURL} />
5354
<Field type="password" name="redmineApiKey" title="Redmine API-Key" placeholder="Redmine API-Key" required as={InputField} error={touched.redmineApiKey && errors.redmineApiKey} />
54-
{myAccount.data && (
55-
<p>
56-
User: {myAccount.data.firstname} {myAccount.data.lastname} ({myAccount.data.login})
57-
</p>
58-
)}
55+
56+
<div className="flex items-center gap-x-2">
57+
{myAccount.isLoading && (
58+
<>
59+
<Indicator variant="primary" />
60+
<p>Connecting...</p>
61+
</>
62+
)}
63+
{myAccount.isError && (
64+
<>
65+
<Indicator variant="danger" />
66+
<p>Connection failed</p>
67+
</>
68+
)}
69+
{!myAccount.isLoading && !myAccount.isError && myAccount.data && (
70+
<>
71+
<Indicator variant="success" />
72+
<div>
73+
<p>Connection successful!</p>
74+
<p>
75+
Hello{" "}
76+
<strong>
77+
{myAccount.data.firstname} {myAccount.data.lastname}
78+
</strong>{" "}
79+
({myAccount.data.login})
80+
</p>
81+
</div>
82+
</>
83+
)}
84+
</div>
5985
</div>
6086
</fieldset>
6187
<fieldset className="p-1.5 rounded-lg border border-gray-300 dark:border-gray-600">
@@ -83,7 +109,9 @@ const SettingsPage = () => {
83109
)}
84110
</Formik>
85111
<div className="w-full flex flex-col items-center p-2 mt-3">
86-
<g>{chrome.runtime.getManifest().name}</g>
112+
<a href="https://chrome.google.com/webstore/detail/redmine-time-tracking/ldcanhhkffokndenejhafhlkapflgcjg" target="_blank" tabIndex={-1} className="hover:underline">
113+
{chrome.runtime.getManifest().name}
114+
</a>
87115
<p>Version: {chrome.runtime.getManifest().version}</p>
88116
</div>
89117
{saved && <Toast type="success" message="Settings saved!" onClose={() => setSaved(false)} />}

0 commit comments

Comments
 (0)