mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-26 18:18:25 +00:00
moved flow editor state to redux
This commit is contained in:
parent
87797d7ac0
commit
48728af43a
@ -2,4 +2,8 @@
|
|||||||
border: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.CodeMirror{
|
||||||
|
height: auto !important;
|
||||||
|
max-height: 1000px !important;
|
||||||
|
}
|
||||||
@import (inline) "../../node_modules/codemirror/lib/codemirror.css";
|
@import (inline) "../../node_modules/codemirror/lib/codemirror.css";
|
||||||
|
@ -8,13 +8,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.edit-flow-container {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
.edit-flow {
|
.edit-flow {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 25px;
|
right: 0px;
|
||||||
top: 140px;
|
top: 5px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
|
z-index: 10000;
|
||||||
|
|
||||||
background-color: white;
|
background-color: white;
|
||||||
border: solid 2px rgba(248, 145, 59, 0.7);
|
border: solid 2px rgba(248, 145, 59, 0.7);
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
import React, { Component, PropTypes } from 'react'
|
import React, { Component, PropTypes } from 'react'
|
||||||
|
import { connect } from 'react-redux'
|
||||||
import { MessageUtils } from '../flow/utils.js'
|
import { MessageUtils } from '../flow/utils.js'
|
||||||
import { ViewAuto, ViewImage } from './ContentView/ContentViews'
|
import { ViewAuto, ViewImage } from './ContentView/ContentViews'
|
||||||
import * as MetaViews from './ContentView/MetaViews'
|
import * as MetaViews from './ContentView/MetaViews'
|
||||||
import ContentLoader from './ContentView/ContentLoader'
|
import ContentLoader from './ContentView/ContentLoader'
|
||||||
import ViewSelector from './ContentView/ViewSelector'
|
import ViewSelector from './ContentView/ViewSelector'
|
||||||
import ContentEditor from './ContentView/ContentEditor'
|
import CodeEditor from './common/CodeEditor'
|
||||||
|
import {setModifiedFlowContent} from '../ducks/flows'
|
||||||
|
|
||||||
export default class ContentView extends Component {
|
|
||||||
|
class ContentView extends Component {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
// It may seem a bit weird at the first glance:
|
// It may seem a bit weird at the first glance:
|
||||||
@ -19,8 +22,7 @@ export default class ContentView extends Component {
|
|||||||
|
|
||||||
constructor(props, context) {
|
constructor(props, context) {
|
||||||
super(props, context)
|
super(props, context)
|
||||||
|
this.state = { displayLarge: false, View: ViewAuto}
|
||||||
this.state = { displayLarge: false, View: ViewAuto, contentEditorClosed: true }
|
|
||||||
this.selectView = this.selectView.bind(this)
|
this.selectView = this.selectView.bind(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +52,7 @@ export default class ContentView extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { flow, message } = this.props
|
const { flow, message, setModifiedFlowContent, isFlowEditorOpen } = this.props
|
||||||
const { displayLarge, View } = this.state
|
const { displayLarge, View } = this.state
|
||||||
|
|
||||||
if (message.contentLength === 0) {
|
if (message.contentLength === 0) {
|
||||||
@ -67,15 +69,11 @@ export default class ContentView extends Component {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
{isFlowEditorOpen ? (
|
||||||
<ContentLoader flow={flow} message={message}>
|
<ContentLoader flow={flow} message={message}>
|
||||||
<ContentEditor
|
<CodeEditor content="" onChange={content =>{setModifiedFlowContent(content)}}/>
|
||||||
onSave={content => {this.props.onContentChange(content);this.setState({contentEditorClosed : true});}}
|
|
||||||
onOpen={() => this.setState({contentEditorClosed : false})}
|
|
||||||
isClosed={this.state.contentEditorClosed}
|
|
||||||
content=""
|
|
||||||
/>
|
|
||||||
</ContentLoader>
|
</ContentLoader>
|
||||||
{this.state.contentEditorClosed && (<div>
|
): (<div>
|
||||||
{View.textView ? (
|
{View.textView ? (
|
||||||
<ContentLoader flow={flow} message={message}>
|
<ContentLoader flow={flow} message={message}>
|
||||||
<this.state.View content="" />
|
<this.state.View content="" />
|
||||||
@ -115,3 +113,9 @@ export default class ContentView extends Component {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
export default connect(
|
||||||
|
state => (
|
||||||
|
{isFlowEditorOpen : state.ui.isFlowEditorOpen}
|
||||||
|
), {
|
||||||
|
setModifiedFlowContent
|
||||||
|
})(ContentView)
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
import React, { Component, PropTypes } from 'react'
|
|
||||||
import CodeEditor from '../common/CodeEditor'
|
|
||||||
|
|
||||||
export default class ContentEditor extends Component {
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
content: PropTypes.string.isRequired,
|
|
||||||
onSave: PropTypes.func.isRequired,
|
|
||||||
onOpen: PropTypes.func.isRequired,
|
|
||||||
isClosed: PropTypes.bool.isRequired
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(props){
|
|
||||||
super(props)
|
|
||||||
this.state = {content: this.props.content}
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
{this.props.isClosed ?
|
|
||||||
<a className="edit-flow" onClick={this.props.onOpen}>
|
|
||||||
<i className="fa fa-pencil"/>
|
|
||||||
</a> :
|
|
||||||
<a className="edit-flow" onClick={() => this.props.onSave(this.state.content)}>
|
|
||||||
<i className="fa fa-check"/>
|
|
||||||
</a>
|
|
||||||
}
|
|
||||||
{!this.props.isClosed &&
|
|
||||||
<CodeEditor value={this.state.content} onChange={content => this.setState({content: content})}/>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
48
web/src/js/components/FlowView/FlowEditorButton.jsx
Normal file
48
web/src/js/components/FlowView/FlowEditorButton.jsx
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import React, { PropTypes, Component } from 'react'
|
||||||
|
import { connect } from 'react-redux'
|
||||||
|
|
||||||
|
import {closeFlowEditor} from '../../ducks/ui.js'
|
||||||
|
import {openFlowEditor} from '../../ducks/ui.js'
|
||||||
|
|
||||||
|
// FlowEditorButton.propTypes = {
|
||||||
|
// isFlowEditorOpen: PropTypes.bool.isRequired,
|
||||||
|
// content: PropTypes.string.isRequired,
|
||||||
|
// onContentChange: PropTypes.func.isRequired
|
||||||
|
// }
|
||||||
|
|
||||||
|
class FlowEditorButton extends Component{
|
||||||
|
static propTypes = {
|
||||||
|
isFlowEditorOpen: PropTypes.bool.isRequired,
|
||||||
|
content: PropTypes.string.isRequired,
|
||||||
|
onContentChange: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let { isFlowEditorOpen, closeFlowEditor, openFlowEditor, onContentChange, content } = this.props
|
||||||
|
return (
|
||||||
|
<div className="edit-flow-container">
|
||||||
|
{isFlowEditorOpen ?
|
||||||
|
<a className="edit-flow" onClick={() => {onContentChange(content); closeFlowEditor()}}>
|
||||||
|
<i className="fa fa-check"/>
|
||||||
|
</a>
|
||||||
|
:
|
||||||
|
<a className="edit-flow" onClick={() => openFlowEditor()}>
|
||||||
|
<i className="fa fa-pencil"/>
|
||||||
|
</a>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect(
|
||||||
|
state => ({
|
||||||
|
isFlowEditorOpen: state.ui.isFlowEditorOpen,
|
||||||
|
content: state.flows.modifiedFlow.content
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
closeFlowEditor,
|
||||||
|
openFlowEditor
|
||||||
|
|
||||||
|
}
|
||||||
|
)(FlowEditorButton)
|
@ -7,6 +7,8 @@ import ContentView from '../ContentView'
|
|||||||
import ValueEditor from '../ValueEditor'
|
import ValueEditor from '../ValueEditor'
|
||||||
import Headers from './Headers'
|
import Headers from './Headers'
|
||||||
import * as flowActions from '../../ducks/flows'
|
import * as flowActions from '../../ducks/flows'
|
||||||
|
import FlowEditorButton from './FlowEditorButton.jsx'
|
||||||
|
|
||||||
|
|
||||||
class RequestLine extends Component {
|
class RequestLine extends Component {
|
||||||
|
|
||||||
@ -77,21 +79,23 @@ class ResponseLine extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class Request extends Component {
|
export class Request extends Component {
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { flow, updateFlow } = this.props
|
const { flow, updateFlow } = this.props
|
||||||
|
let onContentChange = content => flowActions.updateContent(this.props.flow, content, "request")
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="request">
|
<section className="request">
|
||||||
|
<FlowEditorButton onContentChange={onContentChange}/>
|
||||||
<RequestLine ref="requestLine" flow={flow} updateFlow={updateFlow} />
|
<RequestLine ref="requestLine" flow={flow} updateFlow={updateFlow} />
|
||||||
<Headers
|
<Headers
|
||||||
ref="headers"
|
ref="headers"
|
||||||
message={flow.request}
|
message={flow.request}
|
||||||
onChange={headers => updateFlow({ request: { headers } })}
|
onChange={headers => updateFlow({ request: { headers } })}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
<ContentView flow={flow}
|
<ContentView flow={flow}
|
||||||
onContentChange={content => flowActions.updateContent(this.props.flow, content, "request") }
|
onContentChange={onContentChange}
|
||||||
message={flow.request}
|
message={flow.request}
|
||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
@ -120,11 +124,14 @@ export class Request extends Component {
|
|||||||
|
|
||||||
export class Response extends Component {
|
export class Response extends Component {
|
||||||
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { flow, updateFlow } = this.props
|
const { flow, updateFlow } = this.props
|
||||||
|
let onContentChange = content => flowActions.updateContent(this.props.flow, content, "response")
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="response">
|
<section className="response">
|
||||||
|
<FlowEditorButton onContentChange={onContentChange}/>
|
||||||
<ResponseLine ref="responseLine" flow={flow} updateFlow={updateFlow} />
|
<ResponseLine ref="responseLine" flow={flow} updateFlow={updateFlow} />
|
||||||
<Headers
|
<Headers
|
||||||
ref="headers"
|
ref="headers"
|
||||||
@ -133,7 +140,7 @@ export class Response extends Component {
|
|||||||
/>
|
/>
|
||||||
<hr/>
|
<hr/>
|
||||||
<ContentView flow={flow}
|
<ContentView flow={flow}
|
||||||
onContentChange={content => flowActions.updateContent(this.props.flow, content, "response") }
|
onContentChange={onContentChange}
|
||||||
message={flow.response}
|
message={flow.response}
|
||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
|
@ -5,17 +5,25 @@ import Codemirror from 'react-codemirror';
|
|||||||
|
|
||||||
export default class CodeEditor extends Component{
|
export default class CodeEditor extends Component{
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
value: PropTypes.string.isRequired,
|
content: PropTypes.string.isRequired,
|
||||||
onChange: PropTypes.func.isRequired,
|
onChange: PropTypes.func.isRequired,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constructor(props){
|
||||||
|
super(props)
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillMount(){
|
||||||
|
this.props.onChange(this.props.content)
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let options = {
|
let options = {
|
||||||
lineNumbers: true
|
lineNumbers: true
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div onKeyDown={e => e.stopPropagation()}>
|
<div onKeyDown={e => e.stopPropagation()}>
|
||||||
<Codemirror value={this.props.value} onChange={this.props.onChange} options={options}/>
|
<Codemirror value={this.props.content} onChange={this.props.onChange} options={options}/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ export default class Splitter extends Component {
|
|||||||
this.state = { applied: false, startX: false, startY: false }
|
this.state = { applied: false, startX: false, startY: false }
|
||||||
|
|
||||||
this.onMouseMove = this.onMouseMove.bind(this)
|
this.onMouseMove = this.onMouseMove.bind(this)
|
||||||
|
this.onMouseDown = this.onMouseDown.bind(this)
|
||||||
this.onMouseUp = this.onMouseUp.bind(this)
|
this.onMouseUp = this.onMouseUp.bind(this)
|
||||||
this.onDragEnd = this.onDragEnd.bind(this)
|
this.onDragEnd = this.onDragEnd.bind(this)
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,12 @@ export const RECEIVE = 'FLOWS_RECEIVE'
|
|||||||
export const REQUEST_ACTION = 'FLOWS_REQUEST_ACTION'
|
export const REQUEST_ACTION = 'FLOWS_REQUEST_ACTION'
|
||||||
export const UNKNOWN_CMD = 'FLOWS_UNKNOWN_CMD'
|
export const UNKNOWN_CMD = 'FLOWS_UNKNOWN_CMD'
|
||||||
export const FETCH_ERROR = 'FLOWS_FETCH_ERROR'
|
export const FETCH_ERROR = 'FLOWS_FETCH_ERROR'
|
||||||
|
export const SET_MODIFIED_FLOW_CONTENT = "FLOWS_SET_MODIFIED_FLOW"
|
||||||
|
|
||||||
const defaultState = {
|
const defaultState = {
|
||||||
list: undefined,
|
list: undefined,
|
||||||
views: undefined,
|
views: undefined,
|
||||||
|
modifiedFlow: {headers: "", content: ""}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function reduce(state = defaultState, action) {
|
export default function reduce(state = defaultState, action) {
|
||||||
@ -51,6 +53,12 @@ export default function reduce(state = defaultState, action) {
|
|||||||
list,
|
list,
|
||||||
views: reduceViews(state.views, viewsActions.receive(list)),
|
views: reduceViews(state.views, viewsActions.receive(list)),
|
||||||
}
|
}
|
||||||
|
case SET_MODIFIED_FLOW_CONTENT:
|
||||||
|
return{
|
||||||
|
...state,
|
||||||
|
modifiedFlow: {...state.modifiedFlow, content: action.content}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return {
|
return {
|
||||||
@ -61,6 +69,17 @@ export default function reduce(state = defaultState, action) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
export function setModifiedFlowContent(content) {
|
||||||
|
return {
|
||||||
|
type: SET_MODIFIED_FLOW_CONTENT,
|
||||||
|
content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user