diff --git a/apps/js-machine-front/src/app/App.tsx b/apps/js-machine-front/src/app/App.tsx index 9644856..69f8c0c 100644 --- a/apps/js-machine-front/src/app/App.tsx +++ b/apps/js-machine-front/src/app/App.tsx @@ -1,4 +1,4 @@ -import React, { memo, useMemo } from 'react'; +import React, { useMemo } from 'react'; import './firebase.conf'; import { theme } from './theme'; @@ -13,6 +13,7 @@ import { Authorization } from './scenes/authorization/Authorization'; import { Route, Redirect, Switch, Router } from 'react-router'; import { ThemeProvider } from '@material-ui/styles'; import { SnackbarProvider } from 'notistack'; +import { Snowflakes } from './components/Snowflakes'; import { createBrowserHistory } from 'history'; import { observer } from 'mobx-react-lite'; @@ -32,6 +33,7 @@ export const App: React.FC = observer(() => { return ( + diff --git a/apps/js-machine-front/src/app/components/Snowflakes.tsx b/apps/js-machine-front/src/app/components/Snowflakes.tsx new file mode 100644 index 0000000..0ed3b2d --- /dev/null +++ b/apps/js-machine-front/src/app/components/Snowflakes.tsx @@ -0,0 +1,89 @@ +import React from 'react'; + +import Switch from '@material-ui/core/Switch'; +import { makeStyles } from '@material-ui/core/styles'; + +import { useSnowflakes } from './hooks/useSnowflakes'; + +const MAIN_YELLOW = '#F2E14C'; + +const useStyles = makeStyles( theme => ({ + snow: { + position: 'fixed', + height: '100%', + width: '100%', + zIndex: 1, + pointerEvents: 'none', + }, + snowSwitcher: { + display: 'flex', + color: 'white', + position: 'absolute', + zIndex: 1101, + [theme.breakpoints.up('md')]: { + top: '29px', + left: '38px', + }, + [theme.breakpoints.down('sm')]: { + top: '18px', + left: '24px', + }, + [theme.breakpoints.down('xs')]: { + top: '-2px', + left: '-4px', + flexDirection: 'row-reverse', + }, + }, + snowSwitcherLabel: { + fontSize: '0.9rem', + }, + + colorSecondary: { + '&$checked': { + color: MAIN_YELLOW, + }, + }, + switchBase: { + color: 'white', + '&$checked': { + color: 'white', + '& + $track': { + backgroundColor: MAIN_YELLOW, + opacity: 1, + }, + "&:hover": { + backgroundColor: '#f2e14c4d', + }, + }, + }, + track: {}, + checked: {}, +})); + +export function Snowflakes() { + + const {isSnowing, handleSnowSwitch} = useSnowflakes(); + + const classes = useStyles(); + + return ( + <> +
+ Happy New Year + + +
+ + + ); +} \ No newline at end of file diff --git a/apps/js-machine-front/src/app/components/hooks/models/Snowflake.tsx b/apps/js-machine-front/src/app/components/hooks/models/Snowflake.tsx new file mode 100644 index 0000000..5b24955 --- /dev/null +++ b/apps/js-machine-front/src/app/components/hooks/models/Snowflake.tsx @@ -0,0 +1,10 @@ +export interface Snowflake { + speedY: number, + speedX: number, + x: number, + y: number, + size: number, + stepSize: number, + step: number, + opacity: number +} \ No newline at end of file diff --git a/apps/js-machine-front/src/app/components/hooks/useSnowflakes.tsx b/apps/js-machine-front/src/app/components/hooks/useSnowflakes.tsx new file mode 100644 index 0000000..ce57a2a --- /dev/null +++ b/apps/js-machine-front/src/app/components/hooks/useSnowflakes.tsx @@ -0,0 +1,138 @@ +import React, { useEffect, useState, useCallback } from 'react'; + +import { Snowflake } from './models/Snowflake'; + +export function useSnowflakes() { + + const [isSnowing, setSnowing] = useState(true); + const requestId = React.useRef(0); + + useEffect(() => { + startSnowflakes(); + }); + + const handleSnowSwitch = useCallback(() => { + setSnowing(!isSnowing); + }, [isSnowing]); + + + const startSnowflakes = useCallback(() => { + + const getCanvasElementById = (id: string): HTMLCanvasElement => { + const canvas = document.getElementById('snow'); + + if (!(canvas instanceof HTMLCanvasElement)) { + throw new Error(`The element of id "${id}" is not a HTMLCanvasElement. Make sure a element is present in the document.`); + } + + return canvas; + }; + + const getCanvasRenderingContext2D = (canvas: HTMLCanvasElement): CanvasRenderingContext2D => { + const context = canvas.getContext('2d'); + + if (!(context instanceof CanvasRenderingContext2D)) { + throw new Error('This browser does not support 2-dimensional canvas rendering contexts.'); + } + + return context; + }; + + + const canvas: HTMLCanvasElement = getCanvasElementById('snow'); + const ctx: CanvasRenderingContext2D = getCanvasRenderingContext2D(canvas); + + if (!isSnowing) { + window.cancelAnimationFrame(requestId.current); + ctx.clearRect(0, 0, canvas.width, canvas.height); + return; + } + + const flakesAmoung = getFlakesAmoungByScreenWidth(window.innerWidth); + const flakes: Snowflake[] = createSnowflakes(flakesAmoung); + + window.addEventListener("resize", function () { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + }); + + snowStep(); + + function getFlakesAmoungByScreenWidth(width: number) { + if (width < 500) { + return (60); + } else if (width < 750) { + return (80); + } else if (width < 1000) { + return (100); + } else if (width < 1200) { + return (120); + } else if (width < 1600) { + return (160); + } else { + return (180); + } + } + + function snowStep() { + ctx.clearRect(0, 0, canvas.width, canvas.height); + for (let i = 0; i < flakes.length; i++) { + const flake: Snowflake = flakes[i]; + + flake.speedX *= .98; + flake.speedX += Math.cos(flake.step += .05) * flake.stepSize; + + flake.y += flake.speedY; + flake.x += flake.speedX; + + if (flake.y >= canvas.height || flake.y <= 0) { + reset(flake); + } + + if (flake.x >= canvas.width || flake.x <= 0) { + reset(flake); + } + + ctx.beginPath(); + ctx.fillStyle = "rgba(255,255,255," + flake.opacity + ")"; + ctx.arc(flake.x, flake.y, flake.size, 0, Math.PI * 2); + ctx.fill(); + } + requestId.current = requestAnimationFrame(snowStep); + }; + + function reset(flake: Snowflake) { + flake.x = Math.floor(Math.random() * canvas.width); + flake.y = 0; + flake.size = (Math.random() * 3) + 2; + flake.speedY = (Math.random() * 1) + 0.5; + flake.speedX = 0; + flake.opacity = (Math.random() * 0.5) + 0.3; + } + + function createSnowflakes(flakeCount: number): Snowflake[] { + const flakes: Snowflake[] = []; + for (let i = 0; i < flakeCount; i++) { + const x = Math.floor(Math.random() * canvas.width), + y = Math.floor(Math.random() * canvas.height), + size = (Math.random() * 3) + 2, + speedY = (Math.random() * 1) + 0.5, + opacity = (Math.random() * 0.5) + 0.3; + + flakes.push({ + speedY: speedY, + speedX: 0, + x: x, + y: y, + size: size, + stepSize: (Math.random()) / 30, + step: 0, + opacity: opacity, + }); + } + return flakes; + }; + }, [isSnowing]); + + return { isSnowing, handleSnowSwitch }; +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 56708d1..3ab4e02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -297,15 +297,15 @@ } }, "@babel/core": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.5.tgz", - "integrity": "sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", + "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", + "@babel/generator": "^7.7.7", "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.5", + "@babel/parser": "^7.7.7", "@babel/template": "^7.7.4", "@babel/traverse": "^7.7.4", "@babel/types": "^7.7.4", @@ -342,9 +342,9 @@ } }, "@babel/generator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", - "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", "dev": true, "requires": { "@babel/types": "^7.7.4", @@ -600,9 +600,9 @@ } }, "@babel/parser": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", - "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -658,9 +658,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz", + "integrity": "sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -678,9 +678,9 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz", - "integrity": "sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz", + "integrity": "sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.7.4", @@ -843,9 +843,9 @@ } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz", - "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz", + "integrity": "sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.7.4", @@ -981,9 +981,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz", - "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz", + "integrity": "sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew==", "dev": true, "requires": { "@babel/helper-call-delegate": "^7.7.4", @@ -1010,9 +1010,9 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.4.tgz", - "integrity": "sha512-LixU4BS95ZTEAZdPaIuyg/k8FiiqN9laQ0dMHB4MlpydHY53uQdWCUrwjLr5o6ilS6fAgZey4Q14XBjl5tL6xw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.7.tgz", + "integrity": "sha512-SlPjWPbva2+7/ZJbGcoqjl4LsQaLpKEzxW9hcxU7675s24JmdotJOSJ4cgAbV82W3FcZpHIGmRZIlUL8ayMvjw==", "dev": true, "requires": { "@babel/helper-builder-react-jsx": "^7.7.4", @@ -1128,9 +1128,9 @@ } }, "@babel/preset-env": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.6.tgz", - "integrity": "sha512-k5hO17iF/Q7tR9Jv8PdNBZWYW6RofxhnxKjBMc0nG4JTaWvOTiPoO/RLFwAKcA4FpmuBFm6jkoqaRJLGi0zdaQ==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz", + "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==", "dev": true, "optional": true, "requires": { @@ -1139,9 +1139,9 @@ "@babel/plugin-proposal-async-generator-functions": "^7.7.4", "@babel/plugin-proposal-dynamic-import": "^7.7.4", "@babel/plugin-proposal-json-strings": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.7", "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.7", "@babel/plugin-syntax-async-generators": "^7.7.4", "@babel/plugin-syntax-dynamic-import": "^7.7.4", "@babel/plugin-syntax-json-strings": "^7.7.4", @@ -1155,7 +1155,7 @@ "@babel/plugin-transform-classes": "^7.7.4", "@babel/plugin-transform-computed-properties": "^7.7.4", "@babel/plugin-transform-destructuring": "^7.7.4", - "@babel/plugin-transform-dotall-regex": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.7", "@babel/plugin-transform-duplicate-keys": "^7.7.4", "@babel/plugin-transform-exponentiation-operator": "^7.7.4", "@babel/plugin-transform-for-of": "^7.7.4", @@ -1169,7 +1169,7 @@ "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", "@babel/plugin-transform-new-target": "^7.7.4", "@babel/plugin-transform-object-super": "^7.7.4", - "@babel/plugin-transform-parameters": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.7", "@babel/plugin-transform-property-literals": "^7.7.4", "@babel/plugin-transform-regenerator": "^7.7.5", "@babel/plugin-transform-reserved-words": "^7.7.4", @@ -1181,7 +1181,7 @@ "@babel/plugin-transform-unicode-regex": "^7.7.4", "@babel/types": "^7.7.4", "browserslist": "^4.6.0", - "core-js-compat": "^3.4.7", + "core-js-compat": "^3.6.0", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.5.0" @@ -1220,17 +1220,17 @@ } }, "@babel/runtime": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.6.tgz", - "integrity": "sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", + "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/runtime-corejs3": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.6.tgz", - "integrity": "sha512-NrRUehqG0sMSCaP+0XV/vOvvjNl4BQOWq3Qys1Q2KTEm5tGMo9h0dHnIzeKerj0a7SIB8LP5kYg/T1raE3FoKQ==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.7.tgz", + "integrity": "sha512-kr3W3Fw8mB/CTru2M5zIRQZZgC/9zOxNSoJ/tVCzjPt3H1/p5uuGbz6WwmaQy/TLQcW31rUhUUWKY28sXFRelA==", "dev": true, "requires": { "core-js-pure": "^3.0.0", @@ -1883,6 +1883,11 @@ "@firebase/auth-types": "0.9.3" } }, + "@firebase/auth-interop-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.1.tgz", + "integrity": "sha512-rNpCOyCspZvNDoQVQLQQgWAGBMB2ClCWKN1c8cEFgLNFgnMJrjVB+tcL7KW2q2UjKa7l8Mxgwys7szTiEDAcvA==" + }, "@firebase/auth-types": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.9.3.tgz", @@ -1898,10 +1903,11 @@ } }, "@firebase/database": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.16.tgz", - "integrity": "sha512-m8qrt3irSiSkFP9i75nGWFasZFeFb5KAR6/fvWOoLMXQWE41LU7Z+osUaXWvGvPJxsoHD0EY+4+Blat4XiJx9g==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.17.tgz", + "integrity": "sha512-nufRBK1p2adTEDvUQ1lEfa0nd2BvBe6tlDbO0q9zMQaTMg9dDjTomKRsc3byyRDhhTwDNwX4oUCFCTNTOHoKaA==", "requires": { + "@firebase/auth-interop-types": "0.1.1", "@firebase/component": "0.1.1", "@firebase/database-types": "0.4.10", "@firebase/logger": "0.1.33", @@ -1919,9 +1925,9 @@ } }, "@firebase/firestore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.9.0.tgz", - "integrity": "sha512-bcVfzGmj5qweUD1eYcezoCYeVl6oNlkc+s47EJBoNrmvWuvKeaiUy+RhB6hFblJCXUmecCuYUT2UA7CKipbEIQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.9.1.tgz", + "integrity": "sha512-b3MsfyXxE65HirKdR9R/EI++1esyU4Mg8UN5LA+3Kbov7qMAPqHpXdrZy1v4Ng3+ZA2NC7Y08boaIgudr98sGA==", "requires": { "@firebase/component": "0.1.1", "@firebase/firestore-types": "1.9.0", @@ -2128,15 +2134,15 @@ } }, "@google-cloud/firestore": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-2.6.1.tgz", - "integrity": "sha512-ZzjaNn8TLji2HpC/h4uDuOb+h7lf1YCiNRiHhLkCUuEp+xAt1uPAkLFLAamGYW26v9VIe+9H/3l27pkplFsybQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.0.0.tgz", + "integrity": "sha512-Os6rXW6z9bd2sVdjDJRUneF5u7keH+vpWX/Uddq0dlFyNbwBSgCBFWt+0VYXkgQE+O8B8i1p+FdaleTjFFuRVA==", "optional": true, "requires": { "bun": "^0.0.12", - "deep-equal": "^1.0.1", + "deep-equal": "^1.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^1.7.5", + "google-gax": "^1.12.0", "through2": "^3.0.0" } }, @@ -2227,9 +2233,9 @@ } }, "@grpc/grpc-js": { - "version": "0.6.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.6.14.tgz", - "integrity": "sha512-M6q3MtHzk0NQPs1PB+SXSJtkDtK8WXJh+1B1WVJQp5HTURadzj9t1bUb/Fjhq+K57lKsOgL60r8WGmE7vks1eg==", + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.6.15.tgz", + "integrity": "sha512-BFK5YMu8JILedibo0nr3NYM0ZC5hCZuXtzk10wEUp3d3pH11PjdvTfN1yEJ0VsfBY5Gtp3WOQ+t7Byq0NzH/iQ==", "optional": true, "requires": { "semver": "^6.2.0" @@ -2602,6 +2608,17 @@ "integrity": "sha512-AN+GZNXytX9yxGi0JOfxHrRTbhFybjUJ05rnsBVjcB+16e466Z0Xe5IxawuOayVZgTBNDxmPKo5j4V6OnMtaSQ==", "requires": { "@types/react": "*" + }, + "dependencies": { + "@types/react": { + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + } } }, "@material-ui/utils": { @@ -4010,9 +4027,9 @@ "dev": true }, "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", "requires": { "@types/node": "*" } @@ -4055,9 +4072,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz", - "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.1.tgz", + "integrity": "sha512-9e7jj549ZI+RxY21Cl0t8uBnWyb22HzILupyHZjYEVK//5TT/1bZodU+yUbLnPdoYViBBnNWbxp4zYjGV0zUGw==", "requires": { "@types/node": "*", "@types/range-parser": "*" @@ -4093,12 +4110,23 @@ "requires": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" + }, + "dependencies": { + "@types/react": { + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + } } }, "@types/invariant": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", - "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==" + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.31.tgz", + "integrity": "sha512-jMlgg9pIURvy9jgBHCjQp/CyBjYHUwj91etVcDdXkFl2CwTFiQlB+8tcsMeXpXf2PFE5X2pjk4Gm43hQSMHAdA==" }, "@types/istanbul-lib-coverage": { "version": "2.0.1", @@ -4169,9 +4197,9 @@ "dev": true }, "@types/node": { - "version": "12.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.18.tgz", - "integrity": "sha512-DBkZuIMFuAfjJHiunyRc+aNvmXYNwV1IPMgGKGlwCp6zh6MKrVtmvjSWK/axWcD25KJffkXgkfvFra8ndenXAw==" + "version": "12.12.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.21.tgz", + "integrity": "sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -4204,6 +4232,7 @@ "version": "16.9.16", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.16.tgz", "integrity": "sha512-dQ3wlehuBbYlfvRXfF5G+5TbZF3xqgkikK7DWAsQXe2KnzV+kjD4W2ea+ThCrKASZn9h98bjjPzoTYzfRqyBkw==", + "dev": true, "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -4254,6 +4283,17 @@ "integrity": "sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==", "requires": { "@types/react": "*" + }, + "dependencies": { + "@types/react": { + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + } } }, "@types/resolve": { @@ -4304,6 +4344,17 @@ "integrity": "sha512-Yjye9VwMdYeXfS71ihueWRSxrruuXTwKCbzue4+5b2rjnQ//AtyM7myZ1BEhNhBQ/nL/RE7bdToUoLln2miKvg==", "requires": { "@types/react": "*" + }, + "dependencies": { + "@types/react": { + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + } } }, "@types/testing-library__dom": { @@ -6814,19 +6865,27 @@ "integrity": "sha512-b+BBmCZmVgho8KnBUOXpvlqEMguko+0P+kXCwD4vIprsXC6ht1qgPxtb1OK6XgSlrySF71wkwBQ0Hv695bk9gQ==" }, "core-js-compat": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.5.0.tgz", - "integrity": "sha512-E7iJB72svRjJTnm9HDvujzNVMCm3ZcDYEedkJ/sDTNsy/0yooCd9Cg7GSzE7b4e0LfIkjijdB1tqg0pGwxWeWg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.0.tgz", + "integrity": "sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg==", "dev": true, "requires": { "browserslist": "^4.8.2", - "semver": "^6.3.0" + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } } }, "core-js-pure": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.5.0.tgz", - "integrity": "sha512-wB0QtKAofWigiISuT1Tej3hKgq932fB//Lf1VoPbiLpTYlHY0nIDhgF+q1na0DAKFHH5wGCirkAknOmDN8ijXA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.0.tgz", + "integrity": "sha512-+YSSo7UFDFuVvMUr1HVFYArb22pYIKRDISBo6V50kRuS0MsXgsuDWmJYFu6dJsJupr77S486xRnDkr/BWQQonw==", "dev": true }, "core-util-is": { @@ -9293,16 +9352,16 @@ } }, "firebase": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-7.6.0.tgz", - "integrity": "sha512-4hjPrcNDF3E3vvoe+IDcnxu+Z4w7xxDBHZAmLjTAPPmtc8Ifb6vJ99tESGIb0Ncx+5Bl1nZK9um6qTf9fgGtqA==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-7.6.1.tgz", + "integrity": "sha512-rrKp2cWmrH3gdxr+3t97t6eGye4VJTOYo6U98jvGi+OA4ZSKTSrCMXN6nZkAVOkSCvn/fgw//oHV+7VsJskB/Q==", "requires": { "@firebase/analytics": "0.2.9", "@firebase/app": "0.5.0", "@firebase/app-types": "0.5.0", "@firebase/auth": "0.13.3", - "@firebase/database": "0.5.16", - "@firebase/firestore": "1.9.0", + "@firebase/database": "0.5.17", + "@firebase/firestore": "1.9.1", "@firebase/functions": "0.4.28", "@firebase/installations": "0.3.8", "@firebase/messaging": "0.6.0", @@ -9314,14 +9373,14 @@ } }, "firebase-admin": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.8.0.tgz", - "integrity": "sha512-IKtyL7doZu3Sh3pCz+O7vFWc/UwxEfXe263X/bPbucu/qEsM+5UdljIklnInSMunO+A1BUXKtsKkQf91iZQ2Ew==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.9.0.tgz", + "integrity": "sha512-ZslYhJeLm0GH6tZbDQanrnqqpMnvzWyVTygbT0Dde6ExkiJnYrFAEoxc8U7lbhMF13RHYH2Yj4x0hPoZyp/43A==", "requires": { - "@firebase/database": "^0.5.11", - "@google-cloud/firestore": "^2.6.0", + "@firebase/database": "^0.5.17", + "@google-cloud/firestore": "^3.0.0", "@google-cloud/storage": "^4.1.2", - "@types/node": "^8.0.53", + "@types/node": "^8.10.59", "dicer": "^0.3.0", "jsonwebtoken": "8.1.0", "node-forge": "0.7.4" @@ -11895,9 +11954,9 @@ "dev": true }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "1.2.1", @@ -11943,9 +12002,9 @@ } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-descriptor": { "version": "0.1.6", @@ -14509,9 +14568,9 @@ "integrity": "sha512-o4aN0GqKcDmKwu2wVsqbujU4F63ZvmbBLSc7WhzuAu9S9eF2wgNjqIkzrb/kbY3C9/mGYG4k1M0KbCuG1GJ7IQ==" }, "mobx-react-lite": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-1.5.1.tgz", - "integrity": "sha512-40Gn8hFq+MuNHqCaeSo2adN4WvpWkIeSYZVJWzRzm0rbEf0BFow6Ir9IefErql0pX9q650TN1JAQXvrXxKR8Mg==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-1.5.2.tgz", + "integrity": "sha512-PyZmARqqWtpuQaAoHF5pKX7h6TKNLwq6vtovm4zZvG6sEbMRHHSqioGXSeQbpRmG8Kw8uln3q/W1yMO5IfL5Sg==" }, "mobx-react-router": { "version": "4.1.0", @@ -14746,9 +14805,9 @@ } }, "node-releases": { - "version": "1.1.42", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", - "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", + "version": "1.1.43", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.43.tgz", + "integrity": "sha512-Rmfnj52WNhvr83MvuAWHEqXVoZXCcDQssSOffU4n4XOL9sPrP61mSZ88g25NqmABDvH7PiAlFCzoSCSdzA293w==", "dev": true, "requires": { "semver": "^6.3.0" @@ -16426,9 +16485,9 @@ }, "dependencies": { "@types/node": { - "version": "10.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.9.tgz", - "integrity": "sha512-+6VygF9LbG7Gaqeog2G7u1+RUcmo0q1rI+2ZxdIg2fAUngk5Vz9fOCHXdloNUOHEPd1EuuOpL5O0CdgN9Fx5UQ==" + "version": "10.17.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.11.tgz", + "integrity": "sha512-dNd2pp8qTzzNLAs3O8nH3iU9DG9866KHq9L3ISPB7DOGERZN81nW/5/g/KzMJpCU8jrbCiMRBzV9/sCEdRosig==" } } }, @@ -17159,9 +17218,9 @@ "dev": true }, "resolve": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", - "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", + "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", "requires": { "path-parse": "^1.0.6" } @@ -18597,18 +18656,18 @@ } }, "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -18937,9 +18996,9 @@ } }, "term-size": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.1.0.tgz", - "integrity": "sha512-I42EWhJ+2aeNQawGx1VtpO0DFI9YcfuvAMNIdKyf/6sRbHJ4P+ZQ/zIT87tE+ln1ymAGcCJds4dolfSAS0AcNg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.1.1.tgz", + "integrity": "sha512-UqvQSch04R+69g4RDhrslmGvGL3ucDRX/U+snYW0Mab4uCAyKSndUksaoqlJ81QKSpRnIsuOYQCbC2ZWx2896A==", "dev": true }, "terser": {