Nov 8
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) {
// Put the most recently-modified note at the top
setNotes(oldNotes => {
const newArray = []
for(let i = 0; i < oldNotes.length; i++) {
const oldNote = oldNotes[i]
if(oldNote.id === currentNoteId) {
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.js
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>
)
}
Editor.js
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>
)
}