From b8f9035be1a3af2962c150ada548a78258c0e869 Mon Sep 17 00:00:00 2001 From: Marquis Kurt Date: Sat, 30 Mar 2019 17:13:49 -0400 Subject: [PATCH] Work on adding basic posts --- package-lock.json | 208 ++++++++++- package.json | 17 +- src/App.tsx | 16 +- src/components/AppLayout/AppLayout.styles.tsx | 1 - src/components/AppLayout/AppLayout.tsx | 20 +- .../Attachment/Attachment.styles.tsx | 16 + src/components/Attachment/Attachment.tsx | 105 ++++++ src/components/Attachment/index.tsx | 5 + src/components/Post/Post.styles.tsx | 58 +++ src/components/Post/Post.tsx | 341 ++++++++++++++++++ src/components/Post/PostShareMenu.tsx | 15 + src/components/Post/index.tsx | 6 + src/index.tsx | 11 +- src/interfaces/overrides.tsx | 33 +- src/pages/About.tsx | 2 +- src/pages/Home.tsx | 157 ++++++++ src/pages/PageLayout.styles.tsx | 31 +- src/pages/ProfilePage.tsx | 189 ++++++++-- 18 files changed, 1146 insertions(+), 85 deletions(-) create mode 100644 src/components/Attachment/Attachment.styles.tsx create mode 100644 src/components/Attachment/Attachment.tsx create mode 100644 src/components/Attachment/index.tsx create mode 100644 src/components/Post/Post.styles.tsx create mode 100644 src/components/Post/Post.tsx create mode 100644 src/components/Post/PostShareMenu.tsx create mode 100644 src/components/Post/index.tsx create mode 100644 src/pages/Home.tsx diff --git a/package-lock.json b/package-lock.json index ee45b63..8861623 100644 --- a/package-lock.json +++ b/package-lock.json @@ -945,9 +945,9 @@ "dev": true }, "@material-ui/core": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.9.2.tgz", - "integrity": "sha512-aukR3mSH3g115St2OnqoeMRtmxzxxx+Mch7pFKRV3Tz3URExBlZwOolimjxKZpG4LGec8HlhREawafLsDzjVWQ==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.9.3.tgz", + "integrity": "sha512-REIj62+zEvTgI/C//YL4fZxrCVIySygmpZglsu/Nl5jPqy3CDjZv1F9ubBYorHqmRgeVPh64EghMMWqk4egmfg==", "dev": true, "requires": { "@babel/runtime": "^7.2.0", @@ -1272,6 +1272,15 @@ "@types/react-router": "*" } }, + "@types/react-swipeable-views": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@types/react-swipeable-views/-/react-swipeable-views-0.13.0.tgz", + "integrity": "sha512-orrreCcXev6IUXDuHf07RDDCAoIZRMSr95eyWmYNRfjic7w/O+68iPu0NCysVls+UygRNvoqZMuXI72N/58E1w==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/react-transition-group": { "version": "2.0.16", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.16.tgz", @@ -4494,6 +4503,17 @@ "sha.js": "^2.4.8" } }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "dev": true, + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "create-react-context": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", @@ -10424,6 +10444,12 @@ "array-includes": "^3.0.3" } }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=", + "dev": true + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -10786,9 +10812,9 @@ "dev": true }, "megalodon": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/megalodon/-/megalodon-0.5.1.tgz", - "integrity": "sha512-gnE12mA2zClg0fsPo6ARszJiUGpbM48hL1kWtK/3M8KrrnG7V33cyg9qwaCZNkOmmu+aUxZjesgTlG3PT1mI0A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/megalodon/-/megalodon-0.6.0.tgz", + "integrity": "sha512-SXk6DqM02NJGLppr4XpCKDX3HqsPBS1fyuxm19IPmMlHRerChVyIDoWlmxlAEq3jdcCQrMmVVC/E5QuoO5uc0Q==", "dev": true, "requires": { "@types/oauth": "^0.9.0", @@ -11094,6 +11120,12 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -11362,6 +11394,16 @@ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, + "notistack": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-0.5.1.tgz", + "integrity": "sha512-Pym0iWYCDFsC3imDL+zx4lWjkeEu6s/mlIDq6m+VRpHPPNFJErNcHCqo+xakvkkpOOR3fz4Y802GtMk8GDFVIA==", + "dev": true, + "requires": { + "classnames": "^2.2.6", + "prop-types": "^15.6.2" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -14846,15 +14888,15 @@ } }, "react": { - "version": "16.8.5", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.5.tgz", - "integrity": "sha512-daCb9TD6FZGvJ3sg8da1tRAtIuw29PbKZW++NN4wqkbEvxL+bZpaaYb4xuftW/SpXmgacf1skXl/ddX6CdOlDw==", + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", + "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.13.5" + "scheduler": "^0.13.6" } }, "react-app-polyfill": { @@ -15004,15 +15046,15 @@ } }, "react-dom": { - "version": "16.8.5", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.5.tgz", - "integrity": "sha512-VIEIvZLpFafsfu4kgmftP5L8j7P1f0YThfVTrANMhZUFMDOsA6e0kfR6wxw/8xxKs4NB59TZYbxNdPCDW34x4w==", + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", + "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.13.5" + "scheduler": "^0.13.6" } }, "react-error-overlay": { @@ -15149,10 +15191,99 @@ "workbox-webpack-plugin": "3.6.3" } }, + "react-swipeable-views": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/react-swipeable-views/-/react-swipeable-views-0.13.1.tgz", + "integrity": "sha512-zZIRBD+HFO0P5z3TCkDMsSG/Sc3LXGGtojO+dEAGxsPvZjc3ji4Z/oOcLjZ4ozl0xIlLQJZ89o1rR82H/MDBHw==", + "dev": true, + "requires": { + "@babel/runtime": "7.0.0", + "dom-helpers": "^3.2.1", + "prop-types": "^15.5.4", + "react-swipeable-views-core": "^0.13.1", + "react-swipeable-views-utils": "^0.13.1", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } + } + }, + "react-swipeable-views-core": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/react-swipeable-views-core/-/react-swipeable-views-core-0.13.1.tgz", + "integrity": "sha512-EP8sCvvD7VDiZLglPt9icMuMNu8qLRLk0ab/fB1HXv7lX8ClnwF3UMCM0ZrN3sguSY7CsX3LevducGGsT1VcDg==", + "dev": true, + "requires": { + "@babel/runtime": "7.0.0", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } + } + }, + "react-swipeable-views-utils": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.1.tgz", + "integrity": "sha512-r5eyPIIHnlvILvFHXGnASDXa3RwC6X2YevegA2II5fhzYqwQRpJ81+lnzknNg5hiIN6ucXc5vrkqRRjabAhMpA==", + "dev": true, + "requires": { + "@babel/runtime": "7.0.0", + "fbjs": "^0.8.4", + "keycode": "^2.1.7", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.0", + "react-swipeable-views-core": "^0.13.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } + } + }, "react-transition-group": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.7.0.tgz", - "integrity": "sha512-CzF22K0x6arjQO4AxkasMaiYcFG/QH0MhPNs45FmNsfWsQmsO9jv52sIZJAalnlryD5RgrrbLtV5CMJSokrrMA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.7.1.tgz", + "integrity": "sha512-b0VJTzNRnXxRpCuxng6QJbAzmmrhBn1BZJfPPnHbH2PIo8msdkajqwtfdyGm/OypPXZNfAHKEqeN15wjMXrRJQ==", "dev": true, "requires": { "dom-helpers": "^3.3.1", @@ -15161,6 +15292,43 @@ "react-lifecycles-compat": "^3.0.4" } }, + "react-web-share-api": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/react-web-share-api/-/react-web-share-api-0.0.2.tgz", + "integrity": "sha1-pp7BMEYXHnb3JIq8XU7ufdj3slo=", + "dev": true, + "requires": { + "react": "^15.5.0", + "react-dom": "^15.5.0" + }, + "dependencies": { + "react": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "dev": true, + "requires": { + "create-react-class": "^15.6.0", + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } + }, + "react-dom": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", + "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", + "dev": true, + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } + } + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -16375,9 +16543,9 @@ "dev": true }, "scheduler": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.5.tgz", - "integrity": "sha512-K98vjkQX9OIt/riLhp6F+XtDPtMQhqNcf045vsh+pcuvHq+PHy1xCrH3pq1P40m6yR46lpVvVhKdEOtnimuUJw==", + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", "dev": true, "requires": { "loose-envify": "^1.1.0", diff --git a/package.json b/package.json index d7ba21b..3485b38 100644 --- a/package.json +++ b/package.json @@ -3,22 +3,27 @@ "version": "1.0.0", "private": true, "devDependencies": { - "@material-ui/core": "^3.9.2", + "@material-ui/core": "^3.9.3", "@material-ui/icons": "^3.0.2", "@types/jest": "24.0.11", "@types/node": "11.11.6", "@types/react": "16.8.8", "@types/react-dom": "16.8.3", "@types/react-router-dom": "^4.3.1", - "megalodon": "latest", - "react": "^16.8.5", - "react-dom": "^16.8.5", + "@types/react-swipeable-views": "latest", + "megalodon": "^0.6.0", + "moment": "^2.24.0", + "react": "^16.8.6", + "react-dom": "^16.8.6", "react-router-dom": "^5.0.0", "react-scripts": "2.1.8", - "typescript": "3.3.4000" + "react-swipeable-views": "^0.13.1", + "typescript": "3.3.4000", + "notistack": "^0.5.1", + "react-web-share-api": "^0.0.2" }, "scripts": { - "start": "react-scripts start", + "start": "BROWSER='Safari Technology Preview' react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" diff --git a/src/App.tsx b/src/App.tsx index d2a17c6..552118f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,5 @@ import React, { Component } from 'react'; -import {MuiThemeProvider, CssBaseline, withStyles, Typography } from '@material-ui/core'; +import {MuiThemeProvider, CssBaseline, withStyles } from '@material-ui/core'; import { setHyperspaceTheme, darkMode } from './utilities/themes'; import AppLayout from './components/AppLayout'; import {styles} from './App.styles'; @@ -8,11 +8,16 @@ import AboutPage from './pages/About'; import Settings from './pages/Settings'; import { getUserDefaultBool, getUserDefaultTheme } from './utilities/settings'; import ProfilePage from './pages/ProfilePage'; +import HomePage from './pages/Home'; +import {withSnackbar} from 'notistack'; +import {ProfileRoute} from './interfaces/overrides'; let theme = setHyperspaceTheme(getUserDefaultTheme()); class App extends Component { + offline: any; + constructor(props: any) { super(props); @@ -28,17 +33,18 @@ class App extends Component { render() { const { classes } = this.props; + return ( - - + + - + }/> @@ -47,4 +53,4 @@ class App extends Component { } } -export default withStyles(styles)(App); +export default withStyles(styles)(withSnackbar(App)); diff --git a/src/components/AppLayout/AppLayout.styles.tsx b/src/components/AppLayout/AppLayout.styles.tsx index 8462cf9..1287130 100644 --- a/src/components/AppLayout/AppLayout.styles.tsx +++ b/src/components/AppLayout/AppLayout.styles.tsx @@ -6,7 +6,6 @@ export const styles = (theme: Theme) => createStyles({ root: { width: '100%', display: 'flex', - height: '100%' }, stickyArea: { position: 'fixed', diff --git a/src/components/AppLayout/AppLayout.tsx b/src/components/AppLayout/AppLayout.tsx index fa06a57..3c3bdac 100644 --- a/src/components/AppLayout/AppLayout.tsx +++ b/src/components/AppLayout/AppLayout.tsx @@ -177,15 +177,17 @@ export class AppLayout extends Component { className={classes.acctMenu} > - - - - - - - - Switch account - Log out +
+ + + + + + + + Switch account + Log out +
diff --git a/src/components/Attachment/Attachment.styles.tsx b/src/components/Attachment/Attachment.styles.tsx new file mode 100644 index 0000000..ad83d5b --- /dev/null +++ b/src/components/Attachment/Attachment.styles.tsx @@ -0,0 +1,16 @@ +import { Theme, createStyles } from '@material-ui/core'; + +export const styles = (theme: Theme) => createStyles({ + mediaContainer: { + padding: theme.spacing.unit * 2, + }, + mediaObject: { + width: '100%', + height: '100%' + }, + mediaSlide: { + backgroundColor: theme.palette.primary.light, + width: '100%', + height: 'auto' + } +}); \ No newline at end of file diff --git a/src/components/Attachment/Attachment.tsx b/src/components/Attachment/Attachment.tsx new file mode 100644 index 0000000..9ca470c --- /dev/null +++ b/src/components/Attachment/Attachment.tsx @@ -0,0 +1,105 @@ +import React, { Component } from 'react'; +import {withStyles, Typography, MobileStepper, Button} from '@material-ui/core'; +import { styles } from './Attachment.styles'; +import { Attachment } from '../../types/Attachment'; +import SwipeableViews from 'react-swipeable-views'; + +interface IAttachmentProps { + media: [Attachment]; + classes?: any; +} + +interface IAttachmentState { + totalSteps: number; + currentStep: number; + attachments: [Attachment]; +} + +class AttachmentComponent extends Component { + constructor(props: IAttachmentProps) { + super(props); + + this.state = { + attachments: this.props.media, + totalSteps: this.props.media.length, + currentStep: 0 + } + } + + moveBack() { + let nextStep = this.state.currentStep - 1; + if (nextStep < 0) { + nextStep = 0; + } + this.setState({ currentStep: nextStep }); + } + + moveForward() { + let nextStep = this.state.currentStep + 1; + if (nextStep > this.state.totalSteps) { + nextStep = this.state.totalSteps; + } + this.setState({ currentStep: nextStep }); + + } + + handleStepChange(currentStep: number) { + this.setState({ + currentStep + }) + } + + getSlide(slide: Attachment) { + const {classes} = this.props; + switch (slide.type) { + case 'image': + return {slide.description? + case 'video': + return