project.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. import {Redirect} from "react-router";
  9. const ProjectSnippet = ({onSave, getSnippet, match:{params:{id},}, titleText, descriptionText, filesArr, nameText,}) => {
  10. useEffect(() => {
  11. getSnippet(id);
  12. }, []);
  13. const [files, setFiles] = useState([]);
  14. const [name, setName] = useState("");
  15. const [title, setTitle] = useState("");
  16. const [description, setDescription] = useState("");
  17. useEffect(() => {
  18. setFiles(filesArr);
  19. setTitle(titleText);
  20. setDescription(descriptionText);
  21. }, [filesArr, titleText, descriptionText]);
  22. const [srcDoc, setSrcDoc] = useState("");
  23. const html = files?.filter((el) => {
  24. return el?.type === "html";
  25. })[0]?.text;
  26. const css = files?.filter((el) => {
  27. return el?.type === "css";
  28. })[0]?.text;
  29. const js = files?.filter((el) => {
  30. return el?.type === "javascript";
  31. })[0]?.text;
  32. console.log(js);
  33. useEffect(() => {
  34. const timeout = setTimeout(() => {
  35. setSrcDoc(`
  36. <html>
  37. <body>${html || ""}</body>
  38. <style>${css}</style>
  39. <script>${js}</script>
  40. </html>
  41. `);
  42. }, 250);
  43. return () => clearTimeout(timeout);
  44. }, [html, css, js]);
  45. return (
  46. <div>
  47. <Link to="/">
  48. <button className="float-left btn-secondary d-inline-block mt-2 ml-2">
  49. <span>&larr;</span> Back to Main Page
  50. </button>
  51. </Link>
  52. <Link to="/projects">
  53. <button className="float-right btn btn-outline-info border-info mt-2 mr-2">
  54. All projects
  55. </button>
  56. </Link>
  57. <br/>
  58. <div>
  59. <h3 style={{marginTop:'30px', marginLeft: "20px"}}><u>Name of this project:</u> &nbsp; <i>{title}</i></h3>
  60. <iframe srcDoc={srcDoc} title="output" sandbox="allow-scripts" frameBorder="0" width="95%" height="100%"
  61. style={{height: "280px", marginLeft: "2%",marginTop: "40px", border: "5px solid green"}}/>
  62. {files?.map((data, index) => (
  63. <>
  64. <Editor onDelete={() => setFiles(files?.filter((item) => item !== data))} data={data}
  65. onChange={({type, name, text}) => setFiles([...files.slice(0, index), {type, name, text}, ...files.slice(index + 1),])}
  66. />
  67. </>
  68. ))}
  69. </div>
  70. <br />
  71. <div style={{alignItems: "center", textAlign: "center", marginBottom: "10px"}}>
  72. <div>
  73. <button className="btn btn-primary" onClick={() => setFiles([...files, {type: "html"}])} key={files}>
  74. Add editor
  75. </button>
  76. </div>
  77. <div className="input-group mb-3 mt-5 ml-auto mr-auto w-50">
  78. <div className="input-group-prepend">
  79. <span className="input-group-text" id="basic-addon1">
  80. Name of your project
  81. </span>
  82. </div>
  83. <input value={title} onChange={(e) => setTitle(e.target.value)} type="text" className="form-control"
  84. placeholder="Name of project" aria-label="Name of project" aria-describedby="basic-addon1"/>
  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 value={description} onChange={(e) => setDescription(e.target.value)} className="form-control "
  91. aria-label="With textarea" placeholder="Your description"></textarea>
  92. </div>
  93. <button className="btn btn-success float-center mt-5 mb-5" onClick={() => onSave(title, description, files, id)}>
  94. Save project
  95. </button>
  96. </div>
  97. </div>
  98. );
  99. };
  100. const ConnectedProject = connect(
  101. (state) => ({
  102. titleText: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.title,
  103. descriptionText: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.description,
  104. nameText: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.name,
  105. filesArr: state?.promise?.findSnippetById?.payload?.data?.SnippetFind?.[0]?.files,
  106. }),
  107. {getSnippet: actionSnippetById, onSave: actionSnippetAdd}
  108. )(ProjectSnippet);
  109. export default ConnectedProject;