| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- import React, { PureComponent as Component } from 'react';
- import PropTypes from 'prop-types';
- import { connect } from 'react-redux';
- import InterfaceEditForm from './InterfaceEditForm.js';
- import {
- updateInterfaceData,
- fetchInterfaceListMenu,
- fetchInterfaceData
- } from '../../../../reducer/modules/interface.js';
- import { getProject } from '../../../../reducer/modules/project.js';
- import axios from 'axios';
- import { message, Modal } from 'antd';
- import './Edit.scss';
- import { withRouter, Link } from 'react-router-dom';
- import ProjectTag from '../../Setting/ProjectMessage/ProjectTag.js';
- @connect(
- state => {
- return {
- curdata: state.inter.curdata,
- currProject: state.project.currProject
- };
- },
- {
- updateInterfaceData,
- fetchInterfaceListMenu,
- fetchInterfaceData,
- getProject
- }
- )
- class InterfaceEdit extends Component {
- static propTypes = {
- curdata: PropTypes.object,
- currProject: PropTypes.object,
- updateInterfaceData: PropTypes.func,
- fetchInterfaceListMenu: PropTypes.func,
- fetchInterfaceData: PropTypes.func,
- match: PropTypes.object,
- switchToView: PropTypes.func,
- getProject: PropTypes.func
- };
- constructor(props) {
- super(props);
- const { curdata, currProject } = this.props;
- this.state = {
- mockUrl:
- location.protocol +
- '//' +
- location.hostname +
- (location.port !== '' ? ':' + location.port : '') +
- `/mock/${currProject._id}${currProject.basepath}${curdata.path}`,
- curdata: {},
- status: 0,
- visible: false
- // tag: []
- };
- }
- onSubmit = async params => {
- params.id = this.props.match.params.actionId;
- let result = await axios.post('/api/interface/up', params);
- this.props.fetchInterfaceListMenu(this.props.currProject._id).then();
- this.props.fetchInterfaceData(params.id).then();
- if (result.data.errcode === 0) {
- this.props.updateInterfaceData(params);
- message.success('保存成功');
- } else {
- message.error(result.data.errmsg);
- }
- };
- componentWillUnmount() {
- try {
- if (this.state.status === 1) {
- this.WebSocket.close();
- }
- } catch (e) {
- return null;
- }
- }
- componentDidMount() {
- let domain = location.hostname + (location.port !== '' ? ':' + location.port : '');
- let s,
- initData = false;
- //因后端 node 仅支持 ws, 暂不支持 wss
- let wsProtocol = location.protocol === 'https:' ? 'wss' : 'ws';
- setTimeout(() => {
- if (initData === false) {
- this.setState({
- curdata: this.props.curdata,
- status: 1
- });
- initData = true;
- }
- }, 3000);
- try {
- s = new WebSocket(
- wsProtocol +
- '://' +
- domain +
- '/api/interface/solve_conflict?id=' +
- this.props.match.params.actionId
- );
- s.onopen = () => {
- this.WebSocket = s;
- };
- s.onmessage = e => {
- initData = true;
- let result = JSON.parse(e.data);
- if (result.errno === 0) {
- this.setState({
- curdata: result.data,
- status: 1
- });
- } else {
- this.setState({
- curdata: result.data,
- status: 2
- });
- }
- };
- s.onerror = () => {
- this.setState({
- curdata: this.props.curdata,
- status: 1
- });
- console.warn('websocket 连接失败,将导致多人编辑同一个接口冲突。');
- };
- } catch (e) {
- this.setState({
- curdata: this.props.curdata,
- status: 1
- });
- console.error('websocket 连接失败,将导致多人编辑同一个接口冲突。');
- }
- }
- onTagClick = () => {
- this.setState({
- visible: true
- });
- };
- handleOk = async () => {
- let { tag } = this.tag.state;
- tag = tag.filter(val => {
- return val.name !== '';
- });
- let id = this.props.currProject._id;
- let params = {
- id,
- tag
- };
- let result = await axios.post('/api/project/up_tag', params);
- if (result.data.errcode === 0) {
- await this.props.getProject(id);
- message.success('保存成功');
- } else {
- message.error(result.data.errmsg);
- }
- this.setState({
- visible: false
- });
- };
- handleCancel = () => {
- this.setState({
- visible: false
- });
- };
- tagSubmit = tagRef => {
- this.tag = tagRef;
- // this.setState({tag})
- };
- render() {
- const { cat, basepath, switch_notice, tag } = this.props.currProject;
- return (
- <div className="interface-edit">
- {this.state.status === 1 ? (
- <InterfaceEditForm
- cat={cat}
- mockUrl={this.state.mockUrl}
- basepath={basepath}
- noticed={switch_notice}
- onSubmit={this.onSubmit}
- curdata={this.state.curdata}
- onTagClick={this.onTagClick}
- />
- ) : null}
- {this.state.status === 2 ? (
- <div style={{ textAlign: 'center', fontSize: '14px', paddingTop: '10px' }}>
- <Link to={'/user/profile/' + this.state.curdata.uid}>
- <b>{this.state.curdata.username}</b>
- </Link>
- <span>正在编辑该接口,请稍后再试...</span>
- </div>
- ) : null}
- {this.state.status === 0 && '正在加载,请耐心等待...'}
- <Modal
- title="Tag 设置"
- width={680}
- visible={this.state.visible}
- onOk={this.handleOk}
- onCancel={this.handleCancel}
- okText="保存"
- >
- <div className="tag-modal-center">
- <ProjectTag tagMsg={tag} ref={this.tagSubmit} />
- </div>
- </Modal>
- </div>
- );
- }
- }
- export default withRouter(InterfaceEdit);
|