import { ChangeEvent, FormEvent, Fragment, useState, useContext, useEffect } from 'react'; import { SnippetsContext } from '../../store'; import { NewSnippet } from '../../typescript/interfaces'; import { Button, Card } from '../UI'; interface Props { inEdit?: boolean; } export const SnippetForm = (props: Props): JSX.Element => { const { inEdit = false } = props; const { createSnippet, currentSnippet, updateSnippet } = useContext(SnippetsContext); const [formData, setFormData] = useState({ title: '', description: '', language: '', code: '', docs: '', isPinned: false, tags: [] }); useEffect(() => { if (inEdit) { if (currentSnippet) { setFormData({ ...currentSnippet }); } } }, [currentSnippet, inEdit]); const inputHandler = ( e: ChangeEvent ) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const stringToTags = (e: ChangeEvent) => { const tags = e.target.value.split(','); setFormData({ ...formData, tags }); }; const tagsToString = (): string => { return formData.tags.join(','); }; const formHandler = (e: FormEvent) => { e.preventDefault(); if (inEdit) { if (currentSnippet) { updateSnippet(formData, currentSnippet.id); } } else { createSnippet(formData); } }; return (
formHandler(e)}> {/* DETAILS SECTION */}
Snippet details
{/* TITLE */}
inputHandler(e)} />
{/* DESCRIPTION */}
inputHandler(e)} />
{/* LANGUAGE */}
inputHandler(e)} />
{/* TAGS */}
stringToTags(e)} />
Tags should be separated with a comma. Language tag will be added automatically

{/* CODE SECTION */}
Snippet code

{/* DOCS SECTION */}
Snippet documentation
{/* SUBMIT SECTION */}
); };