import { h, Component } from 'preact'; import PropTypes from 'prop-types'; import marked from 'marked'; import { getJSONContents } from './actions'; export default class GithubRepo extends Component { static propTypes = { githubToken: PropTypes.string.isRequired, resource: PropTypes.shape({ args: PropTypes.string, }).isRequired, }; constructor(props) { super(props); this.state = { root: true, directories: [], files: [], readme: null, content: null, token: props.githubToken, path: null, }; } componentDidMount() { const { token } = this.state; const { resource } = this.props; if (token) { getJSONContents( `https://api.github.com/repos/${resource.args}/contents?access_token=${token}`, this.loadContent, this.loadFailure, ); getJSONContents( `https://api.github.com/repos/${resource.args}/readme?access_token=${token}`, this.loadContent, this.loadFailure, ); } this.setState({ path: resource.args }); } handleItemClick = e => { const { token } = this.state; e.preventDefault(); getJSONContents( `${e.target.dataset.apiUrl}&access_token=${token}`, this.loadContent, this.loadFailure, ); this.setState({ root: false, path: e.target.dataset.path, }); }; loadContent = response => { const files = []; const directories = []; if (response.message === 'Not Found') { this.setState({ path: 'Repo not found (misspelled or private?)' }); } else if (Array.isArray(response)) { response.forEach(item => { if (item.type === 'file') { files.push(item); } else { directories.push(item); } }); this.setState({ files, directories, }); } else if (response.path === 'README.md') { this.setState({ readme: window.atob(response.content), }); } else if (response.content) { this.setState({ content: window.atob(response.content), }); } }; loadFailure = response => { this.setState({ path: response.message }); }; render() { const { token, content, path, directories: directoriesFromState, files: filesFromState, readme: readmeFromState, root, } = this.state; if (!token || token.length === 0) { return (
Authentication required

This feature is in internal alpha testing mode.

); } if (content) { return (
{path}
{content}
); } const directories = directoriesFromState.map(item => (
📁 {' '} {item.name}
)); const files = filesFromState.map(item => (
{item.name}
)); let readme = ''; if (readmeFromState) { readme = (
); } if (root) { return (
{/* eslint-disable-next-line jsx-a11y/anchor-has-content */} {path}
{directories} {files}
{readme}
); } return (
{path}
{directories} {files}
); } }