Project.js 3.9 KB

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