import * as React from 'react' import * as isURL from 'validator/lib/isURL' import { remote } from 'electron' import { existsSync } from 'fs' import { resolve } from 'path' import { Icon, $v } from 'graphcool-styles' import Modal from 'graphcool-ui/lib/Modal' import { connect } from 'react-redux' import * as format from 'date-fns/format' import Toggle from './Toggle' import { examples } from './data' import { getAppHistory, AppHistoryItem } from 'graphql-playground-react' import { createStructuredSelector, createSelector } from 'reselect' import { OrderedMap } from 'immutable' interface StateFromProps { history: OrderedMap } interface State { endpoint: string selectedMode: string } export interface Props { isOpen: boolean onSelectEndpoint: (endpoint: string) => void onSelectFolder: (config: string) => void selectHistory: (history: AppHistoryItem) => any } const modalStyle = { overlay: { zIndex: 20, backgroundColor: 'rgba(15,32,46,.9)', display: 'flex', alignItems: 'center', justifyContent: 'center', '-webkit-app-region': 'drag', }, content: { position: 'relative', width: 976, height: 'auto', top: 'initial', left: 'initial', right: 'initial', bottom: 'initial', borderRadius: 2, padding: 0, border: 'none', background: 'none', boxShadow: '0 1px 7px rgba(0,0,0,.2)', }, } class InitialView extends React.Component { state = { endpoint: '', selectedMode: 'local', } handleRequestClose = () => null handleSubmit = e => { e.preventDefault() if (isURL(this.state.endpoint, { require_tld: false })) { this.props.selectHistory( new AppHistoryItem({ type: 'endpoint', path: this.state.endpoint, }), ) this.props.onSelectEndpoint(this.state.endpoint) } else { alert('Endpoint is not a valid url') } } handleClickLocal = () => { const paths = remote.dialog.showOpenDialog({ properties: ['openDirectory'], }) if (paths && paths[0]) { const path = paths[0] // Check if there is a .graphqlconfig file in the folder if ( !existsSync(resolve(path, '.graphqlconfig')) && !existsSync(resolve(path, '.graphqlconfig.yml')) && !existsSync(resolve(path, '.graphqlconfig.yaml')) ) { alert('No .graphqlconfig found in this folder') return } this.setState({ endpoint: path } as State) this.props.onSelectFolder(path) } } handleChangeEndpoint = e => { this.setState({ endpoint: e.target.value } as State) } handleChangeMode = selectedMode => { this.setState({ selectedMode } as State) } handleClickHistory = (history: AppHistoryItem) => { this.props.selectHistory(history) } render() { const { isOpen, history } = this.props const { endpoint, selectedMode } = this.state const choicesMode = ['local', 'url endpoint'] const items = history.toJS() return (
{history.size > 0 ? (
RECENT
{Object.keys(items) .reverse() .map(key => { const data = items[key] const name = data.folderName || data.endpoint || data.path return (
this.handleClickHistory(data)} >
{name}
Last opened{' '} {format(data.lastOpened, 'DD.MM.YYYY')}
) })}
) : (
EXAMPLES
{examples.map(example => (
this.props.onSelectEndpoint(example.endpoint) } >
{example.name}
{example.endpoint}
))}
)}

New Workspace

Either load a local repository with a .graphqlconfig file, or just open a HTTP endpoint

{selectedMode === 'url endpoint' && (
)} {selectedMode === 'local' && (
)}
) } } const itemsSelector = createSelector([getAppHistory], state => state.items) const mapStateToProps = createStructuredSelector({ history: itemsSelector, }) export default connect(mapStateToProps)(InitialView as any) as any