diff --git a/docs/src/pages/demos/progress/CircularDeterminate.tsx b/docs/src/pages/demos/progress/CircularDeterminate.tsx new file mode 100644 index 00000000000000..08598fa33a69d3 --- /dev/null +++ b/docs/src/pages/demos/progress/CircularDeterminate.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { makeStyles, Theme } from '@material-ui/core/styles'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +const useStyles = makeStyles((theme: Theme) => ({ + progress: { + margin: theme.spacing(2), + }, +})); + +function CircularDeterminate() { + const classes = useStyles(); + const [progress, setProgress] = React.useState(0); + + React.useEffect(() => { + function tick() { + // reset when reaching 100% + setProgress(oldProgress => (oldProgress >= 100 ? 0 : oldProgress + 1)); + } + + const timer = setInterval(tick, 20); + return () => { + clearInterval(timer); + }; + }, []); + + return ( +
+ + +
+ ); +} + +export default CircularDeterminate; diff --git a/docs/src/pages/demos/progress/CircularIndeterminate.tsx b/docs/src/pages/demos/progress/CircularIndeterminate.tsx new file mode 100644 index 00000000000000..699dc32db51d22 --- /dev/null +++ b/docs/src/pages/demos/progress/CircularIndeterminate.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { createStyles, withStyles, WithStyles, Theme } from '@material-ui/core/styles'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +const styles = (theme: Theme) => + createStyles({ + progress: { + margin: theme.spacing(2), + }, + }); + +export type Props = WithStyles; + +function CircularIndeterminate(props: Props) { + const { classes } = props; + return ( +
+ + +
+ ); +} + +CircularIndeterminate.propTypes = { + classes: PropTypes.object.isRequired, +} as any; + +export default withStyles(styles)(CircularIndeterminate); diff --git a/docs/src/pages/demos/progress/CircularIntegration.js b/docs/src/pages/demos/progress/CircularIntegration.js index 4ccac71a669c98..bb8b9b8b52f18d 100644 --- a/docs/src/pages/demos/progress/CircularIntegration.js +++ b/docs/src/pages/demos/progress/CircularIntegration.js @@ -44,7 +44,7 @@ function CircularIntegration() { const classes = useStyles(); const [loading, setLoading] = React.useState(false); const [success, setSuccess] = React.useState(false); - const timer = React.useRef(null); + const timer = React.useRef(undefined); const buttonClassname = clsx({ [classes.buttonSuccess]: success, diff --git a/docs/src/pages/demos/progress/CircularIntegration.tsx b/docs/src/pages/demos/progress/CircularIntegration.tsx new file mode 100644 index 00000000000000..b6e3f3de3a6bc4 --- /dev/null +++ b/docs/src/pages/demos/progress/CircularIntegration.tsx @@ -0,0 +1,94 @@ +import React from 'react'; +import clsx from 'clsx'; +import { makeStyles, Theme } from '@material-ui/core/styles'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import green from '@material-ui/core/colors/green'; +import Button from '@material-ui/core/Button'; +import Fab from '@material-ui/core/Fab'; +import CheckIcon from '@material-ui/icons/Check'; +import SaveIcon from '@material-ui/icons/Save'; + +const useStyles = makeStyles((theme: Theme) => ({ + root: { + display: 'flex', + alignItems: 'center', + }, + wrapper: { + margin: theme.spacing(1), + position: 'relative', + }, + buttonSuccess: { + backgroundColor: green[500], + '&:hover': { + backgroundColor: green[700], + }, + }, + fabProgress: { + color: green[500], + position: 'absolute', + top: -6, + left: -6, + zIndex: 1, + }, + buttonProgress: { + color: green[500], + position: 'absolute', + top: '50%', + left: '50%', + marginTop: -12, + marginLeft: -12, + }, +})); + +function CircularIntegration() { + const classes = useStyles(); + const [loading, setLoading] = React.useState(false); + const [success, setSuccess] = React.useState(false); + const timer = React.useRef(undefined); + + const buttonClassname = clsx({ + [classes.buttonSuccess]: success, + }); + + React.useEffect(() => { + return () => { + clearTimeout(timer.current); + }; + }, []); + + function handleButtonClick() { + if (!loading) { + setSuccess(false); + setLoading(true); + timer.current = setTimeout(() => { + setSuccess(true); + setLoading(false); + }, 2000); + } + } + + return ( +
+
+ + {success ? : } + + {loading && } +
+
+ + {loading && } +
+
+ ); +} + +export default CircularIntegration; diff --git a/docs/src/pages/demos/progress/CircularStatic.tsx b/docs/src/pages/demos/progress/CircularStatic.tsx new file mode 100644 index 00000000000000..fa1b56c9b45128 --- /dev/null +++ b/docs/src/pages/demos/progress/CircularStatic.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { makeStyles, Theme } from '@material-ui/core/styles'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +const useStyles = makeStyles((theme: Theme) => ({ + progress: { + margin: theme.spacing(2), + }, +})); + +function CircularStatic() { + const classes = useStyles(); + const [completed, setCompleted] = React.useState(0); + + React.useEffect(() => { + function progress() { + setCompleted(prevCompleted => (prevCompleted >= 100 ? 0 : prevCompleted + 10)); + } + + const timer = setInterval(progress, 1000); + return () => { + clearInterval(timer); + }; + }, []); + + return ( +
+ + + + + + +
+ ); +} + +export default CircularStatic; diff --git a/docs/src/pages/demos/progress/CircularUnderLoad.tsx b/docs/src/pages/demos/progress/CircularUnderLoad.tsx new file mode 100644 index 00000000000000..0053e2fa6e1cde --- /dev/null +++ b/docs/src/pages/demos/progress/CircularUnderLoad.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +function CircularUnderLoad() { + return ; +} + +export default CircularUnderLoad; diff --git a/docs/src/pages/demos/progress/CustomizedProgress.tsx b/docs/src/pages/demos/progress/CustomizedProgress.tsx new file mode 100644 index 00000000000000..b60ef8afd0eda6 --- /dev/null +++ b/docs/src/pages/demos/progress/CustomizedProgress.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { createStyles, withStyles, WithStyles, Theme } from '@material-ui/core/styles'; +import { lighten } from '@material-ui/core/styles/colorManipulator'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Paper from '@material-ui/core/Paper'; +import LinearProgress from '@material-ui/core/LinearProgress'; + +const styles = (theme: Theme) => + createStyles({ + root: { + flexGrow: 1, + }, + progress: { + margin: theme.spacing(2), + color: '#00695c', + }, + linearColorPrimary: { + backgroundColor: '#b2dfdb', + }, + linearBarColorPrimary: { + backgroundColor: '#00695c', + }, + linearProgressDeterminate: { + margin: `${theme.spacing(1)}px auto 0`, + height: 10, + backgroundColor: lighten('#ff6c5c', 0.5), + }, + linearProgressDeterminateBar: { + borderRadius: 20, + backgroundColor: '#ff6c5c', + }, + // Reproduce the Facebook spinners. + facebook: { + margin: theme.spacing(2), + position: 'relative', + }, + facebook1: { + color: '#eef3fd', + }, + facebook2: { + color: '#6798e5', + animationDuration: '550ms', + position: 'absolute', + left: 0, + }, + }); + +export type Props = WithStyles; + +function CustomizedProgress(props: Props) { + const { classes } = props; + + return ( + + + + +
+ + +
+
+ ); +} + +CustomizedProgress.propTypes = { + classes: PropTypes.object.isRequired, +} as any; + +export default withStyles(styles)(CustomizedProgress); diff --git a/docs/src/pages/demos/progress/LinearBuffer.js b/docs/src/pages/demos/progress/LinearBuffer.js index 25ffd61a8bb6dd..d513224c15691a 100644 --- a/docs/src/pages/demos/progress/LinearBuffer.js +++ b/docs/src/pages/demos/progress/LinearBuffer.js @@ -13,7 +13,7 @@ function LinearBuffer() { const [completed, setCompleted] = React.useState(0); const [buffer, setBuffer] = React.useState(10); - const progress = React.useRef(); + const progress = React.useRef(() => {}); React.useEffect(() => { progress.current = () => { if (completed > 100) { diff --git a/docs/src/pages/demos/progress/LinearBuffer.tsx b/docs/src/pages/demos/progress/LinearBuffer.tsx new file mode 100644 index 00000000000000..d513224c15691a --- /dev/null +++ b/docs/src/pages/demos/progress/LinearBuffer.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import LinearProgress from '@material-ui/core/LinearProgress'; + +const useStyles = makeStyles({ + root: { + flexGrow: 1, + }, +}); + +function LinearBuffer() { + const classes = useStyles(); + const [completed, setCompleted] = React.useState(0); + const [buffer, setBuffer] = React.useState(10); + + const progress = React.useRef(() => {}); + React.useEffect(() => { + progress.current = () => { + if (completed > 100) { + setCompleted(0); + setBuffer(10); + } else { + const diff = Math.random() * 10; + const diff2 = Math.random() * 10; + setCompleted(completed + diff); + setBuffer(completed + diff + diff2); + } + }; + }); + + React.useEffect(() => { + function tick() { + progress.current(); + } + const timer = setInterval(tick, 500); + + return () => { + clearInterval(timer); + }; + }, []); + + return ( +
+ +
+ +
+ ); +} + +export default LinearBuffer; diff --git a/docs/src/pages/demos/progress/LinearDeterminate.tsx b/docs/src/pages/demos/progress/LinearDeterminate.tsx new file mode 100644 index 00000000000000..dd6731511e60b5 --- /dev/null +++ b/docs/src/pages/demos/progress/LinearDeterminate.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import LinearProgress from '@material-ui/core/LinearProgress'; + +const useStyles = makeStyles({ + root: { + flexGrow: 1, + }, +}); + +function LinearDeterminate() { + const classes = useStyles(); + const [completed, setCompleted] = React.useState(0); + + React.useEffect(() => { + function progress() { + setCompleted(oldCompleted => { + if (oldCompleted === 100) { + return 0; + } + const diff = Math.random() * 10; + return Math.min(oldCompleted + diff, 100); + }); + } + + const timer = setInterval(progress, 500); + return () => { + clearInterval(timer); + }; + }, []); + + return ( +
+ +
+ +
+ ); +} + +export default LinearDeterminate; diff --git a/docs/src/pages/demos/progress/LinearIndeterminate.tsx b/docs/src/pages/demos/progress/LinearIndeterminate.tsx new file mode 100644 index 00000000000000..23884d1b2ee435 --- /dev/null +++ b/docs/src/pages/demos/progress/LinearIndeterminate.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { createStyles, withStyles, WithStyles } from '@material-ui/core/styles'; +import LinearProgress from '@material-ui/core/LinearProgress'; + +const styles = createStyles({ + root: { + flexGrow: 1, + }, +}); + +export type Props = WithStyles; + +function LinearIndeterminate(props: Props) { + const { classes } = props; + return ( +
+ +
+ +
+ ); +} + +LinearIndeterminate.propTypes = { + classes: PropTypes.object.isRequired, +} as any; + +export default withStyles(styles)(LinearIndeterminate); diff --git a/docs/src/pages/demos/progress/LinearQuery.tsx b/docs/src/pages/demos/progress/LinearQuery.tsx new file mode 100644 index 00000000000000..8bfe15a19d4e07 --- /dev/null +++ b/docs/src/pages/demos/progress/LinearQuery.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { createStyles, withStyles, WithStyles } from '@material-ui/core/styles'; +import LinearProgress from '@material-ui/core/LinearProgress'; + +const styles = createStyles({ + root: { + flexGrow: 1, + }, +}); + +export type Props = WithStyles; + +function LinearQuery(props: Props) { + const { classes } = props; + return ( +
+ +
+ +
+ ); +} + +LinearQuery.propTypes = { + classes: PropTypes.object.isRequired, +} as any; + +export default withStyles(styles)(LinearQuery);