Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ package-lock.json
npm-debug.log*

# output from webpack
dist/
dist/

#environment file
.env
23 changes: 11 additions & 12 deletions client/src/components/AddSnippet/AddSnippet.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,22 @@ const AddSnippet = ({ closeModal }) => {
fetch('/snippets', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: title,
language: language,
comments: comments,
tags: tagList,
storedCode: storedCode,
}),
storedCode: storedCode
})
})
.then((data) => data.json())
.catch((err) => {
console.log(err);
console.log('failed saving snippet');
});


// setTitle('');
// setLanguage('');
// setComments('');
Expand All @@ -72,12 +71,13 @@ const AddSnippet = ({ closeModal }) => {
centered
>
<Modal.Header className={styles.header}>
<Modal.Title className="col-12 text-center">Add a snippet</Modal.Title>
<Modal.Title className="col-12 text-center">
Add a snippet
</Modal.Title>
</Modal.Header>
<br />

<div className={styles.codeSnippet}>

<label>Title: </label>
<input
className={styles.title}
Expand All @@ -86,12 +86,13 @@ const AddSnippet = ({ closeModal }) => {
setTitle(e.target.value);
}}
></input>
{error && <span className='error'>Title is required!</span>}
{error && <span className="error">Title is required!</span>}
<br />
<br />

<label>Language: </label>
<select className={styles.language}
<select
className={styles.language}
value={language}
onChange={(e) => setLanguage(e.target.value)}
>
Expand Down Expand Up @@ -130,8 +131,7 @@ const AddSnippet = ({ closeModal }) => {
"const sayHi = () => {\n console.log('Hello World!)\n}"
}
onChange={(e) => setStoredCode(e)}
>
</CodeMirror>
></CodeMirror>
{/* <input
id='storedCode'
value={storedCode}
Expand All @@ -142,7 +142,7 @@ const AddSnippet = ({ closeModal }) => {
</div>

<Modal.Footer>
{openModal && <SaveModal closeModal={setOpenModal} />}
{openModal && <SaveModal closeModal={setOpenModal} />}
<Button variant="secondary" onClick={() => closeModal(false)}>
Close
</Button>
Expand All @@ -154,7 +154,6 @@ const AddSnippet = ({ closeModal }) => {
Save
</Button>
</Modal.Footer>

</Modal>
</div>
</div>
Expand Down
153 changes: 84 additions & 69 deletions client/src/components/SnippetDisplay/SnippetDisplay.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,20 @@ import CodeMirror from '@uiw/react-codemirror';
import styles from './SnippetDisplay.module.scss';
import { langs } from '@uiw/codemirror-extensions-langs';
import TagInput from '../../components/ui/TagInput/TagInput';
import {Card, Button} from 'react-bootstrap';
import { Card, Button } from 'react-bootstrap';
const SnippetDisplay = ({ selectedSnippet, getSnippet }) => {
// indSnippet = this.props
// create delete method using fetch request
let snippetTitle = selectedSnippet.title ? selectedSnippet.title : '';
let snippetLanguage = selectedSnippet.language ? selectedSnippet.language : '';
let snippetComments = selectedSnippet.comments ? selectedSnippet.comments : '';
let snippetStoredCode = selectedSnippet.storedCode ? selectedSnippet.storedCode : '';
let snippetLanguage = selectedSnippet.language
? selectedSnippet.language
: '';
let snippetComments = selectedSnippet.comments
? selectedSnippet.comments
: '';
let snippetStoredCode = selectedSnippet.storedCode
? selectedSnippet.storedCode
: '';
let snippetTagList = selectedSnippet.tags ? selectedSnippet.tags : [];

// create a state variable for each passed down state and the its setState function
Expand All @@ -24,22 +30,22 @@ const SnippetDisplay = ({ selectedSnippet, getSnippet }) => {
const [editButtonState, setEditButtonState] = useState(false);

const deleteSnippet = (id) => {
fetch (`http://localhost:3000/snippets?id=${id}`, {
method: 'DELETE',
fetch(`http://localhost:3000/snippets?id=${id}`, {
method: 'DELETE'
})
.then((response) => {
if (response.ok) {
getSnippet();
}
})
.catch((err) => {
return ({
return {
log: `SnippetDisiplay.deleteSnippet: Error: ${err}`,
status: err.status || 500,
message: 'There was an error deleting snippet.'
})
})
}
};
});
};

const editSnippet = (id) => {
// const [oldState, setOldState] = React.useState([]);
Expand All @@ -54,7 +60,7 @@ const SnippetDisplay = ({ selectedSnippet, getSnippet }) => {
};
// within fetch request (post)
// body: JSON.stringify(created object)
fetch (`/snippets?id=${id}`, {
fetch(`/snippets?id=${id}`, {
method: 'PUT',
body: JSON.stringify(updatedSnippet)
})
Expand All @@ -63,65 +69,64 @@ const SnippetDisplay = ({ selectedSnippet, getSnippet }) => {
getSnippet();
})
.catch((err) => {
return ({
return {
log: `SnippetDisplay.editSnippet: Error: ${err}`,
status: err.status || 500,
message: 'There was an error editing code snippet.'
});
};
});
};
// copy code state
// copy code state
const [copied, setCopied] = useState(false);


const checkEdit = () => {
if (editButtonState === true) {
return(
return (
<div className={styles.entireSnippetDisplay}>
<div className='displayContainer'>

<span className='title'> Title: </span>
<div className="displayContainer">
<span className="title"> Title: </span>
<input
defaultValue={snippetTitle}
className='titleEdit'
className="titleEdit"
onChange={(e) => {
snippetTitle = e.target.value;
}}
>
</input>
></input>

<span className='language'> Language: </span>
<span className="language"> Language: </span>
<input
defaultValue={snippetLanguage}
className='languageEdit'
className="languageEdit"
onChange={(e) => {
snippetLanguage = e.target.value;
}}
>
</input>
></input>

<span className='comments'> Comments: </span>
<span className="comments"> Comments: </span>
<input
defaultValue={snippetComments}
className='commentsEdit'
className="commentsEdit"
onChange={(e) => {
snippetComments = e.target.value;
}}
>
</input>
></input>

<TagInput className='tags' onChange={(e)=>snippetTagList = e} tags={snippetTagList} />
<TagInput
className="tags"
onChange={(e) => (snippetTagList = e)}
tags={snippetTagList}
/>
{/* <input className="tagsEdit" onChange={(e) => {setTags}}> <span> Title: </span> {snippetTagList}</input> */}
</div>

<CodeMirror
className={styles.editor}
height='500px'
id='storedCode'
height="500px"
id="storedCode"
value={snippetStoredCode}
extensions={[langs.tsx()]}
// placeholder={'const sayHi = () => {\n console.log(\'Hello World!)\n}'}
onChange={(e) => snippetStoredCode = (e)}
onChange={(e) => (snippetStoredCode = e)}
>
<CopyToClipboard
text={snippetStoredCode}
Expand All @@ -131,77 +136,87 @@ const SnippetDisplay = ({ selectedSnippet, getSnippet }) => {
</CopyToClipboard>
</CodeMirror>


<Button
className="saveEditButton"
onClick={() => {
editSnippet(selectedSnippet.id);
setEditButtonState(false);
}}>
Save Edit
}}
>
Save Edit
</Button>

</div>
);
}

if (editButtonState === false) {
return (
<div className={styles.entireSnippetDisplay}>

<div className="displayContainer">
<p className="title"> <span className='title'> Title: </span> {snippetTitle}</p>
<p className="language"> <span> Language: </span> {snippetLanguage}</p>
<p className="comments"> <span> Comments: </span> {snippetComments}</p>
<TagInput className='tags' tags={snippetTagList}/>
<div className="displayContainer">
<p className="title">
{' '}
<span className="title"> Title: </span> {snippetTitle}
</p>
<p className="language">
{' '}
<span> Language: </span> {snippetLanguage}
</p>
<p className="comments">
{' '}
<span> Comments: </span> {snippetComments}
</p>
<TagInput className="tags" tags={snippetTagList} />
{/* <div className="tagContainer">{renderTags()}</div> */}
</div>

<CodeMirror
className={styles.editor}
height='500px'
id='storedCode'
height="500px"
id="storedCode"
value={snippetStoredCode}
extensions={[langs.tsx()]}
// placeholder={'const sayHi = () => {\n console.log(\'Hello World!)\n}'}
options={{
readOnly: true,
readOnly: true
}}
onChange={(e) => snippetStoredCode = (e)}
onChange={(e) => (snippetStoredCode = e)}
>
<CopyToClipboard
text={snippetStoredCode}
onCopy={() => setCopied(true)}
>
<Button className='copyButton'> Copy Code Snippet </Button>
<Button className="copyButton"> Copy Code Snippet </Button>
</CopyToClipboard>
</CodeMirror>

</div>
);
}
};

return (
<>
<Card className={styles.card}>
{checkEdit()}
<>
<Card className={styles.card}>
{checkEdit()}

<div className={styles.buttonDiv}>
<Button
className="deleteButton"
onClick={() => {deleteSnippet(selectedSnippet.id)}}>
Delete Snippet
</Button>
<Button
className="editButton"
onClick={() => {
// editSnippet(selectedSnippet.id);
setEditButtonState(true);
}}>
Edit Snippet
</Button>
</div>
<div className={styles.buttonDiv}>
<Button
className="deleteButton"
onClick={() => {
deleteSnippet(selectedSnippet.id);
}}
>
Delete Snippet
</Button>
<Button
className="editButton"
onClick={() => {
// editSnippet(selectedSnippet.id);
setEditButtonState(true);
}}
>
Edit Snippet
</Button>
</div>
</Card>
</>
);
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@
"bootstrap": "^5.2.3",
"codemirror": "^6.0.1",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
"express": "^4.18.2",
"mongodb": "^5.5.0",
"mongoose": "^7.1.1",
"react": "^18.2.0",
"react-copy-to-clipboard": "^5.1.0",
"react-bootstrap": "^2.7.4",
"react-copy-to-clipboard": "^5.1.0",
"react-dnd": "^14.0.5",
"react-dnd-html5-backend": "^14.1.0",
"react-dom": "^18.2.0",
Expand Down
Loading