Add shiping address and add back terms.
Этот коммит содержится в:
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
import React, {useEffect, useRef, useState} from 'react';
|
import React, {useEffect, useRef, useState} from 'react';
|
||||||
|
|
||||||
import {useIntl} from 'react-intl';
|
import {FormattedMessage, useIntl} from 'react-intl';
|
||||||
|
|
||||||
import {useDispatch, useSelector} from 'react-redux';
|
import {useDispatch, useSelector} from 'react-redux';
|
||||||
|
|
||||||
@@ -47,18 +47,34 @@ import SelfHostedExpansionCard from './expansion_card';
|
|||||||
import './self_hosted_expansion_modal.scss';
|
import './self_hosted_expansion_modal.scss';
|
||||||
|
|
||||||
import {STORAGE_KEY_EXPANSION_IN_PROGRESS} from './constants';
|
import {STORAGE_KEY_EXPANSION_IN_PROGRESS} from './constants';
|
||||||
|
import Address from 'components/self_hosted_purchase_modal/address';
|
||||||
|
import ChooseDifferentShipping from 'components/choose_different_shipping';
|
||||||
|
import Terms from 'components/self_hosted_purchase_modal/terms';
|
||||||
|
|
||||||
export interface FormState {
|
export interface FormState {
|
||||||
|
cardName: string;
|
||||||
|
cardFilled: boolean;
|
||||||
|
|
||||||
address: string;
|
address: string;
|
||||||
address2: string;
|
address2: string;
|
||||||
city: string;
|
city: string;
|
||||||
state: string;
|
state: string;
|
||||||
country: string;
|
country: string;
|
||||||
postalCode: string;
|
postalCode: string;
|
||||||
cardName: string;
|
|
||||||
organization: string;
|
organization: string;
|
||||||
cardFilled: boolean;
|
|
||||||
seats: number;
|
seats: number;
|
||||||
|
|
||||||
|
shippingSame: boolean;
|
||||||
|
shippingAddress: string;
|
||||||
|
shippingAddress2: string;
|
||||||
|
shippingCity: string;
|
||||||
|
shippingState: string;
|
||||||
|
shippingCountry: string;
|
||||||
|
shippingPostalCode: string;
|
||||||
|
|
||||||
|
agreedTerms: boolean;
|
||||||
|
|
||||||
submitting: boolean;
|
submitting: boolean;
|
||||||
succeeded: boolean;
|
succeeded: boolean;
|
||||||
progressBar: number;
|
progressBar: number;
|
||||||
@@ -67,16 +83,24 @@ export interface FormState {
|
|||||||
|
|
||||||
export function makeInitialState(seats: number): FormState {
|
export function makeInitialState(seats: number): FormState {
|
||||||
return {
|
return {
|
||||||
|
cardName: '',
|
||||||
|
cardFilled: false,
|
||||||
address: '',
|
address: '',
|
||||||
address2: '',
|
address2: '',
|
||||||
city: '',
|
city: '',
|
||||||
state: '',
|
state: '',
|
||||||
country: '',
|
country: '',
|
||||||
postalCode: '',
|
postalCode: '',
|
||||||
cardName: '',
|
|
||||||
organization: '',
|
organization: '',
|
||||||
cardFilled: false,
|
shippingSame: true,
|
||||||
|
shippingAddress: '',
|
||||||
|
shippingAddress2: '',
|
||||||
|
shippingCity: '',
|
||||||
|
shippingState: '',
|
||||||
|
shippingCountry: '',
|
||||||
|
shippingPostalCode: '',
|
||||||
seats,
|
seats,
|
||||||
|
agreedTerms: false,
|
||||||
submitting: false,
|
submitting: false,
|
||||||
succeeded: false,
|
succeeded: false,
|
||||||
progressBar: 0,
|
progressBar: 0,
|
||||||
@@ -97,6 +121,18 @@ export function canSubmit(formState: FormState, progress: ValueOf<typeof SelfHos
|
|||||||
formState.postalCode &&
|
formState.postalCode &&
|
||||||
formState.country,
|
formState.country,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const validShippingAddress = Boolean(
|
||||||
|
formState.shippingSame ||
|
||||||
|
formState.shippingAddress &&
|
||||||
|
formState.shippingCity &&
|
||||||
|
formState.shippingState &&
|
||||||
|
formState.shippingPostalCode &&
|
||||||
|
formState.shippingCountry,
|
||||||
|
);
|
||||||
|
|
||||||
|
const agreedToTerms = formState.agreedTerms;
|
||||||
|
|
||||||
const validCard = Boolean(
|
const validCard = Boolean(
|
||||||
formState.cardName &&
|
formState.cardName &&
|
||||||
formState.cardFilled,
|
formState.cardFilled,
|
||||||
@@ -104,27 +140,28 @@ export function canSubmit(formState: FormState, progress: ValueOf<typeof SelfHos
|
|||||||
const validSeats = formState.seats > 0;
|
const validSeats = formState.seats > 0;
|
||||||
|
|
||||||
switch (progress) {
|
switch (progress) {
|
||||||
case SelfHostedSignupProgress.PAID:
|
case SelfHostedSignupProgress.PAID:
|
||||||
case SelfHostedSignupProgress.CREATED_LICENSE:
|
case SelfHostedSignupProgress.CREATED_LICENSE:
|
||||||
case SelfHostedSignupProgress.CREATED_SUBSCRIPTION:
|
case SelfHostedSignupProgress.CREATED_SUBSCRIPTION:
|
||||||
return true;
|
return true;
|
||||||
case SelfHostedSignupProgress.CONFIRMED_INTENT: {
|
case SelfHostedSignupProgress.CONFIRMED_INTENT: {
|
||||||
return Boolean(
|
return Boolean(
|
||||||
validAddress &&
|
validAddress && validShippingAddress && validSeats && agreedToTerms
|
||||||
validSeats,
|
);
|
||||||
);
|
}
|
||||||
}
|
case SelfHostedSignupProgress.START:
|
||||||
case SelfHostedSignupProgress.START:
|
case SelfHostedSignupProgress.CREATED_CUSTOMER:
|
||||||
case SelfHostedSignupProgress.CREATED_CUSTOMER:
|
case SelfHostedSignupProgress.CREATED_INTENT:
|
||||||
case SelfHostedSignupProgress.CREATED_INTENT:
|
return Boolean(
|
||||||
return Boolean(
|
validCard &&
|
||||||
validCard &&
|
|
||||||
validAddress &&
|
validAddress &&
|
||||||
validSeats,
|
validShippingAddress &&
|
||||||
);
|
validSeats &&
|
||||||
default: {
|
agreedToTerms
|
||||||
return false;
|
);
|
||||||
}
|
default: {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,6 +210,14 @@ export default function SelfHostedExpansionModal() {
|
|||||||
postal_code: formState.postalCode,
|
postal_code: formState.postalCode,
|
||||||
state: formState.state,
|
state: formState.state,
|
||||||
},
|
},
|
||||||
|
shipping_address: {
|
||||||
|
city: formState.city,
|
||||||
|
country: formState.country,
|
||||||
|
line1: formState.address,
|
||||||
|
line2: formState.address2,
|
||||||
|
postal_code: formState.postalCode,
|
||||||
|
state: formState.state,
|
||||||
|
},
|
||||||
organization: formState.organization,
|
organization: formState.organization,
|
||||||
});
|
});
|
||||||
} catch {
|
} catch {
|
||||||
@@ -361,104 +406,87 @@ export default function SelfHostedExpansionModal() {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<span className='section-title'>
|
<span className='section-title'>
|
||||||
{intl.formatMessage({
|
<FormattedMessage
|
||||||
id: 'payment_form.billing_address',
|
id='payment_form.billing_address'
|
||||||
defaultMessage: 'Billing address',
|
defaultMessage='Billing address'
|
||||||
})}
|
/>
|
||||||
</span>
|
</span>
|
||||||
<DropdownInput
|
<Address
|
||||||
testId='selfHostedExpansionCountrySelector'
|
type='billing'
|
||||||
onChange={(option: {value: string}) => {
|
country={formState.country}
|
||||||
|
changeCountry={(option) => {
|
||||||
setFormState({...formState, country: option.value});
|
setFormState({...formState, country: option.value});
|
||||||
}}
|
}}
|
||||||
value={
|
address={formState.address}
|
||||||
formState.country ? {value: formState.country, label: formState.country} : undefined
|
changeAddress={(e) => {
|
||||||
}
|
setFormState({...formState, address: e.target.value});
|
||||||
options={COUNTRIES.map((country) => ({
|
}}
|
||||||
value: country.name,
|
address2={formState.address2}
|
||||||
label: country.name,
|
changeAddress2={(e) => {
|
||||||
}))}
|
setFormState({...formState, address2: e.target.value});
|
||||||
legend={intl.formatMessage({
|
}}
|
||||||
id: 'payment_form.country',
|
city={formState.city}
|
||||||
defaultMessage: 'Country',
|
changeCity={(e) => {
|
||||||
})}
|
setFormState({...formState, city: e.target.value});
|
||||||
placeholder={intl.formatMessage({
|
}}
|
||||||
id: 'payment_form.country',
|
state={formState.state}
|
||||||
defaultMessage: 'Country',
|
changeState={(state: string) => {
|
||||||
})}
|
setFormState({...formState, state});
|
||||||
name={'billing_dropdown'}
|
}}
|
||||||
|
postalCode={formState.postalCode}
|
||||||
|
changePostalCode={(e) => {
|
||||||
|
setFormState({...formState, postalCode: e.target.value});
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<div className='form-row'>
|
<ChooseDifferentShipping
|
||||||
<Input
|
shippingIsSame={formState.shippingSame}
|
||||||
name='address'
|
setShippingIsSame={(val: boolean) => {
|
||||||
type='text'
|
setFormState({...formState, shippingSame: val});
|
||||||
value={formState.address}
|
}}
|
||||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
/>
|
||||||
setFormState({...formState, address: e.target.value});
|
{!formState.shippingSame && (
|
||||||
}}
|
<>
|
||||||
placeholder={intl.formatMessage({
|
<div className='section-title'>
|
||||||
id: 'payment_form.address',
|
<FormattedMessage
|
||||||
defaultMessage: 'Address',
|
id='payment_form.shipping_address'
|
||||||
})}
|
defaultMessage='Shipping Address'
|
||||||
required={true}
|
/>
|
||||||
/>
|
</div>
|
||||||
</div>
|
<Address
|
||||||
<div className='form-row'>
|
type='shipping'
|
||||||
<Input
|
country={formState.shippingCountry}
|
||||||
name='address2'
|
changeCountry={(option) => {
|
||||||
type='text'
|
setFormState({...formState, shippingCountry: option.value});
|
||||||
value={formState.address2}
|
}}
|
||||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
address={formState.shippingAddress}
|
||||||
setFormState({...formState, address2: e.target.value});
|
changeAddress={(e) => {
|
||||||
}}
|
setFormState({...formState, shippingAddress: e.target.value});
|
||||||
placeholder={intl.formatMessage({
|
}}
|
||||||
id: 'payment_form.address_2',
|
address2={formState.shippingAddress2}
|
||||||
defaultMessage: 'Address 2',
|
changeAddress2={(e) => {
|
||||||
})}
|
setFormState({...formState, shippingAddress2: e.target.value});
|
||||||
/>
|
}}
|
||||||
</div>
|
city={formState.shippingCity}
|
||||||
<div className='form-row'>
|
changeCity={(e) => {
|
||||||
<Input
|
setFormState({...formState, shippingCity: e.target.value});
|
||||||
name='city'
|
}}
|
||||||
type='text'
|
state={formState.shippingState}
|
||||||
value={formState.city}
|
changeState={(state: string) => {
|
||||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
setFormState({...formState, shippingState: state});
|
||||||
setFormState({...formState, city: e.target.value});
|
}}
|
||||||
}}
|
postalCode={formState.shippingPostalCode}
|
||||||
placeholder={intl.formatMessage({
|
changePostalCode={(e) => {
|
||||||
id: 'payment_form.city',
|
setFormState({...formState, shippingPostalCode: e.target.value});
|
||||||
defaultMessage: 'City',
|
|
||||||
})}
|
|
||||||
required={true}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className='form-row'>
|
|
||||||
<div className='form-row-third-1'>
|
|
||||||
<StateSelector
|
|
||||||
testId='selfHostedExpansionStateSelector'
|
|
||||||
country={formState.country}
|
|
||||||
state={formState.state}
|
|
||||||
onChange={(state: string) => {
|
|
||||||
setFormState({...formState, state});
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</>
|
||||||
<div className='form-row-third-2'>
|
)}
|
||||||
<Input
|
<Terms
|
||||||
name='postalCode'
|
agreed={formState.agreedTerms}
|
||||||
type='text'
|
setAgreed={(data: boolean) => {
|
||||||
value={formState.postalCode}
|
setFormState({...formState, agreedTerms: data});
|
||||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
|
}}
|
||||||
setFormState({...formState, postalCode: e.target.value});
|
/>
|
||||||
}}
|
|
||||||
placeholder={intl.formatMessage({
|
|
||||||
id: 'payment_form.zipcode',
|
|
||||||
defaultMessage: 'Zip/Postal Code',
|
|
||||||
})}
|
|
||||||
required={true}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='rhs'>
|
<div className='rhs'>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
.form-view {
|
.form-view {
|
||||||
display: flex;
|
display: flex;
|
||||||
overflow: hidden;
|
overflow-x: hidden;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -144,6 +144,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
input[type=checkbox] {
|
input[type=checkbox] {
|
||||||
|
width: 17px;
|
||||||
|
height: 17px;
|
||||||
|
flex-shrink: 0;
|
||||||
margin-right: 12px;
|
margin-right: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user