PlaylistCover.jsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import React, { useState, useRef } from "react";
  2. import { useForm } from "react-hook-form";
  3. import "./style.scoped.scss";
  4. import { styled, TextField } from "@mui/material";
  5. import Button from "@mui/material/Button";
  6. import PlaylistIcon from "../../assets/playlist_icon_2.svg";
  7. import { useDispatch } from "react-redux";
  8. import { actionUpsertPlaylistInfo } from "../../redux/actions/creators/playlists";
  9. const CssTextField = styled(TextField)({
  10. "& .MuiInput-root": {
  11. color: "gray",
  12. "&:before": {
  13. borderBottom: "1px solid black",
  14. },
  15. "&:after": {
  16. borderBottom: "2px solid rgb(89, 215, 89)",
  17. },
  18. },
  19. "& .MuiInputLabel-root": {
  20. color: "gray",
  21. fontSize: "15px",
  22. "&.Mui-focused": {
  23. color: "rgb(89, 215, 89)",
  24. },
  25. },
  26. });
  27. const PlaylistCover = ({ _id, name, description }) => {
  28. const { register, handleSubmit, reset } = useForm();
  29. const dispatch = useDispatch();
  30. const [isEditingInfo, setIsEditingInfo] = useState(false);
  31. const submitHandler = (data) => {
  32. const { name, description } = data;
  33. dispatch(actionUpsertPlaylistInfo({ _id, name, description }));
  34. reset();
  35. };
  36. return (
  37. <form onSubmit={handleSubmit(submitHandler)}>
  38. <div
  39. className="playlist-info"
  40. onClick={() => setIsEditingInfo(!isEditingInfo)}
  41. >
  42. <img className="icon" src={PlaylistIcon} alt="playlist_icon" />
  43. <p className="name">{name}</p>
  44. <p className="description">{description}</p>
  45. </div>
  46. <div
  47. className={`playlist-edit ${
  48. isEditingInfo ? "playlist-edit-visible" : ""
  49. }`}
  50. >
  51. <CssTextField
  52. variant="standard"
  53. label="Name"
  54. id="name-input"
  55. autoComplete="none1"
  56. {...register("name", { required: true })}
  57. />
  58. <CssTextField
  59. variant="standard"
  60. label="Description"
  61. id="description-input"
  62. autoComplete="none2"
  63. {...register("description", { required: true })}
  64. />
  65. <Button
  66. style={{ marginTop: "20px" }}
  67. color="success"
  68. variant="outlined"
  69. type="submit"
  70. >
  71. Save
  72. </Button>
  73. </div>
  74. </form>
  75. );
  76. };
  77. export default PlaylistCover;