Skip to content

Commit 2215e40

Browse files
authored
[docs] Improve demo source discoverability (#14635)
* [docs] Cleanup Demo code related to iframe * [docs] Improve demo source discoverability * [docs] Show "Show Source" tooltip before first interaction * Use max-age instead of expires for cookie Co-Authored-By: eps1lon <[email protected]> * [docs] knowsAboutShowSource -> sourceHintSeen
1 parent bfa9167 commit 2215e40

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

docs/src/modules/components/Demo.js

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import DemoFrame from 'docs/src/modules/components/DemoFrame';
1919
import DemoLanguages from 'docs/src/modules/components/DemoLanguages';
2020
import getDemoConfig from 'docs/src/modules/utils/getDemoConfig';
2121
import compose from 'docs/src/modules/utils/compose';
22+
import { getCookie } from 'docs/src/modules/utils/helpers';
2223
import { ACTION_TYPES, CODE_VARIANTS } from 'docs/src/modules/constants';
2324

2425
function compress(object) {
@@ -95,8 +96,14 @@ class Demo extends React.Component {
9596
state = {
9697
anchorEl: null,
9798
codeOpen: false,
99+
demoHovered: false,
100+
sourceHintSeen: false,
98101
};
99102

103+
componentDidMount() {
104+
this.setState({ sourceHintSeen: getCookie('sourceHintSeen') });
105+
}
106+
100107
handleClickMore = event => {
101108
this.setState({ anchorEl: event.currentTarget });
102109
};
@@ -183,11 +190,17 @@ class Demo extends React.Component {
183190
};
184191

185192
handleClickCodeOpen = () => {
193+
document.cookie = `sourceHintSeen=true;path=/;max-age=31536000`;
186194
this.setState(state => ({
187195
codeOpen: !state.codeOpen,
196+
sourceHintSeen: true,
188197
}));
189198
};
190199

200+
handleDemoHover = event => {
201+
this.setState({ demoHovered: event.type === 'mouseenter' });
202+
};
203+
191204
getDemoData = () => {
192205
const { codeVariant, demo, githubLocation } = this.props;
193206
if (codeVariant === CODE_VARIANTS.HOOK && demo.rawHooks) {
@@ -217,11 +230,13 @@ class Demo extends React.Component {
217230

218231
render() {
219232
const { classes, codeVariant, demo, demoOptions } = this.props;
220-
const { anchorEl, codeOpen } = this.state;
233+
const { anchorEl, codeOpen, demoHovered, sourceHintSeen } = this.state;
234+
const showSourceHint = demoHovered && !sourceHintSeen;
221235
const category = demoOptions.demo;
222236
const demoData = this.getDemoData();
223237
const DemoComponent = demoData.js;
224238
const sourceLanguage = demoData.codeVariant === CODE_VARIANTS.TS ? 'tsx' : 'jsx';
239+
const Frame = demoOptions.iframe ? DemoFrame : React.Fragment;
225240

226241
return (
227242
<div className={classes.root}>
@@ -236,12 +251,18 @@ class Demo extends React.Component {
236251
onLanguageClick={this.handleCodeLanguageClick}
237252
/>
238253
<div>
239-
<Tooltip title={codeOpen ? 'Hide the source' : 'Show the source'} placement="top">
254+
<Tooltip
255+
key={showSourceHint}
256+
open={showSourceHint ? true : undefined}
257+
title={codeOpen ? 'Hide the source' : 'Show the source'}
258+
placement="top"
259+
>
240260
<IconButton
241261
data-ga-event-category={category}
242262
data-ga-event-action="expand"
243263
onClick={this.handleClickCodeOpen}
244264
aria-label={codeOpen ? 'Hide the source' : 'Show the source'}
265+
color={demoHovered ? 'primary' : 'default'}
245266
>
246267
<CodeIcon />
247268
</IconButton>
@@ -324,14 +345,12 @@ class Demo extends React.Component {
324345
className={clsx(classes.demo, {
325346
[classes.demoHiddenHeader]: demoOptions.hideHeader,
326347
})}
348+
onMouseEnter={this.handleDemoHover}
349+
onMouseLeave={this.handleDemoHover}
327350
>
328-
{demoOptions.iframe ? (
329-
<DemoFrame>
330-
<DemoComponent />
331-
</DemoFrame>
332-
) : (
351+
<Frame>
333352
<DemoComponent />
334-
)}
353+
</Frame>
335354
</div>
336355
</div>
337356
);

0 commit comments

Comments
 (0)