new snippet
This commit is contained in:
@ -17,10 +17,11 @@ import {
|
||||
} from 'mdb-react-ui-kit';
|
||||
import 'mdb-react-ui-kit/dist/css/mdb.min.css';
|
||||
import "@fortawesome/fontawesome-free/css/all.min.css";
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link, useLocation } from 'react-router-dom';
|
||||
import AuthContext from "../context/AuthContext";
|
||||
|
||||
export default function App() {
|
||||
const location = useLocation();
|
||||
const [showBasic, setShowBasic] = useState(false);
|
||||
const { user, logoutUser } = useContext(AuthContext);
|
||||
|
||||
@ -69,7 +70,7 @@ export default function App() {
|
||||
</MDBNavbarItem>
|
||||
|
||||
<MDBNavbarItem>
|
||||
<MDBNavbarLink disabled={user && false} href='#' tabIndex={-1} aria-disabled='true' background='#3b71ca'>
|
||||
<MDBNavbarLink disabled={user && false} href='/new-snippet' tabIndex={-1} aria-disabled='true' background='#3b71ca'>
|
||||
New snippet
|
||||
</MDBNavbarLink>
|
||||
</MDBNavbarItem>
|
||||
|
||||
86
react/app/src/components/NewSnippet.jsx
Normal file
86
react/app/src/components/NewSnippet.jsx
Normal file
@ -0,0 +1,86 @@
|
||||
import React, { useContext, useState } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import {
|
||||
MDBCard,
|
||||
MDBCardBody,
|
||||
MDBCardTitle,
|
||||
MDBCardText,
|
||||
MDBBtn,
|
||||
MDBInput,
|
||||
} from 'mdb-react-ui-kit';
|
||||
import 'mdb-react-ui-kit/dist/css/mdb.min.css';
|
||||
import "@fortawesome/fontawesome-free/css/all.min.css";
|
||||
import AuthContext from "../context/AuthContext";
|
||||
import MonacoEditor from 'react-monaco-editor';
|
||||
|
||||
const NewSnippet = () => {
|
||||
const { authTokens } = useContext(AuthContext);
|
||||
const navigate = useNavigate();
|
||||
|
||||
const [ snippetContent, setSnippetContent ] = useState("");
|
||||
const [ snippetTitle, setSnippetTitle ] = useState("");
|
||||
|
||||
const saveSnippet = async () => {
|
||||
const response = await fetch(`http://${process.env.REACT_APP_DOMAIN}/api/snippets/`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Authorization": `Bearer ${authTokens.access}`,
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: JSON.stringify({ "content": snippetContent, "title": snippetTitle })
|
||||
});
|
||||
const data = await response.json();
|
||||
|
||||
if (response.status === 201) {
|
||||
alert("Snippet created!")
|
||||
navigate(`/snippet/${data?.id}`)
|
||||
} else {
|
||||
alert(`Error updating snippet: ${data?.detail}`)
|
||||
}
|
||||
};
|
||||
|
||||
const options = {
|
||||
autoIndent: 'full',
|
||||
contextmenu: true,
|
||||
fontFamily: 'monospace',
|
||||
fontSize: 13,
|
||||
lineHeight: 24,
|
||||
hideCursorInOverviewRuler: true,
|
||||
matchBrackets: 'always',
|
||||
minimap: {
|
||||
enabled: true,
|
||||
},
|
||||
scrollbar: {
|
||||
horizontalSliderSize: 4,
|
||||
verticalSliderSize: 18,
|
||||
},
|
||||
selectOnLineNumbers: true,
|
||||
roundedSelection: false,
|
||||
readOnly: false,
|
||||
cursorStyle: 'line',
|
||||
automaticLayout: true,
|
||||
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<MDBCard>
|
||||
<MDBCardBody>
|
||||
<MDBInput type="text" placeholder='Your snippet title..' value={snippetTitle} onChange={(e) => setSnippetTitle(e.target.value)}/>
|
||||
</MDBCardBody>
|
||||
</MDBCard>
|
||||
<div style={{textAlign: "left", height: "80vh"}}>
|
||||
<MonacoEditor
|
||||
height="80vh"
|
||||
options={options}
|
||||
value={snippetContent}
|
||||
onChange={setSnippetContent}
|
||||
/>
|
||||
<MDBBtn className="mb-4 w-100" onClick={saveSnippet}>Create</MDBBtn>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
export default NewSnippet;
|
||||
@ -11,9 +11,10 @@ import "@fortawesome/fontawesome-free/css/all.min.css";
|
||||
import AuthContext from "../context/AuthContext";
|
||||
import MonacoEditor from 'react-monaco-editor';
|
||||
|
||||
const Snippet = ({ id }) => {
|
||||
const Snippet = ({ id = 0 }) => {
|
||||
const { authTokens } = useContext(AuthContext);
|
||||
const [ snippet, setSnippet ] = useState("");
|
||||
const [ snippet, setSnippet ] = useState(null);
|
||||
const [ snippetContent, setSnippetContent ] = useState("");
|
||||
const getSnippet = async (id) => {
|
||||
const response = await fetch(`http://${process.env.REACT_APP_DOMAIN}/api/snippets/${id}`, {
|
||||
method: "GET",
|
||||
@ -26,18 +27,20 @@ const Snippet = ({ id }) => {
|
||||
if (response.status === 200) {
|
||||
console.log(data)
|
||||
setSnippet(data)
|
||||
setSnippetContent(data?.content)
|
||||
} else {
|
||||
console.log(data, authTokens)
|
||||
}
|
||||
};
|
||||
const updateSnippet = async (id, snippet) => {
|
||||
const updateSnippet = async () => {
|
||||
console.log(snippet, snippetContent);
|
||||
const response = await fetch(`http://${process.env.REACT_APP_DOMAIN}/api/snippets/${id}`, {
|
||||
method: "POST",
|
||||
method: "PATCH",
|
||||
headers: {
|
||||
"Authorization": `Bearer ${authTokens.access}`,
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: snippet
|
||||
body: JSON.stringify({...snippet, "content": snippetContent})
|
||||
});
|
||||
const data = await response.json();
|
||||
|
||||
@ -75,7 +78,7 @@ const Snippet = ({ id }) => {
|
||||
|
||||
};
|
||||
|
||||
return (
|
||||
return snippet ? (
|
||||
<>
|
||||
<MDBCard>
|
||||
<MDBCardBody>
|
||||
@ -86,11 +89,19 @@ const Snippet = ({ id }) => {
|
||||
<MonacoEditor
|
||||
height="80vh"
|
||||
options={options}
|
||||
value={snippet.content}
|
||||
value={snippetContent}
|
||||
onChange={setSnippetContent}
|
||||
/>
|
||||
<MDBBtn className="mb-4 w-100" onClick={updateSnippet}>Save</MDBBtn>
|
||||
</div>
|
||||
</>
|
||||
) : (
|
||||
<MDBCard>
|
||||
<MDBCardBody>
|
||||
<MDBCardTitle>Snippet not found!</MDBCardTitle>
|
||||
<MDBCardText>Create your own at New Snippet </MDBCardText>
|
||||
</MDBCardBody>
|
||||
</MDBCard>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user