@@ -5,46 +5,61 @@ export default class CodeGroup extends React.Component {
55 constructor ( props ) {
66 super ( props ) ;
77
8+ this . toggleLang = this . toggleLang . bind ( this ) ;
9+ this . langs = this . props . langs . split ( ',' ) ;
10+
811 this . state = {
9- currentTab : false ,
12+ currentTab : this . langs [ 0 ] . toLowerCase ( ) ,
1013 } ;
1114 }
1215
13- getLangs ( ) {
14- const langs = [ ] ;
16+ toggleLang ( e ) {
17+ this . setState ( {
18+ currentTab : e . target . dataset . lang ,
19+ } ) ;
20+ }
1521
16- _ . forEach ( this . props . children , ( val ) => {
17- if ( _ . isObject ( val ) ) {
18- _ . forEach ( val . props . children , ( subEl ) => {
19- if ( _ . isObject ( subEl ) ) {
20- langs . push ( subEl . props . className . replace ( 'language-' , '' ) ) ;
21- }
22- } ) ;
23- }
22+ renderTabs ( ) {
23+ const { langs } = this ;
24+ const { currentTab } = this . state ;
25+
26+ const tabs = langs . map ( ( lang ) => {
27+ const isActive = lang . toLowerCase ( ) === currentTab ? 'is-active' : null ;
28+ const classes = `tab ${ isActive } ` ;
29+
30+ return < li key = { lang } className = { classes } data-lang = { lang . toLowerCase ( ) } onClick = { this . toggleLang } onKeyDown = { this . handleClick } role = "button" > { lang } </ li > ;
2431 } ) ;
2532
26- return langs ;
33+ return tabs ;
2734 }
2835
2936 renderCodeBlocks ( ) {
37+ const { langs } = this ;
38+ const { currentTab } = this . state ;
3039 // Remove empty strings from array
3140 const codeBlocks = this . props . children . filter ( block => _ . isObject ( block ) ) ;
3241
3342 // return code blocks wrapped parent element
34- return codeBlocks . map ( block => < div className = "tabbed-code_block" > { block } </ div > ) ;
35- }
43+ return codeBlocks . map ( ( block , i ) => {
44+ const lang = langs [ i ] . toLowerCase ( ) ;
45+ let classes = `tabbed-code__block ${ lang } ` ;
3646
37- render ( ) {
38- const langs = this . getLangs ( ) ;
47+ if ( lang === currentTab ) {
48+ classes = classes . concat ( ' show' ) ;
49+ }
3950
51+ return < div key = { block . key } className = { classes } > { block } </ div > ;
52+ } ) ;
53+ }
4054
55+ render ( ) {
4156 return (
42-
4357 < div className = "tabbed-code" >
44- { /* {langs.map(lang => <span claName="tabbed-code_tab">{lang}</span>) } */ }
45- { /* {this.renderCodeBlocks()} */ }
58+ < ul className = "tab-wrapper is-editor" >
59+ { this . renderTabs ( ) }
60+ </ ul >
61+ { this . renderCodeBlocks ( ) }
4662 </ div >
47-
4863 ) ;
4964 }
5065}
0 commit comments