// @flow import * as React from 'react'; import autobind from 'autobind-decorator'; import VCS from '../../sync/vcs'; import { showError } from './modals'; type Props = { vcs: VCS, branch: string, onPull: Function, disabled?: boolean, className?: string, children?: React.Node, }; type State = { loading: boolean, }; @autobind class SyncPullButton extends React.PureComponent { _timeout: TimeoutID; state = { loading: false, }; async _handleClick() { const { vcs, onPull, branch } = this.props; this.setState({ loading: true }); const newVCS = vcs.newInstance(); const oldBranch = await newVCS.getBranch(); let failed = false; try { // Clone old VCS so we don't mess anything up while working on other projects await newVCS.checkout([], branch); await newVCS.pull([]); } catch (err) { showError({ title: 'Pull Error', message: 'Failed to pull ' + branch, error: err, }); failed = true; } finally { // We actually need to checkout the old branch again because the VCS // stores it on the filesystem. We should probably have a way to not // have to do this hack await newVCS.checkout([], oldBranch); } // Do this a bit later so the loading doesn't seem to stop too early this._timeout = setTimeout(() => { this.setState({ loading: false }); }, 400); if (!failed) { onPull && onPull(); } } componentWillUnmount() { clearTimeout(this._timeout); } render() { const { className, children, disabled } = this.props; const { loading } = this.state; return ( ); } } export default SyncPullButton;