Skip to content

Commit d430e80

Browse files
theswerdoliviertassinari
authored andcommitted
[docs] Improve the demos copy experience (#19291)
1 parent 80d9d7c commit d430e80

File tree

2 files changed

+47
-25
lines changed

2 files changed

+47
-25
lines changed

docs/src/modules/components/Demo.js

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import Collapse from '@material-ui/core/Collapse';
1111
import NoSsr from '@material-ui/core/NoSsr';
1212
import EditIcon from '@material-ui/icons/Edit';
1313
import CodeIcon from '@material-ui/icons/Code';
14-
import GitHubIcon from '@material-ui/icons/GitHub';
14+
import FileCopyIcon from '@material-ui/icons/FileCopy';
15+
import Snackbar from '@material-ui/core/Snackbar';
1516
import Menu from '@material-ui/core/Menu';
1617
import MenuItem from '@material-ui/core/MenuItem';
1718
import MoreVertIcon from '@material-ui/icons/MoreVert';
@@ -168,6 +169,13 @@ function Demo(props) {
168169
setDemoHovered(event.type === 'mouseenter');
169170
};
170171

172+
const [snackbarOpen, setSnackbarOpen] = React.useState(false);
173+
const [snackbarMessage, setSnackbarMessage] = React.useState(undefined);
174+
175+
const handleSnackbarClose = () => {
176+
setSnackbarOpen(false);
177+
};
178+
171179
const handleCodeLanguageClick = (event, clickedCodeVariant) => {
172180
if (codeVariant !== clickedCodeVariant) {
173181
dispatch({
@@ -179,7 +187,7 @@ function Demo(props) {
179187
}
180188
};
181189

182-
const handleClickCodeSandbox = () => {
190+
const handleCodeSandboxClick = () => {
183191
const demoConfig = getDemoConfig(demoData);
184192
const parameters = compress({
185193
files: {
@@ -214,23 +222,25 @@ function Demo(props) {
214222
};
215223

216224
const [anchorEl, setAnchorEl] = React.useState(null);
217-
const handleClickMore = event => {
225+
const handleMoreClick = event => {
218226
setAnchorEl(event.currentTarget);
219227
};
220228

221-
const handleCloseMore = () => {
229+
const handleMoreClose = () => {
222230
setAnchorEl(null);
223231
};
224232

225-
const handleClickCopy = async () => {
233+
const handleCopyClick = async () => {
226234
try {
227235
await copy(demoData.raw);
236+
setSnackbarMessage(t('copiedSource'));
237+
setSnackbarOpen(true);
228238
} finally {
229-
handleCloseMore();
239+
handleMoreClose();
230240
}
231241
};
232242

233-
const handleClickStackBlitz = () => {
243+
const handleStackBlitzClick = () => {
234244
const demoConfig = getDemoConfig(demoData);
235245
const form = document.createElement('form');
236246
form.method = 'POST';
@@ -248,7 +258,7 @@ function Demo(props) {
248258
document.body.appendChild(form);
249259
form.submit();
250260
document.body.removeChild(form);
251-
handleCloseMore();
261+
handleMoreClose();
252262
};
253263

254264
const showSourceHint = demoHovered && !sourceHintSeen;
@@ -273,8 +283,10 @@ function Demo(props) {
273283
const createHandleCodeSourceLink = anchor => async () => {
274284
try {
275285
await copy(`${window.location.href.split('#')[0]}#${anchor}`);
286+
setSnackbarMessage(t('copiedSourceLink'));
287+
setSnackbarOpen(true);
276288
} finally {
277-
handleCloseMore();
289+
handleMoreClose();
278290
}
279291
};
280292

@@ -287,7 +299,7 @@ function Demo(props) {
287299
}
288300
}, [demoName]);
289301

290-
const handleClickCodeOpen = () => {
302+
const handleCodeOpenClick = () => {
291303
document.cookie = `sourceHintSeen=true;path=/;max-age=31536000`;
292304
setCodeOpen(open => !open);
293305
setSourceHintSeen(setSourceHintSeen(true));
@@ -355,7 +367,7 @@ function Demo(props) {
355367
data-ga-event-category="demo"
356368
data-ga-event-label={demoOptions.demo}
357369
data-ga-event-action="expand"
358-
onClick={handleClickCodeOpen}
370+
onClick={handleCodeOpenClick}
359371
color={demoHovered ? 'primary' : 'default'}
360372
>
361373
<CodeIcon fontSize="small" />
@@ -372,31 +384,29 @@ function Demo(props) {
372384
data-ga-event-category="demo"
373385
data-ga-event-label={demoOptions.demo}
374386
data-ga-event-action="codesandbox"
375-
onClick={handleClickCodeSandbox}
387+
onClick={handleCodeSandboxClick}
376388
>
377389
<EditIcon fontSize="small" />
378390
</IconButton>
379391
</Tooltip>
380392
)}
381393
<Tooltip
382394
classes={{ popper: classes.tooltip }}
383-
title={t('viewGitHub')}
395+
title={t('copySource')}
384396
placement="top"
385397
>
386398
<IconButton
387-
aria-label={t('viewGitHub')}
399+
aria-label={t('copySource')}
388400
data-ga-event-category="demo"
389401
data-ga-event-label={demoOptions.demo}
390-
data-ga-event-action="github"
391-
href={demoData.githubLocation}
392-
target="_blank"
393-
rel="noopener nofollow"
402+
data-ga-event-action="copy"
403+
onClick={handleCopyClick}
394404
>
395-
<GitHubIcon fontSize="small" />
405+
<FileCopyIcon fontSize="small" />
396406
</IconButton>
397407
</Tooltip>
398408
<IconButton
399-
onClick={handleClickMore}
409+
onClick={handleMoreClick}
400410
aria-owns={anchorEl ? 'demo-menu-more' : undefined}
401411
aria-haspopup="true"
402412
aria-label={t('seeMore')}
@@ -407,7 +417,7 @@ function Demo(props) {
407417
id="demo-menu-more"
408418
anchorEl={anchorEl}
409419
open={Boolean(anchorEl)}
410-
onClose={handleCloseMore}
420+
onClose={handleMoreClose}
411421
getContentAnchorEl={null}
412422
anchorOrigin={{
413423
vertical: 'top',
@@ -421,17 +431,21 @@ function Demo(props) {
421431
<MenuItem
422432
data-ga-event-category="demo"
423433
data-ga-event-label={demoOptions.demo}
424-
data-ga-event-action="copy"
425-
onClick={handleClickCopy}
434+
data-ga-event-action="github"
435+
component="a"
436+
href={demoData.githubLocation}
437+
target="_blank"
438+
rel="noopener nofollow"
439+
onClick={handleMoreClose}
426440
>
427-
{t('copySource')}
441+
{t('viewGitHub')}
428442
</MenuItem>
429443
{demoOptions.hideEditButton ? null : (
430444
<MenuItem
431445
data-ga-event-category="demo"
432446
data-ga-event-label={demoOptions.demo}
433447
data-ga-event-action="stackblitz"
434-
onClick={handleClickStackBlitz}
448+
onClick={handleStackBlitzClick}
435449
>
436450
{t('stackblitz')}
437451
</MenuItem>
@@ -463,6 +477,12 @@ function Demo(props) {
463477
text={`\`\`\`${demoData.sourceLanguage}\n${codeOpen ? demoData.raw : jsx}\n\`\`\``}
464478
/>
465479
</Collapse>
480+
<Snackbar
481+
open={snackbarOpen}
482+
autoHideDuration={3000}
483+
onClose={handleSnackbarClose}
484+
message={snackbarMessage}
485+
/>
466486
</div>
467487
);
468488
}

docs/translations/translations.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@
6565
"codesandbox": "Edit in CodeSandbox",
6666
"seeMore": "See more",
6767
"copySource": "Copy the source",
68+
"copiedSource": "The source code has been copied.",
6869
"copySourceLinkJS": "Copy link to JavaScript source",
6970
"copySourceLinkTS": "Copy link to TypeScript source",
71+
"copiedSourceLink": "Link to the source code has been copied.",
7072
"stackblitz": "Edit in StackBlitz (JS only)",
7173
"headTitle": "Material-UI: A popular React UI framework",
7274
"emojiLove": "Love",

0 commit comments

Comments
 (0)