SettingsBan.tsx 2.4 KB

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