Files
commafeed/commafeed-client/src/components/settings/CustomCss.tsx

69 lines
2.2 KiB
TypeScript
Raw Normal View History

2023-05-05 14:03:28 +02:00
import { Trans } from "@lingui/macro"
import { Button, Group, Stack, Textarea } from "@mantine/core"
import { useForm } from "@mantine/form"
2023-05-05 14:55:03 +02:00
import { client } from "app/client"
import { redirectToSelectedSource } from "app/slices/redirect"
import { useAppDispatch, useAppSelector } from "app/store"
2023-05-05 14:03:28 +02:00
import { useEffect } from "react"
import { useAsyncCallback } from "react-async-hook"
import { TbDeviceFloppy } from "react-icons/tb"
interface FormData {
customCss: string
}
export function CustomCss() {
const settings = useAppSelector(state => state.user.settings)
const customCss = settings?.customCss
const dispatch = useAppDispatch()
const form = useForm<FormData>()
const { setValues } = form
2023-05-05 14:47:15 +02:00
const saveCustomCss = useAsyncCallback(
async (d: FormData) => {
if (!settings) return
await client.user.saveSettings({ ...settings, customCss: d.customCss })
2023-05-05 14:03:28 +02:00
},
2023-05-05 14:47:15 +02:00
{
onSuccess: () => {
window.location.reload()
},
}
)
2023-05-05 14:03:28 +02:00
useEffect(() => {
if (!customCss) return
setValues({
customCss,
})
}, [setValues, customCss])
return (
2023-05-05 14:47:15 +02:00
<form onSubmit={form.onSubmit(saveCustomCss.execute)}>
2023-05-05 14:03:28 +02:00
<Stack>
<Textarea
autosize
minRows={4}
{...form.getInputProps("customCss")}
description={<Trans>Custom CSS rules that will be applied</Trans>}
styles={{
input: {
fontFamily: "monospace",
},
}}
/>
<Group>
<Button variant="default" onClick={() => dispatch(redirectToSelectedSource())}>
<Trans>Cancel</Trans>
</Button>
<Button type="submit" leftIcon={<TbDeviceFloppy size={16} />} loading={saveCustomCss.loading}>
<Trans>Save</Trans>
</Button>
</Group>
</Stack>
</form>
)
}