Project.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import { useEffect } from "react";
  2. import { connect } from "react-redux";
  3. import { actionSnippetById } from "../actions/actionSnippetById";
  4. import { useState } from "react";
  5. import { Editor } from "../components/Editor";
  6. import { actionSnippetAdd } from "../actions/actionSnippetAdd";
  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("");
  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. const [srcDoc, setSrcDoc] = useState("");
  32. const html = files?.filter((el) => {
  33. return el?.type === "html";
  34. })[0]?.text;
  35. const css = files?.filter((el) => {
  36. return el?.type === "css";
  37. })[0]?.text;
  38. const js = files?.filter((el) => {
  39. return el?.type === "javascript";
  40. })[0]?.text;
  41. console.log(js);
  42. useEffect(() => {
  43. const timeout = setTimeout(() => {
  44. setSrcDoc(`
  45. <html>
  46. <body>${html || ""}</body>
  47. <style>${css}</style>
  48. <script>${js}</script>
  49. </html>
  50. `);
  51. }, 250);
  52. return () => clearTimeout(timeout);
  53. }, [html, css, js]);
  54. return (
  55. <div>
  56. <br />
  57. {files?.map((data, index) => (
  58. <>
  59. <Editor
  60. onDelete={() => setFiles(files?.filter((item) => item !== data))}
  61. data={data}
  62. onChange={({ type, name, text }) =>
  63. setFiles([
  64. ...files.slice(0, index),
  65. { type, name, text },
  66. ...files.slice(index + 1),
  67. ])
  68. }
  69. />
  70. </>
  71. ))}
  72. <br />
  73. <div
  74. style={{
  75. alignItems: "center",
  76. textAlign: "center",
  77. marginBottom: "10px",
  78. }}
  79. >
  80. <div>
  81. <button
  82. className="btn btn-primary"
  83. onClick={() => setFiles([...files, { type: "html" }])}
  84. key={files}
  85. >
  86. Add editor
  87. </button>
  88. <iframe
  89. srcDoc={srcDoc}
  90. title="output"
  91. sandbox="allow-scripts"
  92. frameBorder="0"
  93. width="95%"
  94. height="95%"
  95. style={{
  96. marginTop: "10px",
  97. border: "1px solid #F0FFFF",
  98. boxShadow: "0px 5px 10px 2px rgba(34, 60, 80, 0.2)",
  99. }}
  100. />
  101. <div>
  102. <Link to="/projects">
  103. <button className="btn btn-outline-info border-info mt-3">
  104. All projects
  105. </button>
  106. </Link>
  107. </div>
  108. </div>
  109. <div className="input-group mb-3 mt-5 ml-auto mr-auto w-25">
  110. <div className="input-group-prepend">
  111. <span className="input-group-text" id="basic-addon1">
  112. Name of your project
  113. </span>
  114. </div>
  115. <input
  116. value={title}
  117. onChange={(e) => setTitle(e.target.value)}
  118. type="text"
  119. className="form-control"
  120. placeholder="Name of project"
  121. aria-label="Name of project"
  122. aria-describedby="basic-addon1"
  123. />
  124. </div>
  125. <div className="input-group ml-auto mr-auto w-50">
  126. <div className="input-group-prepend">
  127. <span className="input-group-text ">Description</span>
  128. </div>
  129. <textarea
  130. value={description}
  131. onChange={(e) => setDescription(e.target.value)}
  132. className="form-control "
  133. aria-label="With textarea"
  134. placeholder="Your description"
  135. ></textarea>
  136. </div>
  137. <button
  138. className="btn btn-success float-right mr-5 mb-5"
  139. onClick={() => onSave(title, description, files, id)}
  140. >
  141. Save project
  142. </button>
  143. </div>
  144. </div>
  145. );
  146. };
  147. const ConnectedProject = connect(
  148. (state) => ({
  149. titleText:
  150. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.title,
  151. descriptionText:
  152. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]
  153. ?.description,
  154. nameText:
  155. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.name,
  156. filesArr:
  157. state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.files,
  158. }),
  159. { getSnippet: actionSnippetById, onSave: actionSnippetAdd }
  160. )(ProjectSnippet);
  161. export default ConnectedProject;