EditInfoButton.jsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React from "react";
  2. import { useTranslation } from "react-i18next";
  3. import styled from "styled-components";
  4. import { Form } from "react-final-form";
  5. import Touch from "../../ui/Touch";
  6. import SidePanel from "../../ui/SidePanel";
  7. import AutoSave from "../../ui/formUtils/AutoSave";
  8. import { useBoardConfig } from "react-sync-board";
  9. const BoardConfigForm = styled.div`
  10. display: flex;
  11. flex-direction: column;
  12. & .trash {
  13. float: right;
  14. }
  15. `;
  16. const BoardConfigPanel = ({ BoardFormComponent, show, setShow }) => {
  17. const { t } = useTranslation();
  18. const [, setBoardConfig] = useBoardConfig();
  19. const onSubmitHandler = React.useCallback(
  20. (data) => {
  21. setBoardConfig((prev) => ({
  22. ...prev,
  23. ...data,
  24. }));
  25. },
  26. [setBoardConfig]
  27. );
  28. return (
  29. <SidePanel
  30. title={t("Edit game information")}
  31. onClose={() => setShow(false)}
  32. show={show}
  33. position="left"
  34. >
  35. <section>
  36. <Form
  37. onSubmit={onSubmitHandler}
  38. render={() => (
  39. <BoardConfigForm>
  40. <AutoSave save={onSubmitHandler} />
  41. <BoardFormComponent />
  42. </BoardConfigForm>
  43. )}
  44. />
  45. </section>
  46. </SidePanel>
  47. );
  48. };
  49. const EditInfoButton = ({ BoardFormComponent }) => {
  50. const { t } = useTranslation();
  51. const [show, setShow] = React.useState(false);
  52. return (
  53. <>
  54. <Touch
  55. onClick={() => setShow((prev) => !prev)}
  56. alt={t("Edit game info")}
  57. title={t("Edit game info")}
  58. label={t("Edit game info")}
  59. icon={"cog"}
  60. />
  61. <BoardConfigPanel
  62. BoardFormComponent={BoardFormComponent}
  63. show={show}
  64. setShow={setShow}
  65. />
  66. </>
  67. );
  68. };
  69. export default EditInfoButton;