Minor content change to header; refactor project structure; prettier-standard everything

This commit is contained in:
mitchell 2019-07-06 15:01:47 -04:00
parent 24f7976b5b
commit 1a01fb36f4
22 changed files with 168 additions and 162 deletions

56
package-lock.json generated
View File

@ -1770,7 +1770,7 @@
}, },
"array-equal": { "array-equal": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
}, },
"array-filter": { "array-filter": {
@ -1971,7 +1971,7 @@
}, },
"chalk": { "chalk": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"requires": { "requires": {
"ansi-styles": "^2.2.1", "ansi-styles": "^2.2.1",
@ -2151,7 +2151,7 @@
}, },
"babel-plugin-syntax-object-rest-spread": { "babel-plugin-syntax-object-rest-spread": {
"version": "6.13.0", "version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
"integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
}, },
"babel-plugin-transform-object-rest-spread": { "babel-plugin-transform-object-rest-spread": {
@ -2530,7 +2530,7 @@
}, },
"browserify-aes": { "browserify-aes": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"requires": { "requires": {
"buffer-xor": "^1.0.3", "buffer-xor": "^1.0.3",
@ -2564,7 +2564,7 @@
}, },
"browserify-rsa": { "browserify-rsa": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
"requires": { "requires": {
"bn.js": "^4.1.0", "bn.js": "^4.1.0",
@ -2613,7 +2613,7 @@
}, },
"buffer": { "buffer": {
"version": "4.9.1", "version": "4.9.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
"integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
"requires": { "requires": {
"base64-js": "^1.0.2", "base64-js": "^1.0.2",
@ -2713,7 +2713,7 @@
}, },
"callsites": { "callsites": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
"integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
}, },
"camel-case": { "camel-case": {
@ -3385,7 +3385,7 @@
}, },
"clone-deep": { "clone-deep": {
"version": "0.2.4", "version": "0.2.4",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", "resolved": "http://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
"integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
"requires": { "requires": {
"for-own": "^0.1.3", "for-own": "^0.1.3",
@ -3668,7 +3668,7 @@
}, },
"create-hash": { "create-hash": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
"requires": { "requires": {
"cipher-base": "^1.0.1", "cipher-base": "^1.0.1",
@ -3680,7 +3680,7 @@
}, },
"create-hmac": { "create-hmac": {
"version": "1.1.7", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"requires": { "requires": {
"cipher-base": "^1.0.3", "cipher-base": "^1.0.3",
@ -3731,7 +3731,7 @@
}, },
"css-color-names": { "css-color-names": {
"version": "0.0.4", "version": "0.0.4",
"resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
"integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
}, },
"css-declaration-sorter": { "css-declaration-sorter": {
@ -4112,7 +4112,7 @@
"dependencies": { "dependencies": {
"globby": { "globby": {
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
"integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
"requires": { "requires": {
"array-union": "^1.0.1", "array-union": "^1.0.1",
@ -4124,7 +4124,7 @@
"dependencies": { "dependencies": {
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
} }
} }
@ -4186,7 +4186,7 @@
}, },
"diffie-hellman": { "diffie-hellman": {
"version": "5.0.3", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"requires": { "requires": {
"bn.js": "^4.1.0", "bn.js": "^4.1.0",
@ -4328,7 +4328,7 @@
}, },
"duplexer": { "duplexer": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
"integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
}, },
"duplexify": { "duplexify": {
@ -6321,7 +6321,7 @@
}, },
"is-obj": { "is-obj": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
}, },
"is-path-cwd": { "is-path-cwd": {
@ -8011,7 +8011,7 @@
}, },
"media-typer": { "media-typer": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
}, },
"mem": { "mem": {
@ -8224,7 +8224,7 @@
}, },
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
@ -8683,7 +8683,7 @@
}, },
"os-tmpdir": { "os-tmpdir": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
}, },
"p-defer": { "p-defer": {
@ -8837,7 +8837,7 @@
}, },
"path-is-absolute": { "path-is-absolute": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
}, },
"path-is-inside": { "path-is-inside": {
@ -10376,7 +10376,7 @@
}, },
"readable-stream": { "readable-stream": {
"version": "2.3.6", "version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": { "requires": {
"core-util-is": "~1.0.0", "core-util-is": "~1.0.0",
@ -10494,7 +10494,7 @@
"dependencies": { "dependencies": {
"jsesc": { "jsesc": {
"version": "0.5.0", "version": "0.5.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
} }
} }
@ -10775,7 +10775,7 @@
}, },
"safe-regex": { "safe-regex": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
"requires": { "requires": {
"ret": "~0.1.10" "ret": "~0.1.10"
@ -11031,7 +11031,7 @@
}, },
"sha.js": { "sha.js": {
"version": "2.4.11", "version": "2.4.11",
"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"requires": { "requires": {
"inherits": "^2.0.1", "inherits": "^2.0.1",
@ -11056,7 +11056,7 @@
}, },
"kind-of": { "kind-of": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
"integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
"requires": { "requires": {
"is-buffer": "^1.0.2" "is-buffer": "^1.0.2"
@ -11589,7 +11589,7 @@
}, },
"strip-eof": { "strip-eof": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
}, },
"strip-json-comments": { "strip-json-comments": {
@ -11857,7 +11857,7 @@
}, },
"through": { "through": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
}, },
"through2": { "through2": {
@ -12935,7 +12935,7 @@
}, },
"wrap-ansi": { "wrap-ansi": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"requires": { "requires": {
"string-width": "^1.0.1", "string-width": "^1.0.1",

View File

@ -1,19 +1,19 @@
// @flow // @flow
import React from "react" import React from 'react'
import Header from "./components/Header" import Header from './components/Header'
import Navbar from "./components/Navbar" import Navbar from './components/Navbar'
import Routes from "./routes" import Routes from './routes'
import "./Website.css" import './Website.css'
type Props = {} type Props = {}
class Website extends React.Component<Props> { class Website extends React.Component<Props> {
render() { render () {
return ( return (
<div className="website"> <div className='website'>
<div className="main-container"> <div className='main-container'>
<Navbar /> <Navbar />
<Header /> <Header />
<Routes /> <Routes />

View File

@ -1,9 +1,9 @@
import React from "react" import React from 'react'
import ReactDOM from "react-dom" import ReactDOM from 'react-dom'
import Website from "./Website.js" import Website from './Website.js'
it("renders without crashing", () => { it('renders without crashing', () => {
const div = document.createElement("div") const div = document.createElement('div')
ReactDOM.render(<Website />, div) ReactDOM.render(<Website />, div)
ReactDOM.unmountComponentAtNode(div) ReactDOM.unmountComponentAtNode(div)
}) })

View File

@ -1,7 +1,7 @@
// @flow // @flow
import React from "react" import React from 'react'
import "./index.css" import './index.css'
type Props = { type Props = {
href: string, href: string,
@ -9,9 +9,9 @@ type Props = {
} }
class ClearButton extends React.PureComponent<Props> { class ClearButton extends React.PureComponent<Props> {
render() { render () {
return ( return (
<a className="clear-button" href={this.props.href}> <a className='clear-button' href={this.props.href}>
{this.props.children} {this.props.children}
</a> </a>
) )

View File

@ -1,22 +0,0 @@
// @flow
import React from "react"
import "./index.css"
import linkedIn from "../../images/In-2C-128px-TM.png"
type Props = {}
class Contact extends React.PureComponent<Props> {
render() {
return (
<div className="contact-container">
<p>m@mjfs.us</p>
<a href="https://www.linkedin.com/in/mitchelljfsimon/">
<img src={linkedIn} alt="LinkedIn" />
</a>
</div>
)
}
}
export default Contact

View File

@ -1,18 +1,23 @@
// @flow // @flow
import React from "react" import React from 'react'
import SmallText from "../SmallText" import SmallText from '../SmallText'
import "./index.css" import './index.css'
type Props = {} type Props = {}
class Header extends React.PureComponent<Props> { class Header extends React.PureComponent<Props> {
render() { render () {
return ( return (
<div className="header-container"> <div className='header-container'>
<h2>Mitchell J. F. Simon</h2> <h2>Mitchell J. F. Simon</h2>
<SmallText>Backend Engineer, TV Time</SmallText> <SmallText>
Software engineer;&nbsp;
<span style={{ display: 'inline-block' }}>
cloud-native web services and clients
</span>
</SmallText>
</div> </div>
) )
} }

View File

@ -1,8 +1,8 @@
// @flow // @flow
import * as React from "react" import * as React from 'react'
import SmallText from "../../components/SmallText" import SmallText from '../../components/SmallText'
import "./index.css" import './index.css'
type Props = { type Props = {
title: string, title: string,
@ -14,7 +14,7 @@ type Props = {
class Experience extends React.PureComponent<Props> { class Experience extends React.PureComponent<Props> {
listedBullets: Array<React.Element<string>> listedBullets: Array<React.Element<string>>
constructor(props: Props) { constructor (props: Props) {
super(props) super(props)
this.listedBullets = this.props.bullets.map((bullet, index) => ( this.listedBullets = this.props.bullets.map((bullet, index) => (
@ -22,11 +22,11 @@ class Experience extends React.PureComponent<Props> {
)) ))
} }
render() { render () {
return ( return (
<div className="job-container"> <div className='job-container'>
<div className="job-title">{this.props.title}</div> <div className='job-title'>{this.props.title}</div>
<div className="job-company">{this.props.company}</div> <div className='job-company'>{this.props.company}</div>
<SmallText>{this.props.timeSpan}</SmallText> <SmallText>{this.props.timeSpan}</SmallText>
<ul>{this.listedBullets}</ul> <ul>{this.listedBullets}</ul>
</div> </div>

View File

@ -1,11 +1,11 @@
// @flow // @flow
import * as React from "react" import * as React from 'react'
import { NavLink } from "react-router-dom" import { NavLink } from 'react-router-dom'
import FontAwesomeIcon from "@fortawesome/react-fontawesome" import FontAwesomeIcon from '@fortawesome/react-fontawesome'
import faBars from "@fortawesome/fontawesome-free-solid/faBars" import faBars from '@fortawesome/fontawesome-free-solid/faBars'
import "./index.css" import './index.css'
import { routes } from "../../routes/routes.js" import { routes } from '../../routes/routes.js'
const changeMenu = 800 const changeMenu = 800
@ -18,7 +18,7 @@ type State = {
class Navbar extends React.Component<Props, State> { class Navbar extends React.Component<Props, State> {
buttons: Array<NavLink<string>> buttons: Array<NavLink<string>>
constructor(props: Props) { constructor (props: Props) {
super(props) super(props)
if (window.innerWidth <= changeMenu) { if (window.innerWidth <= changeMenu) {
@ -30,8 +30,8 @@ class Navbar extends React.Component<Props, State> {
this.buttons = routes.map(route => ( this.buttons = routes.map(route => (
<NavLink <NavLink
key={route.name} key={route.name}
className="navbar-menu-button" className='navbar-menu-button'
activeClassName="active-button" activeClassName='active-button'
exact={route.exact} exact={route.exact}
to={route.path} to={route.path}
onClick={this.closeMenu} onClick={this.closeMenu}
@ -56,7 +56,7 @@ class Navbar extends React.Component<Props, State> {
} }
} }
render() { render () {
let menuButton: ?React.Element<string> let menuButton: ?React.Element<string>
if (this.isMobile()) { if (this.isMobile()) {
@ -64,8 +64,8 @@ class Navbar extends React.Component<Props, State> {
<div <div
className={ className={
this.state.showMenu this.state.showMenu
? "navbar-button navbar-button-closed" ? 'navbar-button navbar-button-closed'
: "navbar-button" : 'navbar-button'
} }
onClick={this.toggleMenu} onClick={this.toggleMenu}
> >
@ -75,10 +75,10 @@ class Navbar extends React.Component<Props, State> {
} }
return ( return (
<div className="navbar"> <div className='navbar'>
{menuButton} {menuButton}
{this.state.showMenu ? ( {this.state.showMenu ? (
<div className="navbar-menu">{this.buttons}</div> <div className='navbar-menu'>{this.buttons}</div>
) : null} ) : null}
</div> </div>
) )

View File

@ -1,9 +1,9 @@
// @flow // @flow
import * as React from "react" import * as React from 'react'
import ClearButton from "../../components/ClearButton" import ClearButton from '../../components/ClearButton'
import "./index.css" import './index.css'
type Badge = { type Badge = {
imgUrl: string, imgUrl: string,
@ -21,15 +21,15 @@ type Props = {
class Project extends React.PureComponent<Props> { class Project extends React.PureComponent<Props> {
renderBadges = (badges: Array<Badge>) => { renderBadges = (badges: Array<Badge>) => {
return this.props.badges.map((badge, index) => ( return this.props.badges.map((badge, index) => (
<a className="project-badge" href={badge.linkUrl} key={index}> <a className='project-badge' href={badge.linkUrl} key={index}>
<img src={badge.imgUrl} alt={badge.alt} /> <img src={badge.imgUrl} alt={badge.alt} />
</a> </a>
)) ))
} }
render() { render () {
return ( return (
<div className="project-container"> <div className='project-container'>
<h4>{this.props.title}</h4> <h4>{this.props.title}</h4>
{this.renderBadges(this.props.badges)} {this.renderBadges(this.props.badges)}
<p>{this.props.children}</p> <p>{this.props.children}</p>

View File

@ -1,15 +1,15 @@
// @flow // @flow
import React from "react" import React from 'react'
import "./index.css" import './index.css'
type Props = { type Props = {
children: string children: string
} }
class SmallText extends React.PureComponent<Props> { class SmallText extends React.PureComponent<Props> {
render() { render () {
return <div className="small-text">{this.props.children}</div> return <div className='small-text'>{this.props.children}</div>
} }
} }

View File

@ -1,15 +1,15 @@
import React from "react" import React from 'react'
import ReactDOM from "react-dom" import ReactDOM from 'react-dom'
import { BrowserRouter } from "react-router-dom" import { BrowserRouter } from 'react-router-dom'
import "./index.css" import './index.css'
import Website from "./Website" import Website from './Website'
import registerServiceWorker from "./registerServiceWorker" import registerServiceWorker from './registerServiceWorker'
ReactDOM.render( ReactDOM.render(
<BrowserRouter> <BrowserRouter>
<Website /> <Website />
</BrowserRouter>, </BrowserRouter>,
document.getElementById("root") document.getElementById('root')
) )
registerServiceWorker() registerServiceWorker()

View File

@ -9,17 +9,17 @@
// This link also includes instructions on opting out of this behavior. // This link also includes instructions on opting out of this behavior.
const isLocalhost = Boolean( const isLocalhost = Boolean(
window.location.hostname === "localhost" || window.location.hostname === 'localhost' ||
// [::1] is the IPv6 localhost address. // [::1] is the IPv6 localhost address.
window.location.hostname === "[::1]" || window.location.hostname === '[::1]' ||
// 127.0.0.1/8 is considered localhost for IPv4. // 127.0.0.1/8 is considered localhost for IPv4.
window.location.hostname.match( window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
) )
) )
export default function register() { export default function register () {
if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
// The URL constructor is available in all browsers that support SW. // The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location) // eslint-disable-line no-undef const publicUrl = new URL(process.env.PUBLIC_URL, window.location) // eslint-disable-line no-undef
if (publicUrl.origin !== window.location.origin) { if (publicUrl.origin !== window.location.origin) {
@ -29,7 +29,7 @@ export default function register() {
return return
} }
window.addEventListener("load", () => { window.addEventListener('load', () => {
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js` const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`
if (isLocalhost) { if (isLocalhost) {
@ -40,8 +40,8 @@ export default function register() {
// service worker/PWA documentation. // service worker/PWA documentation.
navigator.serviceWorker.ready.then(() => { navigator.serviceWorker.ready.then(() => {
console.log( console.log(
"This web app is being served cache-first by a service " + 'This web app is being served cache-first by a service ' +
"worker. To learn more, visit https://goo.gl/SC7cgQ" 'worker. To learn more, visit https://goo.gl/SC7cgQ'
) )
}) })
} else { } else {
@ -52,43 +52,43 @@ export default function register() {
} }
} }
function registerValidSW(swUrl) { function registerValidSW (swUrl) {
navigator.serviceWorker navigator.serviceWorker
.register(swUrl) .register(swUrl)
.then(registration => { .then(registration => {
registration.onupdatefound = () => { registration.onupdatefound = () => {
const installingWorker = registration.installing const installingWorker = registration.installing
installingWorker.onstatechange = () => { installingWorker.onstatechange = () => {
if (installingWorker.state === "installed") { if (installingWorker.state === 'installed') {
if (navigator.serviceWorker.controller) { if (navigator.serviceWorker.controller) {
// At this point, the old content will have been purged and // At this point, the old content will have been purged and
// the fresh content will have been added to the cache. // the fresh content will have been added to the cache.
// It's the perfect time to display a "New content is // It's the perfect time to display a "New content is
// available; please refresh." message in your web app. // available; please refresh." message in your web app.
console.log("New content is available; please refresh.") console.log('New content is available; please refresh.')
} else { } else {
// At this point, everything has been precached. // At this point, everything has been precached.
// It's the perfect time to display a // It's the perfect time to display a
// "Content is cached for offline use." message. // "Content is cached for offline use." message.
console.log("Content is cached for offline use.") console.log('Content is cached for offline use.')
} }
} }
} }
} }
}) })
.catch(error => { .catch(error => {
console.error("Error during service worker registration:", error) console.error('Error during service worker registration:', error)
}) })
} }
function checkValidServiceWorker(swUrl) { function checkValidServiceWorker (swUrl) {
// Check if the service worker can be found. If it can't reload the page. // Check if the service worker can be found. If it can't reload the page.
fetch(swUrl) // eslint-disable-line no-undef fetch(swUrl) // eslint-disable-line no-undef
.then(response => { .then(response => {
// Ensure service worker exists, and that we really are getting a JS file. // Ensure service worker exists, and that we really are getting a JS file.
if ( if (
response.status === 404 || response.status === 404 ||
response.headers.get("content-type").indexOf("javascript") === -1 response.headers.get('content-type').indexOf('javascript') === -1
) { ) {
// No service worker found. Probably a different app. Reload the page. // No service worker found. Probably a different app. Reload the page.
navigator.serviceWorker.ready.then(registration => { navigator.serviceWorker.ready.then(registration => {
@ -103,13 +103,13 @@ function checkValidServiceWorker(swUrl) {
}) })
.catch(() => { .catch(() => {
console.log( console.log(
"No internet connection found. App is running in offline mode." 'No internet connection found. App is running in offline mode.'
) )
}) })
} }
export function unregister() { export function unregister () {
if ("serviceWorker" in navigator) { if ('serviceWorker' in navigator) {
navigator.serviceWorker.ready.then(registration => { navigator.serviceWorker.ready.then(registration => {
registration.unregister() registration.unregister()
}) })

View File

@ -1,8 +1,8 @@
// @flow // @flow
import React from "react" import React from 'react'
import { Route, Switch } from "react-router-dom" import { Route, Switch } from 'react-router-dom'
import { routes, redirects } from "./routes.js" import { routes, redirects } from './routes.js'
type Props = {} type Props = {}
@ -10,7 +10,7 @@ class Routes extends React.Component<Props> {
routes: Array<Route> routes: Array<Route>
redirects: Array<Route> redirects: Array<Route>
constructor(props: Props) { constructor (props: Props) {
super(props) super(props)
this.routes = routes.map(route => ( this.routes = routes.map(route => (
@ -27,7 +27,7 @@ class Routes extends React.Component<Props> {
)) ))
} }
render() { render () {
return ( return (
<Switch> <Switch>
{this.routes} {this.routes}

View File

@ -1,24 +1,24 @@
// @flow // @flow
import Home from "../components/Home" import Home from '../screens/Home'
import Projects from "../containers/Projects" import Projects from '../screens/Projects'
import Contact from "../components/Contact" import Contact from '../screens/Contact'
const routes = [ const routes = [
{ {
path: "/", path: '/',
name: "Home", name: 'Home',
component: Home, component: Home,
exact: true exact: true
}, },
{ {
path: "/projects", path: '/projects',
name: "Projects", name: 'Projects',
component: Projects, component: Projects,
exact: false exact: false
}, },
{ {
path: "/contact", path: '/contact',
name: "Contact", name: 'Contact',
component: Contact, component: Contact,
exact: false exact: false
} }
@ -26,8 +26,8 @@ const routes = [
const redirects = [ const redirects = [
{ {
path: "/linkedin", path: '/linkedin',
func: () => (window.location = "https://linkedin.com/in/mitchelljfsimon") func: () => (window.location = 'https://linkedin.com/in/mitchelljfsimon')
} }
] ]

View File

@ -0,0 +1,22 @@
// @flow
import React from 'react'
import './index.css'
import linkedIn from '../../images/In-2C-128px-TM.png'
type Props = {}
class Contact extends React.PureComponent<Props> {
render () {
return (
<div className='contact-container'>
<p>m@mjfs.us</p>
<a href='https://www.linkedin.com/in/mitchelljfsimon/'>
<img src={linkedIn} alt='LinkedIn' />
</a>
</div>
)
}
}
export default Contact

View File

@ -1,10 +1,10 @@
// @flow // @flow
import * as React from "react" import * as React from 'react'
import "./index.css" import './index.css'
import JobComponent from "../../components/Job" import JobComponent from '../../components/Job'
import jobsData from "../../data/jobs.json" import jobsData from '../../data/jobs.json'
type Props = {} type Props = {}
@ -28,9 +28,9 @@ class Experience extends React.PureComponent<Props> {
)) ))
} }
render() { render () {
return ( return (
<div className="experience-container">{this.renderJobs(jobsData)}</div> <div className='experience-container'>{this.renderJobs(jobsData)}</div>
) )
} }
} }

View File

@ -18,8 +18,9 @@ class Home extends React.PureComponent<Props> {
services with cloud-native architectures. Tech that I love working services with cloud-native architectures. Tech that I love working
with includes Go, TypeScript, gRPC, Serverless, Docker, Redis, and with includes Go, TypeScript, gRPC, Serverless, Docker, Redis, and
PostgreSQL. Concepts that I am currently focused on are Docker PostgreSQL. Concepts that I am currently focused on are Docker
containerization and orchestration, microservices software architecture containerization and orchestration, microservices software
w/ dependency injection, and infrastructure as code using Terraform. architecture w/ dependency injection, and infrastructure as code using
Terraform.
</p> </p>
<p> <p>
My professional interests, aside from the above, include software My professional interests, aside from the above, include software

View File

@ -1,11 +1,11 @@
// @flow // @flow
import * as React from "react" import * as React from 'react'
import ProjectComponent from "../../components/Project" import ProjectComponent from '../../components/Project'
import "./index.css" import './index.css'
import projectsData from "../../data/projects.json" import projectsData from '../../data/projects.json'
type Props = {} type Props = {}
@ -36,9 +36,9 @@ class Projects extends React.PureComponent<Props> {
)) ))
} }
render() { render () {
return ( return (
<div className="projects-container"> <div className='projects-container'>
{this.renderProjects(projectsData)} {this.renderProjects(projectsData)}
</div> </div>
) )