Skip to content

Commit 3f11375

Browse files
Francois Eochedpellier
Francois Eoche
authored andcommitted
docs(storybook): add versions selector in sidebar - review
Signed-off-by: Francois Eoche <[email protected]>
1 parent fda04e3 commit 3f11375

File tree

1 file changed

+40
-32
lines changed

1 file changed

+40
-32
lines changed

packages/tools/storybook/.storybook/manager.js

+40-32
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,50 @@ import React from 'react';
44

55
import { releases } from '../public/releases.js';
66

7-
const createHeaderElement = (element) => {
8-
const timer = setInterval(function(){
9-
let selector = document.querySelector('.sidebar-header');
10-
if (selector !== null) {
11-
selector.parentNode.insertBefore(element, selector.nextSibling);
12-
if(document.querySelector('#release-selector').innerHTML) {
13-
clearInterval(timer);
7+
document.addEventListener('DOMContentLoaded', function() {
8+
const callback = function(mutationsList) {
9+
for (let i = 0, len = mutationsList.length; i < len; i++) {
10+
if (mutationsList[i].type === 'childList') {
11+
12+
// Add version select
13+
if(!document.querySelector('#release-selector')) {
14+
const urlVersionRegex = /\/(latest|v(\d\.?){3}[^\/]*)\//gmi;
15+
const selector = document.querySelector('.sidebar-header');
16+
let element;
17+
if (urlVersionRegex.test(location.href)) {
18+
const releasesSelector = document.createElement('select');
19+
releasesSelector.id = 'release-selector';
20+
Object.entries(releases).forEach((value) => {
21+
const option = document.createElement('option');
22+
option.text = value[0];
23+
option.value = value[1];
24+
releasesSelector.appendChild(option)
25+
});
26+
element = releasesSelector;
27+
28+
releasesSelector.onchange = (selection) => {
29+
const version = selection.target.value === 'latest' ? 'latest' : `v${selection.target.value}`;
30+
location.pathname = location.pathname.replace(urlVersionRegex, version);
31+
};
32+
} else {
33+
const version = document.createElement('div');
34+
version.id = 'release-selector';
35+
version.innerText = Object.keys(releases)[0];
36+
element = version;
37+
}
38+
selector.parentNode.insertBefore(element, selector.nextSibling);
39+
40+
}
41+
break;
1442
}
1543
}
16-
}, 500);
17-
};
44+
};
45+
const observer = new MutationObserver(callback);
46+
observer.observe(document.body, { childList: true, subtree: false });
47+
}, false);
48+
1849

19-
setTimeout(() => {
20-
const urlVersionRegex = /\/(latest|v(\d\.?){3}[^\/]*)\//gmi;
21-
if (urlVersionRegex.test(location.href)) {
22-
const releasesSelector = document.createElement('select');
23-
releasesSelector.id = 'release-selector';
24-
Object.entries(releases).map((value) => {
25-
const option = document.createElement('option');
26-
option.text = value[0];
27-
option.value = value[1];
28-
releasesSelector.appendChild(option)
29-
});
30-
createHeaderElement(releasesSelector);
3150

32-
releasesSelector.onchange = (selection) => {
33-
const version = selection.target.value === 'latest' ? 'latest' : `v${selection.target.value}`;
34-
location.pathname = location.pathname.replace(urlVersionRegex, version);
35-
};
36-
} else {
37-
const version = document.createElement('div');
38-
version.id = 'release-selector';
39-
version.innerText = Object.keys(releases)[0];
40-
createHeaderElement(version);
41-
}
42-
}, 2000);
4351

4452
addons.setConfig({
4553
theme,

0 commit comments

Comments
 (0)