@@ -5,61 +5,122 @@ const Oas = require('./lib/Oas');
5
5
6
6
const { Operation } = Oas ;
7
7
8
+ const syntaxHighlighter = require ( '@readme/syntax-highlighter' ) ;
9
+
8
10
const generateCodeSnippet = require ( './lib/generate-code-snippet' ) ;
9
11
10
- function CodeSample ( { oas, setLanguage, operation, formData, language } ) {
11
- return (
12
- < div className = "code-sample tabber-parent" >
13
- { ( ( ) => {
14
- if ( ! oas [ extensions . SAMPLES_ENABLED ] ) {
15
- return < div className = "hub-no-code" > No code samples available</ div > ;
16
- }
12
+ class CodeSample extends React . Component {
13
+ constructor ( props ) {
14
+ super ( props ) ;
15
+ this . state = {
16
+ customCodeSampleTab : 0 ,
17
+ } ;
18
+ this . setCustomCodeSampleTab = this . setCustomCodeSampleTab . bind ( this ) ;
19
+ }
20
+ setCustomCodeSampleTab ( index ) {
21
+ this . setState ( { customCodeSampleTab : index } ) ;
22
+ }
23
+
24
+ render ( ) {
25
+ const { oas, setLanguage, operation, formData, language, customCodeSamples } = this . props ;
17
26
18
- const snippet = generateCodeSnippet ( oas , operation , formData , language ) ;
27
+ return (
28
+ < div className = "code-sample tabber-parent" >
29
+ { ( ( ) => {
30
+ if ( ! oas [ extensions . SAMPLES_ENABLED ] ) {
31
+ return < div className = "hub-no-code" > No code samples available</ div > ;
32
+ }
19
33
20
- return (
21
- < div >
22
- < ul className = "code-sample-tabs" >
23
- { // TODO add `is-lang-${lang}` class, to body?
24
- oas [ extensions . SAMPLES_LANGUAGES ] . map ( lang => (
25
- < li key = { lang } >
26
- {
27
- // eslint-disable-next-line jsx-a11y/href-no-hash
28
- < a
29
- href = "#"
30
- className = { `hub-lang-switch-${ lang } ` }
31
- onClick = { e => {
32
- e . preventDefault ( ) ;
33
- setLanguage ( lang ) ;
34
- } }
35
- >
36
- { generateCodeSnippet . getLangName ( lang ) }
37
- </ a >
38
- }
39
- </ li >
40
- ) ) }
41
- </ ul >
34
+ const snippet = generateCodeSnippet ( oas , operation , formData , language ) ;
42
35
43
- < div className = "hub-code-auto" >
44
- < pre
45
- className = { `tomorrow-night hub-lang hub-lang-${ language } ` }
46
- // eslint-disable-next-line react/no-danger
47
- dangerouslySetInnerHTML = { { __html : snippet } }
48
- />
36
+ if ( customCodeSamples . length ) {
37
+ return (
38
+ < div >
39
+ < ul className = "code-sample-tabs" >
40
+ { customCodeSamples . map ( example => (
41
+ < li key = { example . language } >
42
+ {
43
+ // eslint-disable-next-line jsx-a11y/href-no-hash
44
+ < a
45
+ href = "#"
46
+ className = { `hub-lang-switch-${ example . language } ` }
47
+ onClick = { e => {
48
+ e . preventDefault ( ) ;
49
+ setLanguage ( example . language ) ;
50
+ } }
51
+ >
52
+ { generateCodeSnippet . getLangName ( example . language ) }
53
+ </ a >
54
+ }
55
+ </ li >
56
+ ) ) }
57
+ </ ul >
58
+ < div className = "code-sample-body" >
59
+ { customCodeSamples . map ( ( example , index ) => {
60
+ return (
61
+ < pre
62
+ className = "tomorrow-night tabber-body"
63
+ style = { { display : index === this . state . customCodeSampleTab ? 'block' : '' } }
64
+ key = { index } // eslint-disable-line react/no-array-index-key
65
+ // eslint-disable-next-line react/no-danger
66
+ dangerouslySetInnerHTML = { {
67
+ __html : syntaxHighlighter ( example . code , example . language , true ) ,
68
+ } }
69
+ />
70
+ ) ;
71
+ } ) }
72
+ </ div >
73
+ </ div >
74
+ ) ;
75
+ }
76
+ return (
77
+ < div >
78
+ < ul className = "code-sample-tabs" >
79
+ { // TODO add `is-lang-${lang}` class, to body?
80
+ oas [ extensions . SAMPLES_LANGUAGES ] . map ( lang => (
81
+ < li key = { lang } >
82
+ {
83
+ // eslint-disable-next-line jsx-a11y/href-no-hash
84
+ < a
85
+ href = "#"
86
+ className = { `hub-lang-switch-${ lang } ` }
87
+ onClick = { e => {
88
+ e . preventDefault ( ) ;
89
+ setLanguage ( lang ) ;
90
+ } }
91
+ >
92
+ { generateCodeSnippet . getLangName ( lang ) }
93
+ </ a >
94
+ }
95
+ </ li >
96
+ ) ) }
97
+ </ ul >
98
+
99
+ < div className = "hub-code-auto" >
100
+ < pre
101
+ className = { `tomorrow-night hub-lang hub-lang-${ language } ` }
102
+ // eslint-disable-next-line react/no-danger
103
+ dangerouslySetInnerHTML = { { __html : snippet } }
104
+ />
105
+ </ div >
49
106
</ div >
50
- </ div >
51
- ) ;
52
- } ) ( ) }
53
- </ div >
54
- ) ;
107
+ ) ;
108
+ } ) ( ) }
109
+ </ div >
110
+ ) ;
111
+ }
55
112
}
56
113
57
114
CodeSample . propTypes = {
58
115
oas : PropTypes . instanceOf ( Oas ) . isRequired ,
59
116
setLanguage : PropTypes . func . isRequired ,
60
117
operation : PropTypes . instanceOf ( Operation ) . isRequired ,
61
118
formData : PropTypes . shape ( { } ) . isRequired ,
119
+ customCodeSamples : PropTypes . shape ( [ ] ) ,
62
120
language : PropTypes . string . isRequired ,
63
121
} ;
64
122
123
+ CodeSample . defaultProps = {
124
+ customCodeSamples : [ ] ,
125
+ } ;
65
126
module . exports = CodeSample ;
0 commit comments