import { Button, Paper, Checkbox, TextInput, Alert, Container } from '@mantine/core'; import { ActionArgs, json, LoaderArgs, MetaFunction, redirect } from '@remix-run/node'; import { Form, useCatch, useLoaderData } from '@remix-run/react'; import { requireAdminUserId } from '~/session.server'; import { getSettings, updateSetting } from '~/models/settings.server'; import { Settings } from '~/models/settings.server'; import { isSignupAllowed } from '~/config.server'; import { AlertTriangle } from 'react-feather'; export const meta: MetaFunction = () => { return { title: 'Settings | WorkTimer', description: 'Manage your WorkTimer instance. You must be logged in to do this.' }; }; export async function loader({ request }: LoaderArgs) { const userId = await requireAdminUserId(request); if (!userId) return redirect('/login'); const settings = await getSettings(); if (!settings || !settings.find((s) => s.id === 'ALLOW_USER_SIGNUP')) { return json({ settings: [ ...((settings || []).filter((s) => s.id !== 'ALLOW_USER_SIGNUP') || []), { id: 'ALLOW_USER_SIGNUP', value: (await isSignupAllowed()) ? 'true' : 'false' } ] }); } return json({ settings }); } export async function action({ request }: ActionArgs) { await requireAdminUserId(request); const formData = await request.formData(); const id = (formData.get('id') || undefined) as string | undefined; const value = (formData.get('value') || undefined) as | string | boolean | undefined; if (!id) { throw new Response('Missing setting id', { status: 422 }); } let parsedValue; if (value === 'true' || value === 'on' || value === true) { parsedValue = 'true'; } else if (value === 'false' || value === 'off' || value === false) { parsedValue = 'false'; } else if (typeof value === 'string') { parsedValue = value; } else { parsedValue = 'false'; } await updateSetting({ id, value: parsedValue }); return redirect('/settings'); } export default function Settings() { const data = useLoaderData(); return (

Settings

{data.settings.map((setting) => (
{['on', 'off', 'true', 'false'].includes(setting.value) ? ( ) : ( )}
))}
); } export function ErrorBoundary({ error }: { error: Error }) { console.error(error); return ( } title="Error" color="red"> An unexpected error occurred: {error.message} ); } export function CatchBoundary() { const caught = useCatch(); if (caught.status === 404) { return ( } title="Error" color="red"> Not found ); } throw new Error(`Unexpected caught response with status: ${caught.status}`); }