MyProjects.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { useEffect, useState } from "react";
  2. import { connect } from "react-redux";
  3. import { Link } from "react-router-dom";
  4. import { actionSnippetById } from "store/actions/actionSnippetById";
  5. import { actionSnippetAdd } from "store/actions/actionSnippetAdd";
  6. import { Editor } from "components/Editor";
  7. import "components/EditorsPage.css";
  8. const MyProjectSnippet = ({
  9. onSave,
  10. getSnippet,
  11. match: {
  12. params: { id },
  13. },
  14. titleText,
  15. descriptionText,
  16. filesArr,
  17. }) => {
  18. useEffect(() => {
  19. getSnippet(id);
  20. }, [id, getSnippet]);
  21. const [files, setFiles] = useState([]);
  22. const [title, setTitle] = useState("");
  23. const [description, setDescription] = useState("");
  24. useEffect(() => {
  25. setFiles(filesArr);
  26. setTitle(titleText);
  27. setDescription(descriptionText);
  28. }, [filesArr, titleText, descriptionText]);
  29. const [srcDoc, setSrcDoc] = useState("");
  30. const html = files?.filter(e => {
  31. return e?.type === "html";
  32. })[0]?.text;
  33. const css = files?.filter(e => {
  34. return e?.type === "css";
  35. })[0]?.text;
  36. const javascript = files?.filter(e => {
  37. return e?.type === "javascript";
  38. })[0]?.text;
  39. console.log(javascript);
  40. useEffect(() => {
  41. const timeout = setTimeout(() => {
  42. setSrcDoc(`
  43. <html>
  44. <body>${html}</body>
  45. <style>${css}</style>
  46. <script>${javascript}</script>
  47. </html>
  48. `);
  49. }, 250);
  50. return () => clearTimeout(timeout);
  51. }, [html, css, javascript]);
  52. return (
  53. <div>
  54. <div>
  55. <Link to='/projects'>
  56. <button className='btn_search' style={{ margin: 10, marginBottom: 50 }}>
  57. Back to All Projects
  58. </button>
  59. </Link>
  60. </div>
  61. <br />
  62. {files?.map((data, index) => (
  63. <>
  64. <Editor
  65. data={data}
  66. onChange={({ type, name, text }) =>
  67. setFiles([...files.slice(0, index), { type, name, text }, ...files.slice(index, 1)])
  68. }
  69. />
  70. </>
  71. ))}
  72. <br />
  73. <div>
  74. <div>
  75. <button
  76. className='button_plus'
  77. onClick={newArray => {
  78. let editors2 = [...files];
  79. editors2.push(newArray);
  80. setFiles(editors2);
  81. }}
  82. >
  83. +
  84. </button>
  85. <button
  86. className='button_plus'
  87. onClick={newArray => {
  88. let editors2 = [...files];
  89. editors2.pop(newArray);
  90. setFiles(editors2);
  91. }}
  92. >
  93. -
  94. </button>
  95. </div>
  96. <div>
  97. <iframe
  98. className='pane'
  99. srcDoc={srcDoc}
  100. title='output'
  101. sandbox='allow-scripts'
  102. frameBorder='0'
  103. style={{ marginTop: 20 }}
  104. width='95%'
  105. height='95%'
  106. />
  107. </div>
  108. <div>
  109. <p className='text'>Name of your project: </p>
  110. <input
  111. className='input_title'
  112. placeholder='Name of your project'
  113. value={title}
  114. onChange={e => setTitle(e.target.value)}
  115. />
  116. </div>
  117. <p className='text'>Description: </p>
  118. <textarea
  119. className='text_desc'
  120. placeholder='Description'
  121. value={description}
  122. onChange={e => setDescription(e.target.value)}
  123. style={{ marginBottom: 50 }}
  124. />
  125. </div>
  126. <div>
  127. <button className='button_submit' onClick={() => onSave(title, description, files)}>
  128. Submit this Editor
  129. </button>
  130. </div>
  131. </div>
  132. );
  133. };
  134. const ConnectedMyProject = connect(
  135. state => ({
  136. titleText: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.title,
  137. descriptionText: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.description,
  138. filesArr: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.files,
  139. }),
  140. { getSnippet: actionSnippetById, onSave: actionSnippetAdd },
  141. )(MyProjectSnippet);
  142. export default ConnectedMyProject;