//APP import React from "react" import Sidebar from "./components/Sidebar" import Editor from "./components/Editor" import { data } from "./data" import Split from "react-split" import { nanoid } from "nanoid" export default function App() { const [notes, setNotes] = React.useState( () => JSON.parse(localStorage.getItem("notes")) || [] ) const [currentNoteId, setCurrentNoteId] = React.useState( (notes[0] && notes[0].id) || "" ) React.useEffect(() => { localStorage.setItem("notes", JSON.stringify(notes)) }, [notes]) function createNewNote() { const newNote = { id: nanoid(), body: "# Type your markdown note's title here" } setNotes(prevNotes => [newNote, ...prevNotes]) setCurrentNoteId(newNote.id) } function updateNote(text) { setNotes(oldNotes => { const newArray = [] for (let i = 0; i < oldNotes.length; i++) { const oldNote = oldNotes[i] if (oldNote.id === currentNoteId) { // Put the most recently-modified note at the top newArray.unshift({ ...oldNote, body: text }) } else { newArray.push(oldNote) } } return newArray }) } function deleteNote(event, noteId) { event.stopPropagation() setNotes(oldNotes => oldNotes.filter(note => note.id !== noteId)) } function findCurrentNote() { return notes.find(note => { return note.id === currentNoteId }) || notes[0] } return ( <main> { notes.length > 0 ? <Split sizes={[30, 70]} direction="horizontal" className="split" > <Sidebar notes={notes} currentNote={findCurrentNote()} setCurrentNoteId={setCurrentNoteId} newNote={createNewNote} deleteNote={deleteNote} /> { currentNoteId && notes.length > 0 && <Editor currentNote={findCurrentNote()} updateNote={updateNote} /> } </Split> : <div className="no-notes"> <h1>You have no notes</h1> <button className="first-note" onClick={createNewNote} > Create one now </button> </div> } </main> ) } //SIDEBAR import React from "react" export default function Sidebar(props) { const noteElements = props.notes.map((note, index) => ( <div key={note.id}> <div className={`title ${ note.id === props.currentNote.id ? "selected-note" : "" }`} onClick={() => props.setCurrentNoteId(note.id)} > <h4 className="text-snippet">{note.body.split("\n")[0]}</h4> <button className="delete-btn" onClick={(event) => props.deleteNote(event, note.id)} > <i className="gg-trash trash-icon"></i> </button> </div> </div> )) return ( <section className="pane sidebar"> <div className="sidebar--header"> <h3>Notes</h3> <button className="new-note" onClick={props.newNote}>+</button> </div> {noteElements} </section> ) }