Browse Source

Basic Fare manager

dev
sipp11 6 years ago
parent
commit
0de7cc7309
  1. 10
      src/actions/fare.js
  2. 88
      src/components/FareAttributesForm.js
  3. 107
      src/components/FareList.js
  4. 123
      src/components/FareRulesForm.js
  5. 12
      src/constants/choices.js
  6. 2
      src/container/Main.js
  7. 3
      src/reducers/fareattr.js
  8. 3
      src/reducers/farerule.js
  9. 2
      src/sagas.js
  10. 36
      src/utils/index.js

10
src/actions/fare.js

@ -10,11 +10,12 @@ export const getFareAttr = (query) => ({
endpoint: `${API_URL}/fare-attribute/?${query || ''}`, endpoint: `${API_URL}/fare-attribute/?${query || ''}`,
method: 'GET', method: 'GET',
headers: RSAAHeaders, headers: RSAAHeaders,
bailout: (state) => state.fareattr.fetching || state.fareattr.query === query, bailout: (state) => state.fareattr.fetching || (
state.fareattr.query !== undefined && state.fareattr.query === query),
types: [ types: [
{ {
type: types.FAREATTR_REQUEST, type: types.FAREATTR_REQUEST,
meta: { query: query }, meta: { query: query || '' },
}, },
types.FAREATTR_SUCCESS, types.FAREATTR_SUCCESS,
types.FAREATTR_FAILURE, types.FAREATTR_FAILURE,
@ -72,11 +73,12 @@ export const getFareRule = (query) => ({
endpoint: `${API_URL}/fare-rule/?${query || ''}`, endpoint: `${API_URL}/fare-rule/?${query || ''}`,
method: 'GET', method: 'GET',
headers: RSAAHeaders, headers: RSAAHeaders,
bailout: (state) => state.fareattr.fetching || state.fareattr.query === query, bailout: (state) => state.farerule.fetching || (
state.farerule.query !== undefined && state.farerule.query === query),
types: [ types: [
{ {
type: types.FARERULE_REQUEST, type: types.FARERULE_REQUEST,
meta: { query: query }, meta: { query: query || '' },
}, },
types.FARERULE_SUCCESS, types.FARERULE_SUCCESS,
types.FARERULE_FAILURE, types.FARERULE_FAILURE,

88
src/components/FareAttributesForm.js

@ -9,9 +9,14 @@ import {
deleteFareAttr deleteFareAttr
} from '../actions/fare' } from '../actions/fare'
import store from '../store' import store from '../store'
import HorizontalInput from './parts/HorizontalInput' import Input from './parts/Input'
import HorizontalDate from './parts/HorizontalDate' import OurSelect from './parts/Select'
import HorizontalCheckbox from './parts/HorizontalCheckbox' import AsyncSelect from 'react-select/lib/Async'
import { components } from 'react-select'
import {
PaymentMethodChoices, TransferChoices
} from '../constants/choices'
import { getItemFromList, getAgencyAsyncSelect } from '../utils'
const StyledFareAttributesForm = styled.div` const StyledFareAttributesForm = styled.div`
padding: 1rem; padding: 1rem;
@ -19,6 +24,17 @@ background: #fafafa;
`; `;
const AgencyOption = (props) => {
const { agency_id, name } = props.data
return (
<components.Option {...props}>
<code>{agency_id}</code> {name}
</components.Option>
)
}
class FareAttributesForm extends Component { class FareAttributesForm extends Component {
state = { state = {
@ -26,10 +42,10 @@ class FareAttributesForm extends Component {
fare_id: "", fare_id: "",
price: 0, price: 0,
currency_type: "THB", // ISO 4217 currency_type: "THB", // ISO 4217
payment_method: "", // 0 - paid on board or 1 - paid before boarding payment_method: "0", // 0 - paid on board or 1 - paid before boarding
transfer: "0", // 0 no transfer, 1 - transfer once, 2 tranfer twice, transfer: "0", // 0 no transfer, 1 - transfer once, 2 tranfer twice,
// '' - unlimited transfer // '' - unlimited transfer
agency_id: false, // optional agency: null, // optional
transfer_duration: "0", // optional 0 - no transfer allowed, transfer_duration: "0", // optional 0 - no transfer allowed,
// otherwise it's length of time in seconds before // otherwise it's length of time in seconds before
// transfer expires // transfer expires
@ -69,9 +85,9 @@ class FareAttributesForm extends Component {
componentWillMount() { componentWillMount() {
const { props } = this const { props } = this
const { serviceId } = props.match.params const { attribID } = props.match.params
const { results } = props.fareattr const { results } = props.fareattr
const ones = results.filter(ele => ele.service_id === serviceId) const ones = results.filter(ele => ele.id === +attribID)
if (ones.length > 0) { if (ones.length > 0) {
this.setState(ones[0]) this.setState(ones[0])
} }
@ -84,21 +100,21 @@ class FareAttributesForm extends Component {
<StyledFareAttributesForm> <StyledFareAttributesForm>
<h1 className="title">{one.name}&nbsp;&nbsp;</h1> <h1 className="title">{one.name}&nbsp;&nbsp;</h1>
<div className="content"> <div className="content">
<HorizontalInput <Input
label="Fare ID" label="Fare ID"
type="text" type="text"
fieldName="fare_id" fieldName="fare_id"
value={one.fare_id || ''} value={one.fare_id || ''}
handleChange={this.handleChange} /> handleChange={this.handleChange} />
<HorizontalInput <Input
label="Price" label="Price"
type="text" type="text"
fieldName="price" fieldName="price"
value={one.price || ''} value={one.price || ''}
handleChange={this.handleChange} /> handleChange={this.handleChange} />
<HorizontalInput <Input
key="currency_type" key="currency_type"
label="Currency" label="Currency"
type="text" type="text"
@ -106,15 +122,23 @@ class FareAttributesForm extends Component {
value={one.currency_type || 'THB'} value={one.currency_type || 'THB'}
handleChange={this.handleChange} /> handleChange={this.handleChange} />
<HorizontalInput <OurSelect
key="payment_method" label="Payment Method"
label="Payment method"
type="text" type="text"
fieldName="payment_method" fieldName="payment_method"
value={one.payment_method || '0'} value={getItemFromList(one.payment_method, PaymentMethodChoices, '0')}
handleChange={this.handleChange} /> handleChange={this.handleChange}
choices={PaymentMethodChoices} />
<HorizontalInput <OurSelect
label="Transfer"
type="text"
fieldName="transfer"
value={getItemFromList(one.transfer, TransferChoices, '0')}
handleChange={this.handleChange}
choices={TransferChoices} />
<Input
key="transfer" key="transfer"
label="Transfer" label="Transfer"
type="text" type="text"
@ -122,18 +146,30 @@ class FareAttributesForm extends Component {
value={one.transfer || '0'} value={one.transfer || '0'}
handleChange={this.handleChange} /> handleChange={this.handleChange} />
{/* TODO: probably need HorizontalSelect */} <div className="field">
<HorizontalInput <label className="label">Agency</label>
key="agency_id" <AsyncSelect
label="Agency ID" cacheOptions={true}
type="text" defaultOptions
fieldName="agency_id" defaultValue={one.agency && {...one.agency, label: one.agency.name}}
value={one.agency_id || ''} loadOptions={getAgencyAsyncSelect}
handleChange={this.handleChange} /> components={{ Option: AgencyOption }}
onChange={(resp, evt) => {
if (evt.action === 'select-option') {
let evt = {
target: {
name: 'agency',
value: resp,
}}
this.handleChange(evt)
}
}}
/>
</div>
<HorizontalInput <Input
key="transfer_duration" key="transfer_duration"
label="Transfer Duration" label="Transfer Duration (sec)"
type="text" type="text"
fieldName="transfer_duration" fieldName="transfer_duration"
value={one.transfer_duration || '0'} value={one.transfer_duration || '0'}

107
src/components/FareList.js

@ -3,7 +3,11 @@ import styled from 'styled-components'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { getCalendar } from '../actions/calendar' import { getFareAttr, getFareRule } from '../actions/fare'
import { getItemFromList } from '../utils'
import {
PaymentMethodChoices, TransferChoices
} from '../constants/choices'
import store from '../store' import store from '../store'
@ -12,11 +16,6 @@ padding: 1rem;
background: #fafafa; background: #fafafa;
` `
const GapBox = styled.span`
margin-right: 5px;
color: ${props => props.checked ? 'green' : 'gray'};;
`
const FakeRow = styled.nav` const FakeRow = styled.nav`
padding-top: 5px; padding-top: 5px;
padding-bottom: 5px; padding-bottom: 5px;
@ -24,20 +23,15 @@ background: white;
margin-bottom: 1rem; margin-bottom: 1rem;
` `
const CheckboxIcon = (props) => (
<GapBox checked={props.checked}>
{props.checked === true && <span><i className="fas fa-check-square"></i></span>}
{props.checked !== true && <span><i className="fas fa-square"></i></span>}
</GapBox>
)
class FareList extends Component { class FareList extends Component {
componentWillMount() { componentWillMount() {
const { count } = this.props.fareattr const { fareattr, farerule } = this.props
if (count === 0) if (fareattr.count === 0)
store.dispatch(getCalendar()) store.dispatch(getFareAttr())
if (farerule.count === 0)
store.dispatch(getFareRule())
} }
render() { render() {
@ -47,105 +41,94 @@ class FareList extends Component {
<StyledBox> <StyledBox>
<h1 className="title">Fare</h1> <h1 className="title">Fare</h1>
<div className="columns"> <div className="columns">
<div className="column is-6"> <div className="column is-6">
<nav className="level is-mobile"> <nav className="level is-mobile">
<p className="level-item has-text-centered"> <p className="level-item has-text-centered">
<Link className="link is-info" to={`${match.url}/rules/new`}> <Link className="link is-info" to={`${match.url}/attributes/new`}>
<i className="fas fa-plus" /> New fare rule <i className="fas fa-plus" /> New fare attributes
</Link> </Link>
</p> </p>
</nav> </nav>
{fareattr.results && Object.keys(farerule.results).map(i => ( {fareattr.results && Object.keys(fareattr.results).map(i => (
<FakeRow className="level panel" key={fareattr.results[i].fare_id}> <FakeRow className="level panel" key={fareattr.results[i].fare_id}>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Fare ID</p> <p className="heading">Fare ID</p>
<p className="title"><Link to={`${match.url}/${fareattr.results[i].fare_id}`}>{fareattr.results[i].fare_id}</Link></p> <p className="title"><Link to={`${match.url}/attributes/${fareattr.results[i].id}`}>{fareattr.results[i].fare_id}</Link></p>
</div> </div>
</div> </div>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Origin ID</p> <p className="heading">Price</p>
<p className="title">{fareattr.results[i].origin_id}</p> <p key={fareattr.results[i].id}>{fareattr.results[i].price}
<small>{fareattr.results[i].currency_type}</small>
<br />
{getItemFromList(fareattr.results[i].payment_method, PaymentMethodChoices, '') && getItemFromList(fareattr.results[i].payment_method, PaymentMethodChoices, '').label}
</p>
</div> </div>
</div> </div>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Destination ID (or contains)</p> <p className="heading">Transfer / sec</p>
<p className="title"> <p>
{fareattr.results[i].destination_id} {getItemFromList(fareattr.results[i].transfer, TransferChoices, '') && getItemFromList(fareattr.results[i].transfer, TransferChoices, '').label}
{fareattr.results[i].contains_id} / {fareattr.results[i].transfer_duration}</p>
</p>
</div> </div>
</div> </div>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Route ID</p> <p className="heading">Agency</p>
<p className="title"> <p className="title">{fareattr.results[i].agency.name}</p>
{fareattr.results[i].route_id}
</p>
</div> </div>
</div> </div>
</FakeRow> </FakeRow>
))} ))}
</div> </div>
<div className="column is-6"> <div className="column is-6">
<nav className="level is-mobile"> <nav className="level is-mobile">
<p className="level-item has-text-centered"> <p className="level-item has-text-centered">
<Link className="link is-info" to={`${match.url}/attributes/new`}> <Link className="link is-info" to={`${match.url}/rules/new`}>
<i className="fas fa-plus" /> New fare attributes <i className="fas fa-plus" /> New fare rule
</Link> </Link>
</p> </p>
</nav> </nav>
{fareattr.results && Object.keys(fareattr.results).map(i => ( {farerule.results && Object.keys(farerule.results).map(i => (
<FakeRow className="level panel" key={fareattr.results[i].fare_id}> <FakeRow className="level panel" key={farerule.results[i].fare_id}>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Fare ID</p> <p className="heading">Fare ID</p>
<p className="title"><Link to={`${match.url}/${fareattr.results[i].fare_id}`}>{fareattr.results[i].fare_id}</Link></p> <p className="title"><Link to={`${match.url}/rules/${farerule.results[i].id}`}>{farerule.results[i].fare.fare_id}</Link></p>
</div> </div>
</div> </div>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Price</p> <p className="heading">Origin ID</p>
<p className="title">{fareattr.results[i].price}</p> <p className="title">{farerule.results[i].origin_id}</p>
</div>
</div>
<div className="level-item has-text-centered">
<div>
<p className="heading">Currency</p>
<p className="title">{fareattr.results[i].currency_type}</p>
</div>
</div>
<div className="level-item has-text-centered">
<div>
<p className="heading">Payment Method</p>
<p className="title">{fareattr.results[i].payment_method}</p>
</div>
</div>
<div className="level-item has-text-centered">
<div>
<p className="heading">Transfer</p>
<p className="title">{fareattr.results[i].transfer}</p>
</div> </div>
</div> </div>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Duration</p> <p className="heading">Destination ID (or contains)</p>
<p className="title">{fareattr.results[i].transfer_duration}</p> <p className="title">
{farerule.results[i].destination_id}
{farerule.results[i].contains_id}
</p>
</div> </div>
</div> </div>
<div className="level-item has-text-centered"> <div className="level-item has-text-centered">
<div> <div>
<p className="heading">Agency</p> <p className="heading">Route ID</p>
<p className="title">{fareattr.results[i].agency_id}</p> <p className="title">
{farerule.results[i].route_id}
</p>
</div> </div>
</div> </div>
</FakeRow> </FakeRow>
))} ))}
</div> </div>
</div> </div>
</StyledBox> </StyledBox>
) )

123
src/components/FareRulesForm.js

@ -9,15 +9,34 @@ import {
deleteFareRule deleteFareRule
} from '../actions/fare' } from '../actions/fare'
import store from '../store' import store from '../store'
import HorizontalInput from './parts/HorizontalInput' import Input from './parts/Input'
import HorizontalDate from './parts/HorizontalDate' import AsyncSelect from 'react-select/lib/Async'
import HorizontalCheckbox from './parts/HorizontalCheckbox' import { components } from 'react-select'
import { getStopsAsyncSelect, getFareAttrAsyncSelect } from '../utils'
const StyledFareRulesForm = styled.div` const StyledFareRulesForm = styled.div`
padding: 1rem; padding: 1rem;
background: #fafafa; background: #fafafa;
`; `;
const StopOption = (props) => {
const { stop_id, name } = props.data
return (
<components.Option {...props}>
<code>{stop_id}</code> {name}
</components.Option>
)
}
const FareAttrOption = (props) => {
const { fare_id, price, currency_type } = props.data
return (
<components.Option {...props}>
<code>{fare_id}</code> {price} {currency_type}
</components.Option>
)
}
class FareRulesForm extends Component { class FareRulesForm extends Component {
@ -64,9 +83,10 @@ class FareRulesForm extends Component {
componentWillMount() { componentWillMount() {
const { props } = this const { props } = this
const { serviceId } = props.match.params const { ruleID } = props.match.params
const { results } = props.farerule const { results } = props.farerule
const ones = results.filter(ele => ele.service_id === serviceId)
const ones = results.filter(ele => ele.id === +ruleID)
if (ones.length > 0) { if (ones.length > 0) {
this.setState(ones[0]) this.setState(ones[0])
} }
@ -79,35 +99,78 @@ class FareRulesForm extends Component {
<StyledFareRulesForm> <StyledFareRulesForm>
<h1 className="title">{one.name}&nbsp;&nbsp;</h1> <h1 className="title">{one.name}&nbsp;&nbsp;</h1>
<div className="content"> <div className="content">
<HorizontalInput
label="Fare ID"
type="text"
fieldName="fare_id"
value={one.fare_id || ''}
handleChange={this.handleChange} />
<HorizontalInput <div className="field">
<label className="label">Fare ID</label>
<AsyncSelect
cacheOptions={true}
defaultOptions
defaultValue={one.fare && {...one.fare, label: one.fare.fare_id}}
loadOptions={getFareAttrAsyncSelect}
components={{ Option: FareAttrOption }}
onChange={(resp, evt) => {
if (evt.action === 'select-option') {
let evt = {
target: {
name: 'fare',
value: resp,
}}
this.handleChange(evt)
}
}}
/>
</div>
<Input
label="Route ID" label="Route ID"
type="text" type="text"
fieldName="route_id" fieldName="route_id"
value={one.route_id || ''} value={one.route_id || ''}
handleChange={this.handleChange} /> handleChange={this.handleChange} />
<HorizontalInput <div className="field">
label="Origin ID" <label className="label">Origin ID</label>
type="text" <AsyncSelect
fieldName="origin_id" cacheOptions={true}
value={one.origin_id || ''} defaultOptions
handleChange={this.handleChange} /> defaultValue={one.origin_id && {value: one.origin_id, label: one.origin_id}}
loadOptions={getStopsAsyncSelect}
components={{ Option: StopOption }}
onChange={(resp, evt) => {
if (evt.action === 'select-option') {
let evt = {
target: {
name: 'origin_id',
value: resp.stop_id,
}}
this.handleChange(evt)
}
}}
/>
</div>
<HorizontalInput <div className="field">
label="Destination ID" <label className="label">Destination ID</label>
type="text" <AsyncSelect
fieldName="destination_id" cacheOptions={true}
value={one.destination_id || ''} defaultOptions
handleChange={this.handleChange} /> defaultValue={one.destination_id && {value: one.destination_id, label: one.destination_id}}
loadOptions={getStopsAsyncSelect}
components={{ Option: StopOption }}
onChange={(resp, evt) => {
if (evt.action === 'select-option') {
let evt = {
target: {
name: 'destination_id',
value: resp.stop_id,
}}
this.handleChange(evt)
}
}}
/>
</div>
<HorizontalInput <Input
label="Contains ID" label="Contains ID"
type="text" type="text"
fieldName="contains_id" fieldName="contains_id"
@ -130,7 +193,7 @@ class FareRulesForm extends Component {
DELETE</button> DELETE</button>
</div>} </div>}
<div className="control"> <div className="control">
<Link to={`/farerule`} className="button is-text">Cancel</Link> <Link to={`/fare`} className="button is-text">Cancel</Link>
</div> </div>
</div> </div>
</StyledFareRulesForm> </StyledFareRulesForm>
@ -145,17 +208,17 @@ class FareRulesForm extends Component {
// this is a create form // this is a create form
if (serviceId === undefined) { if (serviceId === undefined) {
if (one.justSubmit === true && !fetching) { if (one.justSubmit === true && !fetching) {
return <Redirect to={`/farerule`} /> return <Redirect to={`/fare`} />
} }
return this.renderForm() return this.renderForm()
} }
if (one.id === null && serviceId.length > 0) if (one.id === null && serviceId.length > 0)
return <Redirect to={`/farerule`} /> return <Redirect to={`/fare`} />
// redirect to fare list if submitted // redirect to fare list if submitted
if (one.justSubmit === true && !fetching) { if (one.justSubmit === true && !fetching) {
return <Redirect to={`/farerule`} /> return <Redirect to={`/fare`} />
} }
return this.renderForm() return this.renderForm()
} }
@ -164,7 +227,7 @@ class FareRulesForm extends Component {
const mapStateToProps = state => ({ const mapStateToProps = state => ({
farerule: state.farerule farerule: state.farerule,
}) })
const connectFareRulesForm = connect( const connectFareRulesForm = connect(

12
src/constants/choices.js

@ -62,3 +62,15 @@ export const ExactTimeChoices = [
{ value: '0', label: 'Not exactly scheduled.' }, { value: '0', label: 'Not exactly scheduled.' },
{ value: '1', label: 'Exactly scheduled' }, { value: '1', label: 'Exactly scheduled' },
] ]
export const PaymentMethodChoices = [
{ value: '0', label: 'Paid on board' },
{ value: '1', label: 'Paid before boarding' },
]
export const TransferChoices = [
{ value: '0', label: 'No transfer' },
{ value: '1', label: 'Transfer once' },
{ value: '2', label: 'Transfer twice' },
{ value: '', label: 'Unlimited transfer' },
]

2
src/container/Main.js

@ -55,7 +55,9 @@ class Main extends Component {
<Route exact path={`${match.url}fare`} component={FareList} /> <Route exact path={`${match.url}fare`} component={FareList} />
<Route exact path={`${match.url}fare/rules/new`} component={FareRulesForm} /> <Route exact path={`${match.url}fare/rules/new`} component={FareRulesForm} />
<Route exact path={`${match.url}fare/rules/:ruleID`} component={FareRulesForm} />
<Route exact path={`${match.url}fare/attributes/new`} component={FareAttributesForm} /> <Route exact path={`${match.url}fare/attributes/new`} component={FareAttributesForm} />
<Route exact path={`${match.url}fare/attributes/:attribID`} component={FareAttributesForm} />
<Route exact path={`${match.url}calendar/new`} component={CalendarForm} /> <Route exact path={`${match.url}calendar/new`} component={CalendarForm} />
<Route exact path={`${match.url}calendar/:serviceId`} component={CalendarForm} /> <Route exact path={`${match.url}calendar/:serviceId`} component={CalendarForm} />

3
src/reducers/fareattr.js

@ -14,11 +14,10 @@ const fareAttrInitState = {
const fareAttr = (state = fareAttrInitState, action) => { const fareAttr = (state = fareAttrInitState, action) => {
switch(action.type) { switch(action.type) {
case FAREATTR_REQUEST: case FAREATTR_REQUEST:
const { query } = action.meta
return { return {
...state, ...state,
fetching: true, fetching: true,
query, query: action.meta !== undefined ? action.meta.query : state.query,
} }
case FAREATTR_SUCCESS: case FAREATTR_SUCCESS:
const { count, next, prev, results } = action.payload const { count, next, prev, results } = action.payload

3
src/reducers/farerule.js

@ -14,11 +14,10 @@ const fareRuleInitState = {
const fareRule = (state = fareRuleInitState, action) => { const fareRule = (state = fareRuleInitState, action) => {
switch(action.type) { switch(action.type) {
case FARERULE_REQUEST: case FARERULE_REQUEST:
const { query } = action.meta
return { return {
...state, ...state,
fetching: true, fetching: true,
query, query: action.meta !== undefined ? action.meta.query : state.query,
} }
case FARERULE_SUCCESS: case FARERULE_SUCCESS:
const { count, next, prev, results } = action.payload const { count, next, prev, results } = action.payload

2
src/sagas.js

@ -1,4 +1,4 @@
import { call, put, takeEvery, takeLatest } from 'redux-saga/effects' import { call, put, takeLatest } from 'redux-saga/effects' // takeEvery
import { apiClient } from './utils/ApiClient' import { apiClient } from './utils/ApiClient'
import * as types from './constants/ActionTypes' import * as types from './constants/ActionTypes'

36
src/utils/index.js

@ -31,3 +31,39 @@ export const getStopsAsyncSelect = (inputValue, callback) => {
}))) })))
}) })
} }
export const getFareAttrAsyncSelect = (inputValue, callback) => {
const that = this
const cancelToken = new CancelToken(function executor(c) {
// An executor function receives a cancel function as a parameter
if (that.cancel)
that.cancel()
that.cancel = c
})
apiClient(`/fare-attribute/?search=${inputValue}`, { cancelToken })
.then((resp) => {
callback(resp.data.results.map(i => ({
...i,
label: i.fare_id
})))
})
}
export const getAgencyAsyncSelect = (inputValue, callback) => {
const that = this
const cancelToken = new CancelToken(function executor(c) {
// An executor function receives a cancel function as a parameter
if (that.cancel)
that.cancel()
that.cancel = c
})
apiClient(`/agency/?search=${inputValue}`, { cancelToken })
.then((resp) => {
callback(resp.data.results.map(i => ({
...i,
label: i.name
})))
})
}

Loading…
Cancel
Save