From 464e470441287572cfda8d95484f781236b9db35 Mon Sep 17 00:00:00 2001 From: piotrruss Date: Mon, 9 Aug 2021 21:36:03 +0200 Subject: init commit --- README.md | 3 + apps/Notes/components/List.js | 129 + apps/Notes/components/ListItem.js | 119 + apps/Notes/components/Note.js | 140 + apps/Notes/components/NoteView.js | 63 + apps/Notes/helpers/noteActions.js | 104 + apps/Notes/helpers/sortNotes.js | 0 apps/Notes/hooks/useNotes.js | 8 + apps/Notes/hooks/useSort.js | 22 + apps/Notes/index.js | 3 + apps/index.js | 1 + components/App.js | 38 + components/Form.js | 46 + components/Header.js | 132 + components/Layout.js | 67 + components/Popup.js | 32 + components/index.js | 4 + context/index.js | 3 + helpers/email.js | 4 + helpers/submitForm.js | 26 + helpers/windowActions.js | 49 + jsconfig.json | 5 + lib/dbConnect.js | 45 + lib/fetchJson.js | 23 + lib/sendMail.js | 26 + lib/useUser.js | 33 + lib/withSession.js | 14 + models/Note.js | 9 + models/NoteList.js | 21 + models/User.js | 106 + package-lock.json | 5457 +++++++++++++++++++++++++++++++++++++ package.json | 26 + pages/_app.js | 20 + pages/api/login.js | 29 + pages/api/logout.js | 6 + pages/api/note/[id].js | 30 + pages/api/notes.js | 101 + pages/api/register.js | 35 + pages/api/user.js | 22 + pages/api/verify.js | 45 + pages/index.js | 67 + pages/login.js | 26 + pages/register.js | 24 + pages/verify.js | 109 + public/notes.svg | 1 + styles/_animations.scss | 4 + styles/_reset.scss | 55 + styles/_window.scss | 178 ++ styles/styles.scss | 3 + 49 files changed, 7513 insertions(+) create mode 100644 README.md create mode 100644 apps/Notes/components/List.js create mode 100644 apps/Notes/components/ListItem.js create mode 100644 apps/Notes/components/Note.js create mode 100644 apps/Notes/components/NoteView.js create mode 100644 apps/Notes/helpers/noteActions.js create mode 100644 apps/Notes/helpers/sortNotes.js create mode 100644 apps/Notes/hooks/useNotes.js create mode 100644 apps/Notes/hooks/useSort.js create mode 100644 apps/Notes/index.js create mode 100644 apps/index.js create mode 100644 components/App.js create mode 100644 components/Form.js create mode 100644 components/Header.js create mode 100644 components/Layout.js create mode 100644 components/Popup.js create mode 100644 components/index.js create mode 100644 context/index.js create mode 100644 helpers/email.js create mode 100644 helpers/submitForm.js create mode 100644 helpers/windowActions.js create mode 100644 jsconfig.json create mode 100644 lib/dbConnect.js create mode 100644 lib/fetchJson.js create mode 100644 lib/sendMail.js create mode 100644 lib/useUser.js create mode 100644 lib/withSession.js create mode 100644 models/Note.js create mode 100644 models/NoteList.js create mode 100644 models/User.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages/_app.js create mode 100644 pages/api/login.js create mode 100644 pages/api/logout.js create mode 100644 pages/api/note/[id].js create mode 100644 pages/api/notes.js create mode 100644 pages/api/register.js create mode 100644 pages/api/user.js create mode 100644 pages/api/verify.js create mode 100644 pages/index.js create mode 100644 pages/login.js create mode 100644 pages/register.js create mode 100644 pages/verify.js create mode 100644 public/notes.svg create mode 100644 styles/_animations.scss create mode 100755 styles/_reset.scss create mode 100644 styles/_window.scss create mode 100644 styles/styles.scss diff --git a/README.md b/README.md new file mode 100644 index 0000000..e89f81e --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# My Apps (WIP) + +## Productivity apps created with Next.js diff --git a/apps/Notes/components/List.js b/apps/Notes/components/List.js new file mode 100644 index 0000000..8561d4f --- /dev/null +++ b/apps/Notes/components/List.js @@ -0,0 +1,129 @@ +import React, {useState, useEffect, useRef} from 'react' +import useUser from 'lib/useUser' +import useNotes from '../hooks/useNotes' +import useSort from '../hooks/useSort' +import fetchJson from 'lib/fetchJson' +import {Layout} from 'components' +import ListItem from './ListItem' +import NoteView from './NoteView' +import Note from './Note' + +const List = () => { + const [fetchedNote, setFetchedNote] = useState() + const [action, setAction] = useState('') + const {notes, error} = useNotes() + const [sortedBy, sortBy, sortFn] = useSort(2) + const {user, mutateUser} = useUser({ + redirectToLogin: true, + redirectToVerify: true, + }) + + if (error) return

Failed to fetch notes

+ + if (!user || !user.isLoggedIn || !user.isVerified || !notes || !sortFn) { + return

Loading...

+ } + + + return ( + <> + { + action === '' && ( + <> +
+
setAction('addNote')}>New note
+
+ + + + + + + + + + { + notes.length > 0 + ? (notes.sort(sortFn).map(note => ( + + ))) : ( + + + + )} + +
sortBy(1)}>Title {sortedBy(1)} sortBy(2)}>Created {sortedBy(2)} sortBy(3)}>Modified {sortedBy(3)}
Your notes list is empty.
+ + ) + } + { + action === 'addNote' && ( + + ) + } + { + action === 'showNote' && ( + + ) + } + { + action === 'editNote' && ( + + ) + } + + + ) +} + +export default List diff --git a/apps/Notes/components/ListItem.js b/apps/Notes/components/ListItem.js new file mode 100644 index 0000000..42d67c0 --- /dev/null +++ b/apps/Notes/components/ListItem.js @@ -0,0 +1,119 @@ +import React, { useContext } from 'react' +import fetchJson from 'lib/fetchJson' +import {getNote, removeNote} from '../helpers/noteActions.js' +import useNotes from '../hooks/useNotes' +import Context from 'context'; +import { faEdit, faTrash } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' + +const datestring = date => { + const d = new Date(date); + return ("0" + d.getDate()).slice(-2) + "-" + ("0"+(d.getMonth()+1)).slice(-2) + "-" + + d.getFullYear() + " " + ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2) +}; + +const ListItem = ({note, setAction, setFetchedNote}) => { + const {mutateNotes} = useNotes() + const {setPopup} = useContext(Context) + + const handleNoteAction = async (a, note, e) => { + if (e) e.stopPropagation() + await getNote(note, setFetchedNote, setPopup, () => setAction(a)) + } + + return ( + <> + + handleNoteAction('showNote', note)} + > + {`${note.title}`} + handleNoteAction('editNote', note, e)} + > + + + removeNote(e, note._id, mutateNotes, setPopup, setAction)} + > + + + + handleNoteAction('showNote', note)} + > + {datestring(note.created_at)} + + handleNoteAction('showNote', note)} + > + {datestring(note.updated_at)} + + + + + ) +} + +export default ListItem diff --git a/apps/Notes/components/Note.js b/apps/Notes/components/Note.js new file mode 100644 index 0000000..d23806a --- /dev/null +++ b/apps/Notes/components/Note.js @@ -0,0 +1,140 @@ +import React, {useState, useContext} from 'react' +import Context from 'context'; +import fetchJson from 'lib/fetchJson' +import useNotes from '../hooks/useNotes' +import {addNote, updateNote} from '../helpers/noteActions.js' + +const Note = ({action, setAction, fetchedNote}) => { + const [text, setText] = useState('') + const {mutateNotes} = useNotes() + const [errorMsg, setErrorMsg] = useState('') + const {setPopup} = useContext(Context) + + const handleSubmit = e => { + e.preventDefault() + fetchedNote + ? updateNote(e, fetchedNote, mutateNotes, setAction, setPopup) + : addNote(e, mutateNotes, setAction, setPopup) + } + + // if (!fetchedNote) return

Loading...

+ // if (fetchedNote.error) { + // setFetchedNote() + // setAction('') + // } + + return ( +
+

{fetchedNote ? 'Edit note:' : 'Add new note:'}

+
+ +