SettingsPassword.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { useFormState } from "react-use-form-state";
  2. import { Flex } from "reflexbox/styled-components";
  3. import React, { FC, useState } from "react";
  4. import axios from "axios";
  5. import { getAxiosConfig } from "../../utils";
  6. import { useMessage } from "../../hooks";
  7. import TextInput from "../TextInput";
  8. import { API } from "../../consts";
  9. import Button from "../Button";
  10. import Text from "../Text";
  11. const SettingsPassword: FC = () => {
  12. const [loading, setLoading] = useState(false);
  13. const [message, setMessage] = useMessage();
  14. const [formState, { password }] = useFormState<{ password: string }>();
  15. const onSubmit = async e => {
  16. e.preventDefault();
  17. if (loading) return;
  18. if (!formState.validity.password) {
  19. return setMessage(formState.errors.password);
  20. }
  21. setLoading(true);
  22. setMessage();
  23. try {
  24. const res = await axios.post(
  25. API.CHANGE_PASSWORD,
  26. formState.values,
  27. getAxiosConfig()
  28. );
  29. formState.clear();
  30. setMessage(res.data.message, "green");
  31. } catch (err) {
  32. setMessage(err?.response?.data?.error || "Couldn't update the password.");
  33. }
  34. setLoading(false);
  35. };
  36. return (
  37. <Flex flexDirection="column" alignItems="flex-start">
  38. <Text as="h2" fontWeight={700} mb={4}>
  39. Change password
  40. </Text>
  41. <Text mb={4}>Enter a new password to change your current password.</Text>
  42. <Flex as="form" onSubmit={onSubmit}>
  43. <TextInput
  44. {...password({
  45. name: "password",
  46. validate: value => {
  47. const val = value.trim();
  48. if (!val || val.length < 8) {
  49. return "Password must be at least 8 chars.";
  50. }
  51. }
  52. })}
  53. placeholder="New password"
  54. height={44}
  55. width={[1, 2 / 3]}
  56. pl={24}
  57. pr={24}
  58. mr={3}
  59. required
  60. />
  61. <Button type="submit" icon={loading ? "loader" : "refresh"}>
  62. {loading ? "Updating..." : "Update"}
  63. </Button>
  64. </Flex>
  65. <Text color={message.color} mt={3} fontSize={14}>
  66. {message.text}
  67. </Text>
  68. </Flex>
  69. );
  70. };
  71. export default SettingsPassword;