分享单页

This commit is contained in:
HFO4 2020-01-27 14:19:16 +08:00
parent 5062a0860c
commit 016c17f3a8
8 changed files with 584 additions and 378 deletions

View File

@ -3,7 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@material-ui/core": "^4.7.0",
"@material-ui/core": "^4.9.0",
"@material-ui/icons": "^4.5.1",
"@material-ui/lab": "^4.0.0-alpha.33",
"axios": "^0.19.0",

View File

@ -102,12 +102,12 @@ const TypeIcon = props => {
<>
{props.isUpload && (
<Avatar
className={props.className}
style={{
backgroundColor: color
}}
>
<IconComponent
className={props.className}
style={{
color: theme.palette.background.paper,
}}

View File

@ -1,144 +0,0 @@
import React, { Component } from 'react'
import { connect } from 'react-redux'
import { toggleSnackbar,}from "../actions/index"
import axios from 'axios'
import {
withStyles,
Button,
Card,
Divider,
CardHeader,
CardContent,
CardActions,
TextField,
Avatar,
} from '@material-ui/core';
const styles = theme => ({
card: {
maxWidth: 400,
margin: "0 auto",
},
actions: {
display: 'flex',
},
layout: {
width: 'auto',
marginTop:'110px',
marginLeft: theme.spacing(3),
marginRight: theme.spacing(3),
[theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {
width: 1100,
marginLeft: 'auto',
marginRight: 'auto',
},
},
continue:{
marginLeft:"auto",
marginRight: "10px",
marginRottom: "10px",
}
})
const mapStateToProps = state => {
return {
}
}
const mapDispatchToProps = dispatch => {
return {
toggleSnackbar:(vertical,horizontal,msg,color)=>{
dispatch(toggleSnackbar(vertical,horizontal,msg,color))
},
}
}
class LockedFileCompoment extends Component {
state = {
pwd:"",
loading:false,
};
handleChange = name => event => {
this.setState({ [name]: event.target.value });
};
submit = e=>{
e.preventDefault();
if(this.state.pwd===""){
return;
}
this.setState({
loading:true,
});
axios.post("/Share/chekPwd",{
key: window.shareInfo.shareId,
password: this.state.pwd
})
.then( (response)=> {
if(response.data.error!==0){
this.setState({
loading:false,
});
this.props.toggleSnackbar("top","right",response.data.msg ,"warning");
}else{
window.location.reload();
}
})
.catch((error) =>{
this.setState({
loading:false,
});
this.props.toggleSnackbar("top","right",error.message ,"error");
});
}
render() {
const { classes } = this.props;
return (
<div className={classes.layout}>
<Card className={classes.card}>
<CardHeader
avatar={
<Avatar aria-label="Recipe" src={"/Member/Avatar/1/"+window.shareInfo.ownerUid}>
</Avatar>
}
title={window.shareInfo.ownerNick+" 的加密分享"}
subheader={window.shareInfo.shareDate}
/>
<Divider/>
<CardContent>
<form onSubmit={this.submit}>
<TextField
id="pwd"
label="输入分享密码"
value={this.state.pwd}
onChange={this.handleChange('pwd')}
margin="normal"
type="password"
autoFocus
fullWidth
color="secondary"
/>
</form>
</CardContent>
<CardActions className={classes.actions} disableActionSpacing>
<Button onClick={this.submit} color="secondary" className={classes.continue} variant="contained" disabled={this.state.pwd==="" || this.state.loading}>继续</Button>
</CardActions>
</Card>
</div>
);
}
}
const LockedFile = connect(
mapStateToProps,
mapDispatchToProps
)( withStyles(styles)(LockedFileCompoment))
export default LockedFile

View File

@ -0,0 +1,134 @@
import React, { Component } from "react";
import { connect } from "react-redux";
import { toggleSnackbar } from "../../actions";
import API from "../../middleware/Api";
import {
withStyles,
Button,
Card,
Divider,
CardHeader,
CardContent,
CardActions,
TextField,
Avatar
} from "@material-ui/core";
const styles = theme => ({
card: {
maxWidth: 400,
margin: "0 auto"
},
actions: {
display: "flex"
},
layout: {
width: "auto",
marginTop: "110px",
marginLeft: theme.spacing(3),
marginRight: theme.spacing(3),
[theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {
width: 1100,
marginLeft: "auto",
marginRight: "auto"
}
},
continue: {
marginLeft: "auto",
marginRight: "10px",
marginRottom: "10px"
}
});
const mapStateToProps = state => {
return {};
};
const mapDispatchToProps = dispatch => {
return {
toggleSnackbar: (vertical, horizontal, msg, color) => {
dispatch(toggleSnackbar(vertical, horizontal, msg, color));
}
};
};
class LockedFileCompoment extends Component {
state = {
pwd: ""
};
handleChange = name => event => {
this.setState({ [name]: event.target.value });
};
submit = e => {
e.preventDefault();
if (this.state.pwd === "") {
return;
}
this.props.setPassowrd(this.state.pwd);
};
render() {
const { classes } = this.props;
return (
<div className={classes.layout}>
<Card className={classes.card}>
<CardHeader
avatar={
<Avatar
aria-label="Recipe"
src={
"/Member/Avatar/1/" +
this.props.share.creator.key
}
/>
}
title={this.props.share.creator.nick + " 的加密分享"}
subheader={this.props.share.create_date}
/>
<Divider />
<CardContent>
<form onSubmit={this.submit}>
<TextField
id="pwd"
label="输入分享密码"
value={this.state.pwd}
onChange={this.handleChange("pwd")}
margin="normal"
type="password"
autoFocus
fullWidth
color="secondary"
/>
</form>
</CardContent>
<CardActions
className={classes.actions}
disableActionSpacing
>
<Button
onClick={this.submit}
color="secondary"
className={classes.continue}
variant="contained"
disabled={
this.state.pwd === "" || this.props.loading
}
>
继续
</Button>
</CardActions>
</Card>
</div>
);
}
}
const LockedFile = connect(
mapStateToProps,
mapDispatchToProps
)(withStyles(styles)(LockedFileCompoment));
export default LockedFile;

View File

@ -1,20 +1,25 @@
import React, {Suspense, useCallback, useEffect, useState} from "react";
import {makeStyles} from "@material-ui/core/styles";
import React, { Suspense, useCallback, useEffect, useState } from "react";
import { makeStyles } from "@material-ui/core/styles";
import PageLoading from "../Placeholder/PageLoading";
import {useParams} from "react-router";
import { useParams } from "react-router";
import API from "../../middleware/Api";
import {changeSubTitle, toggleSnackbar} from "../../actions";
import {useDispatch} from "react-redux";
import { changeSubTitle, toggleSnackbar } from "../../actions";
import { useDispatch } from "react-redux";
import ShareNotFound from "./NotFound";
const useStyles = makeStyles({
});
import Grow from "@material-ui/core/Grow";
const useStyles = makeStyles({});
export default function SharePreload(){
const LockedFile = React.lazy(() => import("./LockedFile"));
const SharedFile = React.lazy(() => import("./SharedFile"));
export default function SharePreload() {
const classes = useStyles();
const dispatch = useDispatch();
let { id } = useParams();
const [share,setShare] = useState(undefined);
const [share, setShare] = useState(undefined);
const [loading, setLoading] = useState(false);
const [password, setPassword] = useState("");
const SetSubTitle = useCallback(title => dispatch(changeSubTitle(title)), [
dispatch
@ -27,34 +32,53 @@ export default function SharePreload(){
);
useEffect(() => {
API.get("/share/" + id)
.then(response => {
if (share) {
if (share.locked) {
SetSubTitle(share.creator.nick + "的加密分享");
if (password !== "") {
ToggleSnackbar("top", "right", "密码不正确", "warning");
}
} else {
SetSubTitle(share.source.name);
}
} else {
SetSubTitle();
}
}, [share]);
useEffect(() => {
setLoading(true);
let withPassword = "";
if (password !== "") {
withPassword = "?password=" + password;
}
API.get("/share/" + id + withPassword)
.then(response => {
setShare(response.data);
setLoading(false);
})
.catch(error => {
if (error.code ===404){
setLoading(false);
if (error.code === 404) {
setShare(null);
}else{
ToggleSnackbar(
"top",
"right",
error.message,
"error"
)
} else {
ToggleSnackbar("top", "right", error.message, "error");
}
});
}, [id]);
}, [id, password]);
return (
<Suspense fallback={<PageLoading/>}>
{share === undefined &&
<PageLoading/>
}
{share === null &&
<ShareNotFound/>
}
<Suspense fallback={<PageLoading />}>
{share === undefined && <PageLoading />}
{share === null && <ShareNotFound />}
{share && share.locked && (
<LockedFile
loading={loading}
setPassowrd={setPassword}
share={share}
/>
)}
{share&&!share.locked&&!share.is_dir&&<SharedFile share={share}/>}
</Suspense>
);
}
}

View File

@ -1,175 +1,359 @@
import React, { Component } from 'react'
import { connect } from 'react-redux'
import FileIcon from "../FileManager/FileIcon"
import PreviewIcon from "@material-ui/icons/RemoveRedEye"
import InfoIcon from "@material-ui/icons/Info"
import DownloadIcon from "@material-ui/icons/CloudDownload"
import {allowSharePreview,sizeToString} from "../../untils"
import { toggleSnackbar,}from "../../actions"
import { isPreviewable,}from "../../config"
import Modals from "../FileManager/Modals"
import axios from 'axios'
import { withStyles, Button, Popper, Typography, Fade, Paper } from '@material-ui/core';
import React, { Component } from "react";
import { connect } from "react-redux";
import FileIcon from "../FileManager/FileIcon";
import PreviewIcon from "@material-ui/icons/RemoveRedEye";
import InfoIcon from "@material-ui/icons/Info";
import DownloadIcon from "@material-ui/icons/CloudDownload";
import { allowSharePreview, sizeToString } from "../../untils";
import { toggleSnackbar } from "../../actions";
import { isPreviewable } from "../../config";
import Modals from "../FileManager/Modals";
import axios from "axios";
import {
withStyles,
Button,
Popper,
Typography,
Fade,
Paper,
Avatar
} from "@material-ui/core";
import Divider from "@material-ui/core/Divider";
import TypeIcon from "../FileManager/TypeIcon";
const styles = theme => ({
layout: {
width: 'auto',
marginTop:'110px',
width: "auto",
marginTop: "90px",
marginLeft: theme.spacing(3),
marginRight: theme.spacing(3),
[theme.breakpoints.up(1100 + theme.spacing(3) * 2)]: {
width: 1100,
marginLeft: 'auto',
marginRight: 'auto',
width: 1100,
marginTop: "90px",
marginLeft: "auto",
marginRight: "auto"
},
},
player:{
borderRadius: "4px",
},
fileCotainer:{
width:"200px",
margin:"0 auto",
},
buttonCotainer:{
width:"400px",
margin:"0 auto",
[theme.breakpoints.down("sm")]: {
marginTop: 0,
marginLeft: 0,
marginRight: 0,
},
justifyContent: "center",
display: "flex"
},
player: {
borderRadius: "4px"
},
fileCotainer: {
width: "200px",
margin: "0 auto"
},
buttonCotainer: {
width: "400px",
margin: "0 auto",
textAlign: "center",
marginTop: "20px",
},
button: {
margin: theme.spacing(1),
},
paper: {
padding: theme.spacing(2),
},
icon:{
marginRight: theme.spacing(1),
}
})
marginTop: "20px"
},
paper: {
padding: theme.spacing(2)
},
icon: {
borderRadius: "10%",
marginTop:2,
},
box: {
width: "100%",
maxWidth: 440,
backgroundColor: theme.palette.background.paper,
borderRadius: 12,
boxShadow: "0 8px 16px rgba(29,39,55,.25)",
[theme.breakpoints.down("sm")]: {
height: "calc(100vh - 56px)",
borderRadius: 0,
maxWidth: 1000,
},
display: "flex",
flexDirection: "column",
},
boxHeader: {
textAlign: "center",
padding: 24
},
avatar: {
backgroundColor: theme.palette.secondary.main,
margin: "0 auto",
width: 50,
height: 50
},
shareDes: {
marginTop: 12
},
shareInfo: {
color: theme.palette.text.disabled,
fontSize: 14
},
boxContent: {
padding: 24,
display: "flex",
flex: "1",
},
fileName: {
marginLeft: 20,
},
fileSize:{
color: theme.palette.text.disabled,
fontSize: 14
},
boxFooter:{
display:"flex",
padding: "20px 16px",
justifyContent: "space-between",
},
downloadButton:{
marginLeft:8,
},
});
const mapStateToProps = state => {
return {
}
}
return {};
};
const mapDispatchToProps = dispatch => {
return {
toggleSnackbar:(vertical,horizontal,msg,color)=>{
dispatch(toggleSnackbar(vertical,horizontal,msg,color))
},
}
}
toggleSnackbar: (vertical, horizontal, msg, color) => {
dispatch(toggleSnackbar(vertical, horizontal, msg, color));
}
};
};
const allowDownload = allowSharePreview();
class SharedFileCompoment extends Component {
state = {
anchorEl: null,
open: false,
};
open: false
};
preview = ()=>{
if(!allowDownload){
this.props.toggleSnackbar("top","right","未登录用户无法下载","warning");
preview = () => {
if (!allowDownload) {
this.props.toggleSnackbar(
"top",
"right",
"未登录用户无法下载",
"warning"
);
return;
}
switch(isPreviewable(window.shareInfo.fileName)){
case 'img':
switch (isPreviewable(this.props.share.source.name)) {
case "img":
window.open(window.apiURL.preview);
return;
case 'msDoc':
window.open(window.apiURL.docPreiview);
case "msDoc":
window.open(window.apiURL.docPreiview);
return;
case 'audio':
case "audio":
//this.props.openMusicDialog();
return;
case 'open':
window.open(window.apiURL.preview);
case "open":
window.open(window.apiURL.preview);
return;
case 'video':
window.location.href=("/Viewer/Video?single=true&shareKey="+window.shareInfo.shareId+"&path=/"+window.shareInfo.fileName);
return ;
case 'edit':
window.location.href=("/Viewer/Markdown?single=true&shareKey="+window.shareInfo.shareId+"&path=/"+window.shareInfo.fileName);
case "video":
window.location.href =
"/Viewer/Video?single=true&shareKey=" +
window.shareInfo.shareId +
"&path=/" +
window.shareInfo.fileName;
return;
case "edit":
window.location.href =
"/Viewer/Markdown?single=true&shareKey=" +
window.shareInfo.shareId +
"&path=/" +
window.shareInfo.fileName;
return;
default:
this.props.toggleSnackbar("top","right","此文件无法预览","warning");
this.props.toggleSnackbar(
"top",
"right",
"此文件无法预览",
"warning"
);
return;
}
}
};
download = ()=>{
if(!allowDownload){
this.props.toggleSnackbar("top","right","未登录用户无法下载","warning");
download = () => {
if (!allowDownload) {
this.props.toggleSnackbar(
"top",
"right",
"未登录用户无法下载",
"warning"
);
return;
}
axios.post("/Share/getDownloadUrl",{
key: window.shareInfo.shareId
})
.then( (response)=> {
if(response.data.error!==0){
this.props.toggleSnackbar("top","right",response.data.msg ,"warning");
}else{
window.location.href=response.data.result;
}
})
.catch((error) =>{
this.props.toggleSnackbar("top","right",error.message ,"error");
});
}
axios
.post("/Share/getDownloadUrl", {
key: window.shareInfo.shareId
})
.then(response => {
if (response.data.error !== 0) {
this.props.toggleSnackbar(
"top",
"right",
response.data.msg,
"warning"
);
} else {
window.location.href = response.data.result;
}
})
.catch(error => {
this.props.toggleSnackbar(
"top",
"right",
error.message,
"error"
);
});
};
handleOpen = event => {
const { currentTarget } = event;
this.setState(state => ({
anchorEl: currentTarget,
open: !state.open,
anchorEl: currentTarget,
open: !state.open
}));
};
getSecondDes = () => {
if (this.props.share.expire > 0) {
if (this.props.share.expire >= 24 * 3600) {
return (
Math.round(this.props.share.expire / (24 * 3600)) +
" 天后到期"
);
}
return Math.round(this.props.share.expire / 3600) + " 小时后到期";
}
return this.props.share.create_date;
};
render() {
const { classes } = this.props;
const file={
name:window.shareInfo.fileName,
path:"/",
type:"file",
pic:"",
const file = {
name: this.props.share.source.name,
path: "/",
type: "file",
pic: ""
};
const id = this.state.open ? 'simple-popper' : null;
const id = this.state.open ? "simple-popper" : null;
return (
<div className={classes.layout}>
<Modals/>
<div className={classes.fileCotainer}>
<FileIcon file={file} share={true}/></div>
<div className={classes.buttonCotainer}>
<Button variant="contained" color="secondary" className={classes.button} onClick={this.download}>
<DownloadIcon className={classes.icon}/> 下载 ({sizeToString(window.shareInfo.fileSize)})
</Button>
<Button variant="outlined" className={classes.button} onClick={this.preview}>
<PreviewIcon className={classes.icon}/> 预览
</Button>
<Button variant="outlined" className={classes.button} onClick={this.handleOpen}>
<InfoIcon className={classes.icon}/> 信息
</Button>
<Popper id={id} open={this.state.open} anchorEl={this.state.anchorEl} transition>
{({ TransitionProps }) => (
<Fade {...TransitionProps} timeout={350}>
<Paper className={classes.paper}>
<Typography >此分享被浏览{window.shareInfo.ViewNum}被下载{window.shareInfo.downloadNum}</Typography>
</Paper>
</Fade>
)}
</Popper>
<div className={classes.layout}>
<Modals />
<div className={classes.box}>
<div className={classes.boxHeader}>
<Avatar
className={classes.avatar}
alt={this.props.share.creator.nick}
src={
"/Member/Avatar/1/" +
this.props.share.creator.key
}
/>
<Typography variant="h6" className={classes.shareDes}>
{this.props.share.creator.nick} 向您分享了 1 个文件
</Typography>
<Typography className={classes.shareInfo}>
{this.props.share.views} 次浏览 {this.props.share.downloads} 次下载
{" "}
{this.getSecondDes()}
</Typography>
</div>
<Divider />
<div className={classes.boxContent}>
<TypeIcon
className={classes.icon}
isUpload
fileName={this.props.share.source.name}
/>
<div className={classes.fileName}>
<Typography>
{this.props.share.source.name}
</Typography>
<Typography className={classes.fileSize}>
{sizeToString(this.props.share.source.size)}
</Typography>
</div>
</div>
<Divider/>
<div className={classes.boxFooter}>
<div className={classes.actionLeft}>
<Button color="secondary">保存到我的文件</Button>
</div>
<div className={classes.actions}>
<Button
variant="outlined"
color="secondary"
onClick={this.download}
>
预览
</Button>
<Button
variant="contained"
color="secondary"
className={classes.downloadButton}
onClick={this.download}
>
下载
</Button>
</div>
</div>
</div>
</div>
{/*<div className={classes.fileCotainer}>*/}
{/* <FileIcon file={file} share={true} />*/}
{/*</div>*/}
{/*<div className={classes.buttonCotainer}>*/}
{/* <Button*/}
{/* variant="outlined"*/}
{/* className={classes.button}*/}
{/* onClick={this.preview}*/}
{/* >*/}
{/* <PreviewIcon className={classes.icon} /> 预览*/}
{/* </Button>*/}
{/* <Button*/}
{/* variant="outlined"*/}
{/* className={classes.button}*/}
{/* onClick={this.handleOpen}*/}
{/* >*/}
{/* <InfoIcon className={classes.icon} /> 信息*/}
{/* </Button>*/}
{/* <Popper*/}
{/* id={id}*/}
{/* open={this.state.open}*/}
{/* anchorEl={this.state.anchorEl}*/}
{/* transition*/}
{/* >*/}
{/* {({ TransitionProps }) => (*/}
{/* <Fade {...TransitionProps} timeout={350}>*/}
{/* <Paper className={classes.paper}>*/}
{/* <Typography>*/}
{/* 此分享被浏览{this.props.share.views}*/}
{/* 次,被下载{this.props.share.downloads}次*/}
{/* </Typography>*/}
{/* </Paper>*/}
{/* </Fade>*/}
{/* )}*/}
{/* </Popper>*/}
{/*</div>*/}
</div>
);
}
}
const SharedFile = connect(
mapStateToProps,
mapDispatchToProps
)( withStyles(styles)(SharedFileCompoment))
)(withStyles(styles)(SharedFileCompoment));
export default SharedFile
export default SharedFile;

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import Navbar from "../component/Navbar/Navbar.js"
import AlertBar from "../component/Snackbar"
import { createMuiTheme } from '@material-ui/core/styles';
import LockedFile from '../component/LockedFile'
import LockedFile from '../component/Share/LockedFile'
import { CssBaseline, withStyles, MuiThemeProvider } from '@material-ui/core';
const theme = createMuiTheme(window.colorTheme);
const styles = theme => ({

168
yarn.lock
View File

@ -911,10 +911,10 @@
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-9.0.1.tgz#c27b391d8457d1e893f1eddeaf5e5412d12ffbb5"
integrity sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==
"@emotion/hash@^0.7.1":
version "0.7.3"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.3.tgz#a166882c81c0c6040975dd30df24fae8549bd96f"
integrity sha512-14ZVlsB9akwvydAdaEnVnvqu6J2P6ySv39hYyl/aoB6w/V+bXX0tay8cF6paqbgZsN2n5Xh15uF4pE+GvE+itw==
"@emotion/hash@^0.7.4":
version "0.7.4"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831"
integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==
"@hapi/address@2.x.x":
version "2.1.2"
@ -1096,16 +1096,16 @@
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^13.0.0"
"@material-ui/core@^4.7.0":
version "4.7.0"
resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.7.0.tgz#84c02a6d1c99c7900e184538c5f9d87e30cf4c23"
integrity sha512-mwLehUo0Q9ZxjuWo7J1uy1/Grh3nRxlOAaWJ3EtKeJP2HwqlSy8bWrcvRQYlapaYIPXa5jN8zWbTwi8Pk30VQg==
"@material-ui/core@^4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.9.0.tgz#96ca3281ee06216d44fd4d0e306dbe0429eb2ebe"
integrity sha512-zrrr8mPU5DDBYaVil4uJYauW41PjSn5otn7cqGsmWOY0t90fypr9nNgM7rRJaPz2AP6oRSDx1kBQt2igf5uelg==
dependencies:
"@babel/runtime" "^7.4.4"
"@material-ui/styles" "^4.6.0"
"@material-ui/system" "^4.5.2"
"@material-ui/types" "^4.1.1"
"@material-ui/utils" "^4.5.2"
"@material-ui/styles" "^4.9.0"
"@material-ui/system" "^4.7.1"
"@material-ui/types" "^5.0.0"
"@material-ui/utils" "^4.7.1"
"@types/react-transition-group" "^4.2.0"
clsx "^1.0.2"
convert-css-length "^2.0.1"
@ -1113,6 +1113,7 @@
normalize-scroll-left "^0.2.0"
popper.js "^1.14.1"
prop-types "^15.7.2"
react-is "^16.8.0"
react-transition-group "^4.3.0"
"@material-ui/icons@^4.5.1":
@ -1132,43 +1133,41 @@
clsx "^1.0.4"
prop-types "^15.7.2"
"@material-ui/styles@^4.6.0":
version "4.6.0"
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.6.0.tgz#15679fab6dcbe0cc2416f01a22966f3ea26607c5"
integrity sha512-lqqh4UEMdIYcU1Yth4pQyMTah02uAkg3NOT3MirN9FUexdL8pNA6zCHigEgDSfwmvnXyxHhxTkphfy0DRfnt9w==
"@material-ui/styles@^4.9.0":
version "4.9.0"
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.9.0.tgz#10c31859f6868cfa9d3adf6b6c3e32c9d676bc76"
integrity sha512-nJHum4RqYBPWsjL/9JET8Z02FZ9gSizlg/7LWVFpIthNzpK6OQ5OSRR4T4x9/p+wK3t1qNn3b1uI4XpnZaPxOA==
dependencies:
"@babel/runtime" "^7.4.4"
"@emotion/hash" "^0.7.1"
"@material-ui/types" "^4.1.1"
"@material-ui/utils" "^4.5.2"
"@emotion/hash" "^0.7.4"
"@material-ui/types" "^5.0.0"
"@material-ui/utils" "^4.7.1"
clsx "^1.0.2"
csstype "^2.5.2"
hoist-non-react-statics "^3.2.1"
jss "^10.0.0"
jss-plugin-camel-case "^10.0.0"
jss-plugin-default-unit "^10.0.0"
jss-plugin-global "^10.0.0"
jss-plugin-nested "^10.0.0"
jss-plugin-props-sort "^10.0.0"
jss-plugin-rule-value-function "^10.0.0"
jss-plugin-vendor-prefixer "^10.0.0"
jss "^10.0.3"
jss-plugin-camel-case "^10.0.3"
jss-plugin-default-unit "^10.0.3"
jss-plugin-global "^10.0.3"
jss-plugin-nested "^10.0.3"
jss-plugin-props-sort "^10.0.3"
jss-plugin-rule-value-function "^10.0.3"
jss-plugin-vendor-prefixer "^10.0.3"
prop-types "^15.7.2"
"@material-ui/system@^4.5.2":
version "4.5.2"
resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.5.2.tgz#7143bd8422a3f33f435c23f378136254004bbd60"
integrity sha512-h9RWvdM9XKlHHqwiuhyvWdobptQkHli+m2jJFs7i1AI/hmGsIc4reDmS7fInhETgt/Txx7uiAIznfRNIIVHmQw==
"@material-ui/system@^4.7.1":
version "4.7.1"
resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.7.1.tgz#d928dacc0eeae6bea569ff3ee079f409efb3517d"
integrity sha512-zH02p+FOimXLSKOW/OT2laYkl9bB3dD1AvnZqsHYoseUaq0aVrpbl2BGjQi+vJ5lg8w73uYlt9zOWzb3+1UdMQ==
dependencies:
"@babel/runtime" "^7.4.4"
"@material-ui/utils" "^4.5.2"
"@material-ui/utils" "^4.7.1"
prop-types "^15.7.2"
"@material-ui/types@^4.1.1":
version "4.1.1"
resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-4.1.1.tgz#b65e002d926089970a3271213a3ad7a21b17f02b"
integrity sha512-AN+GZNXytX9yxGi0JOfxHrRTbhFybjUJ05rnsBVjcB+16e466Z0Xe5IxawuOayVZgTBNDxmPKo5j4V6OnMtaSQ==
dependencies:
"@types/react" "*"
"@material-ui/types@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.0.0.tgz#26d6259dc6b39f4c2e1e9aceff7a11e031941741"
integrity sha512-UeH2BuKkwDndtMSS0qgx1kCzSMw+ydtj0xx/XbFtxNSTlXydKwzs5gVW5ZKsFlAkwoOOQ9TIsyoCC8hq18tOwg==
"@material-ui/utils@^4.5.2":
version "4.5.2"
@ -1179,6 +1178,15 @@
prop-types "^15.7.2"
react-is "^16.8.6"
"@material-ui/utils@^4.7.1":
version "4.7.1"
resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.7.1.tgz#dc16c7f0d2cd02fbcdd5cfe601fd6863ae3cc652"
integrity sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==
dependencies:
"@babel/runtime" "^7.4.4"
prop-types "^15.7.2"
react-is "^16.8.0"
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@ -3086,7 +3094,7 @@ css-unit-converter@^1.1.1:
resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
css-vendor@^2.0.6:
css-vendor@^2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.7.tgz#4e6d53d953c187981576d6a542acc9fb57174bda"
integrity sha512-VS9Rjt79+p7M0WkPqcAza4Yq1ZHrsHrwf7hPL/bjQB+c1lwmAI+1FXxYTYt818D/50fFVflw0XKleiBN5RITkg==
@ -6148,69 +6156,69 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
jss-plugin-camel-case@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0.tgz#d601bae2e8e2041cc526add289dcd7062db0a248"
integrity sha512-yALDL00+pPR4FJh+k07A8FeDvfoPPuXU48HLy63enAubcVd3DnS+2rgqPXglHDGixIDVkCSXecl/l5GAMjzIbA==
jss-plugin-camel-case@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.3.tgz#ce25f3cdb7f2b80724558361351fe6b644ca9e4f"
integrity sha512-rild/oFKFkmRP7AoiX9D6bdDAUfmJv8c7sEBvFoi+JP31dn2W8nw4txMKGnV1LJKlFkYprdZt1X99Uvztl1hug==
dependencies:
"@babel/runtime" "^7.3.1"
hyphenate-style-name "^1.0.3"
jss "10.0.0"
jss "^10.0.3"
jss-plugin-default-unit@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0.tgz#601caf5f576fc0c66986fbe8a9aa37307a3a3ea3"
integrity sha512-sURozIOdCtGg9ap18erQ+ijndAfEGtTaetxfU3H4qwC18Bi+fdvjlY/ahKbuu0ASs7R/+WKCP7UaRZOjUDMcdQ==
jss-plugin-default-unit@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.3.tgz#c4b97b7b18c6cf9e9809e05b8525045decc298d3"
integrity sha512-n+XfVLPF9Qh7IOTdQ8M4oRpjpg6egjr/r0NNytubbCafMgCILJYIVrMTGgOTydH+uvak8onQY3f/F9hasPUx6g==
dependencies:
"@babel/runtime" "^7.3.1"
jss "10.0.0"
jss "^10.0.3"
jss-plugin-global@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.0.0.tgz#0fed1b6461e0d57d6e394f877529009bc1cb3cb6"
integrity sha512-80ofWKSQUo62bxLtRoTNe0kFPtHgUbAJeOeR36WEGgWIBEsXLyXOnD5KNnjPqG4heuEkz9eSLccjYST50JnI7Q==
jss-plugin-global@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.0.3.tgz#82bc95aa7f2c7171adc3ea47ec7717aca76a2389"
integrity sha512-kNotkAciJIXpIGYnmueaIifBne9rdq31O8Xq1nF7KMfKlskNRANTcEX5rVnsGKl2yubTMYfjKBFCeDgcQn6+gA==
dependencies:
"@babel/runtime" "^7.3.1"
jss "10.0.0"
jss "^10.0.3"
jss-plugin-nested@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.0.0.tgz#d37ecc013c3b0d0e4acc2b48f6b62da6ae53948b"
integrity sha512-waxxwl/po1hN3azTyixKnr8ReEqUv5WK7WsO+5AWB0bFndML5Yqnt8ARZ90HEg8/P6WlqE/AB2413TkCRZE8bA==
jss-plugin-nested@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.0.3.tgz#1ff39383154a710008788dbc9f73e6dec77b2852"
integrity sha512-OMucRs9YLvWlZ3Ew+VhdgNVMwSS2zZy/2vy+s/etvopnPUzDHgCnJwdY2Wx/SlhLGERJeKKufyih2seH+ui0iw==
dependencies:
"@babel/runtime" "^7.3.1"
jss "10.0.0"
jss "^10.0.3"
tiny-warning "^1.0.2"
jss-plugin-props-sort@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0.tgz#38a13407384c2a4a7c026659488350669b953b18"
integrity sha512-41mf22CImjwNdtOG3r+cdC8+RhwNm616sjHx5YlqTwtSJLyLFinbQC/a4PIFk8xqf1qpFH1kEAIw+yx9HaqZ3g==
jss-plugin-props-sort@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.3.tgz#8bc9f2a670fbd603f110486d28c526eb9efcbdc4"
integrity sha512-ufhvdCMnRcDa0tNHoZ12OcVNQQyE10yLMohxo/UIMarLV245rM6n9D19A12epjldRgyiS13SoSyLFCJEobprYg==
dependencies:
"@babel/runtime" "^7.3.1"
jss "10.0.0"
jss "^10.0.3"
jss-plugin-rule-value-function@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0.tgz#3ec1b781b7c86080136dbef6c36e91f20244b72e"
integrity sha512-Jw+BZ8JIw1f12V0SERqGlBT1JEPWax3vuZpMym54NAXpPb7R1LYHiCTIlaJUyqvIfEy3kiHMtgI+r2whGgRIxQ==
jss-plugin-rule-value-function@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.3.tgz#1103240cf686bde5baee16cd7b15b0daf79d1103"
integrity sha512-RWwIT2UBAIwf3f6DQtt5gyjxHMRJoeO9TQku+ueR8dBMakqSSe8vFwQNfjXEoe0W+Tez5HZCTkZKNMulv3Z+9A==
dependencies:
"@babel/runtime" "^7.3.1"
jss "10.0.0"
jss "^10.0.3"
jss-plugin-vendor-prefixer@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0.tgz#400280535b0f483a9c78105afe4eee61b70018eb"
integrity sha512-qslqvL0MUbWuzXJWdUxpj6mdNUX8jr4FFTo3aZnAT65nmzWL7g8oTr9ZxmTXXgdp7ANhS1QWE7036/Q2isFBpw==
jss-plugin-vendor-prefixer@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.3.tgz#cfdf2ac1263e190ee9a0d874cdcc6092df452012"
integrity sha512-zVs6e5z4tFRK/fJ5kuTLzXlTFQbLeFTVwk7lTZiYNufmZwKT0kSmnOJDUukcSe7JLGSRztjWhnHB/6voP174gw==
dependencies:
"@babel/runtime" "^7.3.1"
css-vendor "^2.0.6"
jss "10.0.0"
css-vendor "^2.0.7"
jss "^10.0.3"
jss@10.0.0, jss@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/jss/-/jss-10.0.0.tgz#998d5026c02accae15708de83bd6ba57bac977d2"
integrity sha512-TPpDFsiBjuERiL+dFDq8QCdiF9oDasPcNqCKLGCo/qED3fNYOQ8PX2lZhknyTiAt3tZrfOFbb0lbQ9lTjPZxsQ==
jss@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/jss/-/jss-10.0.3.tgz#5c160f96aa8ce8b9f851ee0b33505dcd37f490a4"
integrity sha512-AcDvFdOk16If9qvC9KN3oFXsrkHWM9+TaPMpVB9orm3z+nq1Xw3ofHyflRe/mkSucRZnaQtlhZs1hdP3DR9uRw==
dependencies:
"@babel/runtime" "^7.3.1"
csstype "^2.6.5"
@ -8640,7 +8648,7 @@ react-image-lightbox@^5.1.1:
prop-types "^15.6.2"
react-modal "^3.8.1"
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.6, react-is@^16.9.0:
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.6, react-is@^16.9.0:
version "16.12.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==