SettingsBan.tsx 2.4 KB

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