project.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { useEffect } from "react";
  2. import { connect } from "react-redux";
  3. import { actionSnippetById } from "../actions";
  4. import { useState } from "react";
  5. import Editor from "../components/editor";
  6. import { actionSnippetAdd } from "../actions";
  7. import { Link } from "react-router-dom";
  8. const ProjectSnippet = ({
  9. onSave,
  10. getSnippet,
  11. match: {
  12. params: { id },
  13. },
  14. titleText,
  15. descriptionText,
  16. filesArr,
  17. nameText,
  18. }) => {
  19. useEffect(() => {
  20. getSnippet(id);
  21. }, []);
  22. const [files, setFiles] = useState([]);
  23. const [name, setName] = useState(nameText);
  24. const [title, setTitle] = useState('');
  25. const [description, setDescription] = useState('');
  26. useEffect(() => {
  27. setFiles(filesArr)
  28. setTitle(titleText)
  29. setDescription(descriptionText)
  30. },[filesArr , titleText , descriptionText])
  31. return (
  32. <div>
  33. {files?.map((data, index) => (
  34. <>
  35. <Editor
  36. onDelete={() => setFiles(files.filter((item) => item != data))}
  37. data={data}
  38. onChange={({ type, name, text }) =>
  39. setFiles([
  40. ...files.slice(0, index),
  41. { type, name, text },
  42. ...files.slice(index + 1),
  43. ])
  44. }
  45. />
  46. </>
  47. ))}
  48. <br />
  49. <div
  50. style={{
  51. alignItems: "center",
  52. textAlign: "center",
  53. marginBottom: "10px",
  54. }}
  55. >
  56. <div>
  57. <button
  58. className="btn btn-primary"
  59. onClick={() => setFiles([...files, { type: "html" }])}
  60. key={files}
  61. >
  62. Add editor
  63. </button>
  64. <div>
  65. <Link to ="/projects">
  66. <button className = 'btn btn-outline-info border-info'>All projects</button>
  67. </Link>
  68. </div>
  69. </div>
  70. <div className="input-group mb-3 mt-5 ml-auto mr-auto w-25">
  71. <div className="input-group-prepend">
  72. <span className="input-group-text" id="basic-addon1">
  73. Name of your project
  74. </span>
  75. </div>
  76. <input
  77. value={title}
  78. onChange={(e) => setTitle(e.target.value)}
  79. type="text"
  80. className="form-control"
  81. placeholder="Name of project"
  82. aria-label="Name of project"
  83. aria-describedby="basic-addon1"
  84. />
  85. </div>
  86. <div className="input-group ml-auto mr-auto w-50">
  87. <div className="input-group-prepend">
  88. <span className="input-group-text ">Description</span>
  89. </div>
  90. <textarea
  91. value={description}
  92. onChange={(e) => setDescription(e.target.value)}
  93. className="form-control "
  94. aria-label="With textarea"
  95. placeholder="Your description"
  96. ></textarea>
  97. </div>
  98. <button
  99. className="btn btn-success float-right mr-5 mb-5"
  100. onClick={() => onSave(title, description, files)}
  101. >
  102. Save project
  103. </button>
  104. </div>
  105. </div>
  106. );
  107. };
  108. const ConnectedProject = connect(
  109. (state) => ({
  110. title:
  111. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.title,
  112. descriptionText:
  113. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]
  114. ?.description,
  115. nameText:
  116. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.name,
  117. filesArr:
  118. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.files,
  119. }),
  120. { getSnippet: actionSnippetById ,onSave: actionSnippetAdd }
  121. )(ProjectSnippet);
  122. export default ConnectedProject;