@@ -17,15 +17,17 @@ function maybeStringifyChildren(children) {
1717 return Array . isArray ( children ) ? children . join ( "" ) : children ;
1818}
1919
20+
2021export default function CodeBlock ( { children : rawChildren , ...props } ) {
2122 const [ codes , setCodes ] = useState ( [ ] ) ; // 코드를 담을 상태
2223 const [ names , setNames ] = useState ( [ ] ) ;
2324 const [ members , setMembers ] = useState ( [ ] ) ;
2425
2526 const axios = require ( 'axios' ) ;
2627
27- const fetchMembers = async ( org = "Code-Study" , token = null ) => {
28+ const fetchMembers = async ( org = "Code-Study" ) => {
2829 try {
30+ const token = localStorage . getItem ( 'githubToken' ) ;
2931 const options = token
3032 ? {
3133 headers : { Authorization : `Bearer ${ token } ` } ,
@@ -40,63 +42,51 @@ export default function CodeBlock({ children: rawChildren, ...props }) {
4042 setMembers ( members )
4143 return members ;
4244 } catch ( error ) {
43- console . error ( 'Error fetching organization members:' , error ) ;
44- }
45- } ;
46-
47- const getRepositoryContents = async ( owner , repo , path = '' ) => {
48- try {
49- const response = await axios . get ( `https://api.github.com/repos/${ owner } /${ repo } /contents/${ path } ` ) ;
50- return response . data ;
51- } catch ( error ) {
52- console . error ( 'Error fetching repository contents:' , error ) ;
53- return [ ] ;
54- }
55- } ;
56-
57- const getFilesRecursively = async ( owner , repo , path = '' ) => {
58- let files = [ ] ;
59- const contents = await getRepositoryContents ( owner , repo , path ) ;
60-
61- for ( const content of contents ) {
62- if ( content . type === 'file' ) {
63- // 파일인 경우 목록에 추가
64- files . push ( content . path ) ;
65- } else if ( content . type === 'dir' ) {
66- // 폴더인 경우 재귀적으로 해당 폴더의 파일을 가져옴
67- const subFiles = await getFilesRecursively ( owner , repo , content . path ) ;
68- files = files . concat ( subFiles ) ;
45+ if ( error . response && error . response . status === 403 ) {
46+ console . error ( 'Error: 403 Forbidden. A token is required.' ) ;
47+
48+ const userToken = prompt ( 'Access denied. Please provide a valid GitHub personal access token:' ) ;
49+
50+ if ( userToken ) {
51+ localStorage . setItem ( 'githubToken' , userToken ) ;
52+ return await fetchMembers ( org ) ;
53+ } else {
54+ console . error ( 'No token provided. Unable to access the file.' ) ;
55+ return null ;
56+ }
57+ } else {
58+ console . error ( 'Error fetching file content:' , error ) ;
59+ return null ;
6960 }
70- }
71- return files ;
61+ }
7262 } ;
7363
7464 const getRepositoryFileContent = async ( owner , repo , path ) => {
7565 try {
76- const response = await axios . get ( `https://api.github.com/repos/${ owner } /${ repo } /contents/${ path } ` ) ;
66+ const token = localStorage . getItem ( 'githubToken' ) ;
67+ const options = token
68+ ? {
69+ headers : { Authorization : `Bearer ${ token } ` } ,
70+ params : { filter : 'all' } ,
71+ }
72+ : { } ;
73+ const response = await axios . get ( `https://api.github.com/repos/${ owner } /${ repo } /contents/${ path } ` , options ) ;
7774 const content = decodeURIComponent ( escape ( window . atob ( response . data . content ) ) ) ; // 디코딩
7875 return content ;
7976 } catch ( error ) {
80- console . error ( 'Error fetching file content:' , error ) ;
81- return null ;
77+ if ( error . response && error . response . status === 403 ) {
78+ console . error ( 'Error: 403 Forbidden. A token is required.' ) ;
79+ } else {
80+ console . error ( 'Error fetching file content:' , error ) ;
81+ return null ;
82+ }
8283 }
8384 } ;
8485
8586 const fetchCodes = async ( ) => {
8687 try {
87- // const pattern = /^[a-zA-Z]+-[a-zA-Z]+\/\d+\/\d+\/\d+$/;
88- // const pattern = /^[a-zA-Z]+-[a-zA-Z]+\/[a-zA-Z]+-\d+\/\d+-[a-zA-Z]+-[a-zA-Z]+\/\d+$/;
89- const pattern = / ^ ( l e e t - c o d e | n o v i c e - h i g h ) \/ .+ \/ .+ \/ .+ $ / ;
88+ const pattern = / ^ \d { 4 } - / ;
9089 if ( ( pattern . test ( props . metastring ) === true ) && ( props . className === "language-python" ) ) {
91- const contents = await getFilesRecursively ( 'Code-Study' , 'Code' , props . metastring ) ;
92- const codePromises = contents . map ( element =>
93- getRepositoryFileContent ( 'Code-Study' , 'Code' , element )
94- ) ;
95- const codeContents = await Promise . all ( codePromises ) ;
96- setCodes ( codeContents ) ;
97- //console.log(contents.map(elem => elem.split('/').pop().split('.')[0]));
98- setNames ( contents . map ( elem => elem . split ( '/' ) . pop ( ) . split ( '.' ) [ 0 ] ) ) ;
99- } else {
10090 const memberContents = await fetchMembers ( 'Code-Study' ) ;
10191 const fileName = props . metastring + '/' + props . metastring + '.py'
10292 memberContents . map ( async member => {
0 commit comments