el.xwx.moe/pages/settings/preference.tsx

279 lines
9.2 KiB
TypeScript
Raw Normal View History

import SettingsLayout from "@/layouts/SettingsLayout";
import { useState, useEffect } from "react";
import SubmitButton from "@/components/SubmitButton";
import { toast } from "react-hot-toast";
import Checkbox from "@/components/Checkbox";
import useLocalSettingsStore from "@/store/localSettings";
import { useTranslation } from "next-i18next";
import getServerSideProps from "@/lib/client/getServerSideProps"; // Import getServerSideProps for server-side data fetching
import { LinksRouteTo } from "@prisma/client";
2024-07-31 13:15:50 -05:00
import { useUpdateUser, useUser } from "@/hooks/store/user";
2023-10-18 23:09:28 -05:00
export default function Appearance() {
const { t } = useTranslation();
2023-12-01 13:00:52 -06:00
const { updateSettings } = useLocalSettingsStore();
const [submitLoader, setSubmitLoader] = useState(false);
2024-08-01 17:40:08 -05:00
const { data: account } = useUser();
const updateUser = useUpdateUser();
const [user, setUser] = useState(account);
const [preventDuplicateLinks, setPreventDuplicateLinks] = useState<boolean>(
account.preventDuplicateLinks
2024-02-08 07:45:14 -06:00
);
const [archiveAsScreenshot, setArchiveAsScreenshot] = useState<boolean>(
account.archiveAsScreenshot
);
const [archiveAsPDF, setArchiveAsPDF] = useState<boolean>(
account.archiveAsPDF
);
2024-06-27 20:58:07 -05:00
const [archiveAsMonolith, setArchiveAsMonolith] = useState<boolean>(
account.archiveAsMonolith
2024-02-08 07:45:14 -06:00
);
const [archiveAsWaybackMachine, setArchiveAsWaybackMachine] =
useState<boolean>(account.archiveAsWaybackMachine);
const [linksRouteTo, setLinksRouteTo] = useState(account.linksRouteTo);
useEffect(() => {
setUser({
...account,
archiveAsScreenshot,
2024-06-27 20:58:07 -05:00
archiveAsMonolith,
archiveAsPDF,
archiveAsWaybackMachine,
2024-02-08 07:45:14 -06:00
linksRouteTo,
2024-03-05 08:03:04 -06:00
preventDuplicateLinks,
});
2024-02-08 07:45:14 -06:00
}, [
account,
archiveAsScreenshot,
2024-06-27 20:58:07 -05:00
archiveAsMonolith,
2024-02-08 07:45:14 -06:00
archiveAsPDF,
archiveAsWaybackMachine,
linksRouteTo,
2024-03-05 08:03:04 -06:00
preventDuplicateLinks,
2024-02-08 07:45:14 -06:00
]);
function objectIsEmpty(obj: object) {
return Object.keys(obj).length === 0;
}
useEffect(() => {
if (!objectIsEmpty(account)) {
setArchiveAsScreenshot(account.archiveAsScreenshot);
2024-06-27 20:58:07 -05:00
setArchiveAsMonolith(account.archiveAsMonolith);
setArchiveAsPDF(account.archiveAsPDF);
setArchiveAsWaybackMachine(account.archiveAsWaybackMachine);
setLinksRouteTo(account.linksRouteTo);
2024-03-05 08:03:04 -06:00
setPreventDuplicateLinks(account.preventDuplicateLinks);
}
}, [account]);
const submit = async () => {
setSubmitLoader(true);
2024-08-14 14:22:28 -05:00
const load = toast.loading(t("applying_settings"));
await updateUser.mutateAsync(
{ ...user },
{
onSettled: (data, error) => {
2024-10-26 09:58:27 -05:00
setSubmitLoader(false);
2024-08-14 14:22:28 -05:00
toast.dismiss(load);
if (error) {
toast.error(error.message);
} else {
toast.success(t("settings_applied"));
}
},
}
);
};
return (
<SettingsLayout>
<p className="capitalize text-3xl font-thin inline">{t("preference")}</p>
2023-11-20 11:48:41 -06:00
<div className="divider my-3"></div>
2023-11-20 11:48:41 -06:00
<div className="flex flex-col gap-5">
<div>
<p className="mb-3">{t("select_theme")}</p>
<div className="flex gap-3 w-full">
<div
2024-02-08 07:45:14 -06:00
className={`w-full text-center outline-solid outline-neutral-content outline dark:outline-neutral-700 h-36 duration-100 rounded-md flex items-center justify-center cursor-pointer select-none bg-black ${
localStorage.getItem("theme") === "dark"
? "dark:outline-primary text-primary"
: "text-white"
}`}
2023-11-24 06:50:16 -06:00
onClick={() => updateSettings({ theme: "dark" })}
>
2023-12-17 22:32:33 -06:00
<i className="bi-moon-fill text-6xl"></i>
<p className="ml-2 text-2xl">{t("dark")}</p>
</div>
<div
className={`w-full text-center outline-solid outline-neutral-content outline dark:outline-neutral-700 h-36 duration-100 rounded-md flex items-center justify-center cursor-pointer select-none bg-content ${
2024-02-08 07:45:14 -06:00
localStorage.getItem("theme") === "light"
? "outline-primary text-primary"
: "text-black"
}`}
2023-11-24 06:50:16 -06:00
onClick={() => updateSettings({ theme: "light" })}
>
2023-12-17 22:32:33 -06:00
<i className="bi-sun-fill text-6xl"></i>
<p className="ml-2 text-2xl">{t("light")}</p>
</div>
</div>
2023-10-18 16:50:55 -05:00
</div>
<div>
<p className="capitalize text-3xl font-thin inline">
{t("archive_settings")}
</p>
<div className="divider my-3"></div>
<p>{t("formats_to_archive")}</p>
<div className="p-3">
<Checkbox
label={t("screenshot")}
state={archiveAsScreenshot}
onClick={() => setArchiveAsScreenshot(!archiveAsScreenshot)}
/>
2024-03-15 13:41:41 -05:00
<Checkbox
2024-06-27 20:58:07 -05:00
label={t("webpage")}
state={archiveAsMonolith}
onClick={() => setArchiveAsMonolith(!archiveAsMonolith)}
2024-03-15 13:41:41 -05:00
/>
<Checkbox
label={t("pdf")}
state={archiveAsPDF}
onClick={() => setArchiveAsPDF(!archiveAsPDF)}
/>
<Checkbox
label={t("archive_org_snapshot")}
state={archiveAsWaybackMachine}
onClick={() =>
setArchiveAsWaybackMachine(!archiveAsWaybackMachine)
}
/>
</div>
</div>
<div>
<p className="capitalize text-3xl font-thin inline">
{t("link_settings")}
</p>
<div className="divider my-3"></div>
2024-03-04 23:24:30 -06:00
<div className="mb-3">
<Checkbox
label={t("prevent_duplicate_links")}
2024-03-05 08:03:04 -06:00
state={preventDuplicateLinks}
onClick={() => setPreventDuplicateLinks(!preventDuplicateLinks)}
2024-03-04 23:24:30 -06:00
/>
</div>
<p>{t("clicking_on_links_should")}</p>
<div className="p-3">
2024-02-08 07:45:14 -06:00
<label
2024-02-08 07:48:22 -06:00
className="label cursor-pointer flex gap-2 justify-start w-fit"
2024-02-08 07:45:14 -06:00
tabIndex={0}
role="button"
>
<input
type="radio"
name="link-preference-radio"
className="radio checked:bg-primary"
value="Original"
checked={linksRouteTo === LinksRouteTo.ORIGINAL}
onChange={() => setLinksRouteTo(LinksRouteTo.ORIGINAL)}
/>
<span className="label-text">{t("open_original_content")}</span>
2024-02-08 07:45:14 -06:00
</label>
<label
2024-02-08 07:48:22 -06:00
className="label cursor-pointer flex gap-2 justify-start w-fit"
2024-02-08 07:45:14 -06:00
tabIndex={0}
role="button"
>
<input
type="radio"
name="link-preference-radio"
className="radio checked:bg-primary"
value="PDF"
checked={linksRouteTo === LinksRouteTo.PDF}
onChange={() => setLinksRouteTo(LinksRouteTo.PDF)}
/>
<span className="label-text">{t("open_pdf_if_available")}</span>
2024-02-08 07:45:14 -06:00
</label>
<label
2024-02-08 07:48:22 -06:00
className="label cursor-pointer flex gap-2 justify-start w-fit"
2024-02-08 07:45:14 -06:00
tabIndex={0}
role="button"
>
<input
type="radio"
name="link-preference-radio"
className="radio checked:bg-primary"
value="Readable"
checked={linksRouteTo === LinksRouteTo.READABLE}
onChange={() => setLinksRouteTo(LinksRouteTo.READABLE)}
/>
<span className="label-text">
{t("open_readable_if_available")}
</span>
2024-02-08 07:45:14 -06:00
</label>
<label
className="label cursor-pointer flex gap-2 justify-start w-fit"
tabIndex={0}
role="button"
>
<input
type="radio"
name="link-preference-radio"
className="radio checked:bg-primary"
2024-06-27 20:58:07 -05:00
value="Monolith"
checked={linksRouteTo === LinksRouteTo.MONOLITH}
onChange={() => setLinksRouteTo(LinksRouteTo.MONOLITH)}
/>
2024-06-27 20:58:07 -05:00
<span className="label-text">
{t("open_webpage_if_available")}
</span>
2024-03-15 13:41:41 -05:00
</label>
2024-02-08 07:45:14 -06:00
<label
2024-02-08 07:48:22 -06:00
className="label cursor-pointer flex gap-2 justify-start w-fit"
2024-02-08 07:45:14 -06:00
tabIndex={0}
role="button"
>
<input
type="radio"
name="link-preference-radio"
className="radio checked:bg-primary"
value="Screenshot"
checked={linksRouteTo === LinksRouteTo.SCREENSHOT}
onChange={() => setLinksRouteTo(LinksRouteTo.SCREENSHOT)}
/>
<span className="label-text">
{t("open_screenshot_if_available")}
</span>
2024-02-08 07:45:14 -06:00
</label>
</div>
</div>
<SubmitButton
onClick={submit}
loading={submitLoader}
label={t("save_changes")}
className="mt-2 w-full sm:w-fit"
/>
2023-10-18 16:50:55 -05:00
</div>
</SettingsLayout>
);
}
export { getServerSideProps };