SeachProjects.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 SearchProjectSnippet = ({
  8. getSnippet,
  9. match: {
  10. params: { id },
  11. },
  12. titleText,
  13. descriptionText,
  14. filesArr,
  15. }) => {
  16. useEffect(() => {
  17. getSnippet(id);
  18. }, [id, getSnippet]);
  19. const [files, setFiles] = useState([]);
  20. const [title, setTitle] = useState("");
  21. const [description, setDescription] = useState("");
  22. useEffect(() => {
  23. setFiles(filesArr);
  24. setTitle(titleText);
  25. setDescription(descriptionText);
  26. }, [filesArr, titleText, descriptionText]);
  27. const [srcDoc, setSrcDoc] = useState("");
  28. const html = files?.filter(e => e?.type === "html")[0]?.text;
  29. const css = files?.filter(e => e?.type === "css")[0]?.text;
  30. const javascript = files?.filter(e => e?.type === "javascript")[0]?.text;
  31. console.log(javascript);
  32. useEffect(() => {
  33. const timeout = setTimeout(() => {
  34. setSrcDoc(`
  35. <html>
  36. <body>${html}</body>
  37. <style>${css}</style>
  38. <script>${javascript}</script>
  39. </html>
  40. `);
  41. }, 250);
  42. return () => clearTimeout(timeout);
  43. }, [html, css, javascript]);
  44. return (
  45. <div>
  46. <div>
  47. <Link to='/search'>
  48. <button className='btn_search' style={{ margin: 10, marginBottom: 50 }}>
  49. Back to Search
  50. </button>
  51. </Link>
  52. </div>
  53. <br />
  54. {files?.map((data, index) => (
  55. <>
  56. <Editor
  57. data={data}
  58. onChange={({ type, name, text }) =>
  59. setFiles([...files.slice(0, index), { type, name, text }, ...files.slice(index, 1)])
  60. }
  61. />
  62. </>
  63. ))}
  64. <br />
  65. <div>
  66. <div>
  67. <iframe
  68. className='pane'
  69. srcDoc={srcDoc}
  70. title='output'
  71. sandbox='allow-scripts'
  72. frameBorder='0'
  73. style={{ marginTop: 20 }}
  74. width='95%'
  75. height='95%'
  76. />
  77. </div>
  78. <div>
  79. <p className='text'>Name of your project: </p>
  80. <input
  81. className='input_title'
  82. placeholder='Name of your project'
  83. value={title}
  84. onChange={e => setTitle(e.target.value)}
  85. />
  86. </div>
  87. <p className='text'>Description: </p>
  88. <textarea
  89. className='text_desc'
  90. placeholder='Description'
  91. value={description}
  92. onChange={e => setDescription(e.target.value)}
  93. style={{ marginBottom: 50 }}
  94. />
  95. </div>
  96. </div>
  97. );
  98. };
  99. const ConnectedSearchProject = connect(
  100. state => ({
  101. titleText: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.title,
  102. descriptionText: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.description,
  103. filesArr: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.files,
  104. }),
  105. { getSnippet: actionSnippetById },
  106. )(SearchProjectSnippet);
  107. export default ConnectedSearchProject;