Graphql.jsx 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import React, {Component} from 'react';
  2. import {Input, Spin} from 'antd';
  3. import GraphiQL from "graphiql";
  4. import fetch from "isomorphic-fetch";
  5. import gql from "graphql-tag";
  6. import {Query} from "react-apollo";
  7. import {GET_PROJECT} from "../../../../../gql";
  8. class Graphql extends Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. api: props.api,
  13. show: props.api !== ''
  14. };
  15. };
  16. componentWillReceiveProps(next) {
  17. this.setState({
  18. api: next.api,
  19. show: next.api !== ''
  20. })
  21. }
  22. graphQLFetcher = (graphQLParams) => {
  23. // 已经存在的 magazine api, 设想: 用户生成 schema,返回 api 自动替换这里
  24. // return fetch(this.state.api, {
  25. return fetch('http://service-dan6exu1-1254337200.ap-shanghai.apigateway.myqcloud.com/test/graphql', {
  26. method: 'post',
  27. headers: {'Content-Type': 'application/json'},
  28. body: JSON.stringify(graphQLParams),
  29. }).then(response => response.json());
  30. };
  31. render() {
  32. let projectID = this.props.projectID ? this.props.projectID : 'ecommerce_projectID';
  33. return (
  34. <Query query={gql(GET_PROJECT)} variables={{id: projectID}} fetchPolicy={'network-only'}>
  35. {
  36. ({loading, error, data}) => {
  37. if (loading) {
  38. return <Spin style={{marginLeft: 3}}/>
  39. }
  40. if (error) {
  41. return 'error!';
  42. }
  43. let group = data.project_by_id.apiGWGroup_id;
  44. if (this.state.api === '') {
  45. if (group !== null) {
  46. let domain = group.userDomain ? group.userDomain : (group.defaultDomain + '/' + group.environmentName);
  47. this.setState({
  48. api: group.frontType.slice(0, 4) + '://' + domain + '/graphql',
  49. show: true
  50. })
  51. } else {
  52. this.setState({
  53. api: '尚未部署成功',
  54. show: true
  55. })
  56. }
  57. }
  58. return (
  59. <div>
  60. <Input
  61. style={{marginTop: 10}}
  62. addonBefore="POST"
  63. defaultValue={this.state.api}
  64. onChange={(e) => {
  65. this.setState({api: e.target.value})
  66. }}/>
  67. {
  68. this.state.show ?
  69. <GraphiQL fetcher={this.graphQLFetcher}/>
  70. :
  71. ''
  72. }
  73. </div>
  74. )
  75. }
  76. }
  77. </Query>
  78. )
  79. }
  80. }
  81. export default Graphql;