SettingsBan.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import React, { FC, useState } from "react";
  2. import { Flex } from "reflexbox/styled-components";
  3. import { useFormState } from "react-use-form-state";
  4. import axios from "axios";
  5. import { getAxiosConfig } from "../../utils";
  6. import TextInput from "../TextInput";
  7. import Checkbox from "../Checkbox";
  8. import { API } from '../../consts';
  9. import Button from "../Button";
  10. import Text from "../Text";
  11. import { useMessage } from "../../hooks";
  12. interface BanForm {
  13. id: string;
  14. user: boolean;
  15. domain: boolean;
  16. host: boolean;
  17. }
  18. const SettingsBan: FC = () => {
  19. const [submitting, setSubmitting] = useState(false);
  20. const [message, setMessage] = useMessage(3000);
  21. const [formState, { checkbox, text }] = useFormState<BanForm>();
  22. const onSubmit = async e => {
  23. e.preventDefault();
  24. setSubmitting(true);
  25. setMessage()
  26. try {
  27. const { data } = await axios.post(API.BAN_LINK, formState.values, getAxiosConfig());
  28. setMessage(data.message, "green");
  29. formState.clear();
  30. } catch (err) {
  31. setMessage(err?.response?.data?.error || "Couldn't ban the link.");
  32. }
  33. setSubmitting(false);
  34. };
  35. return (
  36. <Flex flexDirection="column">
  37. <Text as="h2" fontWeight={700} mb={4}>Ban link</Text>
  38. <Flex as="form" flexDirection="column" onSubmit={onSubmit} alignItems="flex-start">
  39. <Flex mb={24} alignItems="center">
  40. <TextInput
  41. {...text("id")}
  42. placeholder="Link ID (e.g. K7b2A)"
  43. height={44}
  44. fontSize={[16, 18]}
  45. placeholderSize={[14, 15]}
  46. mr={3}
  47. pl={24}
  48. pr={24}
  49. width={[1, 3 / 5]}
  50. />
  51. <Button
  52. type="submit"
  53. icon={submitting ? "loader" : "lock"}
  54. disabled={submitting}
  55. >
  56. {submitting ? "Banning..." : "Ban"}
  57. </Button>
  58. </Flex>
  59. <Checkbox
  60. {...checkbox("user")}
  61. label="Ban User (and all of their links)"
  62. mb={12}
  63. />
  64. <Checkbox {...checkbox("domain")} label="Ban Domain" mb={12} />
  65. <Checkbox {...checkbox("host")} label="Ban Host/IP" />
  66. <Text color={message.color} mt={3}>{message.text}</Text>
  67. </Flex>
  68. </Flex>
  69. );
  70. };
  71. export default SettingsBan;