Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: migrate set buy now #65

Merged
merged 37 commits into from
Jan 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3bdd36b
fix: resolve big number error
domw30 Dec 15, 2022
261e235
fix: fix more options display condition logic
domw30 Dec 15, 2022
79bdcd5
refactor: remove console logs
domw30 Dec 15, 2022
aba9151
refactor: hide view bids button if no bids on domain
domw30 Dec 15, 2022
dc20d4e
fix: update incorrect text
domw30 Dec 15, 2022
50b33a5
fix: update steps when to display subheader
domw30 Dec 15, 2022
dcbd5a2
fix: display leading bid text fix
domw30 Dec 15, 2022
af36d4e
fix: resolve place bid error and update copy
domw30 Dec 15, 2022
6823fe2
fix: add correct zauction checks to accept bid to resolve errors
domw30 Dec 15, 2022
d6ba8a6
fix: revert default network used for dev purpose
domw30 Dec 15, 2022
d4e2938
fix: resolve failing test errors
domw30 Dec 15, 2022
ca7f342
refactor: clean up hook imports
domw30 Dec 15, 2022
008d163
feat: initial feature set up commit
domw30 Dec 16, 2022
601d804
fix: resolve run errors
domw30 Dec 16, 2022
ecff54b
feat: WIP - add zauction and approve buy now functions
domw30 Dec 16, 2022
a459c0b
fix: resolve flow bugs - confirm buy now successful request
domw30 Dec 19, 2022
1562552
feat: tidy up UI styling and improve zauction step
domw30 Dec 19, 2022
737dde6
fix: enable video if available
domw30 Dec 19, 2022
ff65993
feat: remove buttons if owner
domw30 Dec 20, 2022
cb16437
feat: extract re-usable for components
domw30 Dec 20, 2022
9f9db9e
refactor: tidy up data file
domw30 Dec 20, 2022
40a07fb
feat: minor refactoring - readd confirm step
domw30 Dec 20, 2022
f4679dd
feat: initial set buy now feature commit
domw30 Dec 20, 2022
e8f6f55
fix: buy now history item display for timestamp
domw30 Dec 21, 2022
0b43c7f
Merge branch 'main' into feat/set-buy-now
domw30 Jan 3, 2023
3d1f07a
feat: disable set buy now button if buy now amount entered is not valid
domw30 Jan 3, 2023
e5780cc
feat: add is buy now set boolean and return from data hook
domw30 Jan 4, 2023
19800ac
feat: add usd conversion
domw30 Jan 4, 2023
3d90c46
feat: edit option if buy now set
domw30 Jan 4, 2023
0866361
feat: add prompt text to input
domw30 Jan 4, 2023
9099348
feat: display current buy now if set
domw30 Jan 4, 2023
c4d343b
feat: add toggle button and functionality
domw30 Jan 4, 2023
6537cb1
refactor: `bidAmount` -> `buyNowAmount`
domw30 Jan 4, 2023
1941bf1
refactor: tidy up files and extract confirm step
domw30 Jan 4, 2023
44e3e17
feat: expose set buy now in more options component
domw30 Jan 5, 2023
49575d9
Merge branch 'main' into feat/set-buy-now
domw30 Jan 20, 2023
b60787c
fix: resolve errors caused from merge conflicts
domw30 Jan 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 0 additions & 17 deletions src/features/set-buy-now/SetBuyNow.tsx

This file was deleted.

7 changes: 0 additions & 7 deletions src/features/set-buy-now/SetBuyNowButton.tsx

This file was deleted.

12 changes: 12 additions & 0 deletions src/features/set-buy-now/SetBuyNowButton/SetBuyNowButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { FC, ReactNode } from 'react';

import { SetBuyNowModal } from '..';

interface SetBuyNowButtonProps {
zna: string;
trigger: ReactNode;
}

export const SetBuyNowButton: FC<SetBuyNowButtonProps> = ({ zna, trigger }) => {
return <SetBuyNowModal zna={zna} trigger={trigger} />;
};
1 change: 1 addition & 0 deletions src/features/set-buy-now/SetBuyNowButton/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './SetBuyNowButton';
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { FC } from 'react';

import { Step } from '../hooks';

import { NFTDetails } from '../ui';
import { FormTextContent } from '../../../../ui';
import { Wizard } from '@zero-tech/zui/components';

import styles from '../FormSteps.module.scss';

export interface CompleteProps {
zna: string;
step: Step;
onClose: () => void;
}

export const Complete: FC<CompleteProps> = ({ zna, step, onClose }) => {
return (
<>
<NFTDetails zna={zna} step={step} />

<div className={styles.Container}>
<FormTextContent variant={'success'} textContent={'Success!'} />

<Wizard.Buttons
className={styles.Button}
isPrimaryButtonActive
primaryButtonText={'Finish'}
onClickPrimaryButton={onClose}
/>
</div>
</>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './Complete';
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { FC } from 'react';

import { Step } from '../hooks';
import { useSetBuyNowData } from '../../../useSetBuyNowData';

import { NFTDetails } from '../ui';
import { FormTextContent } from '../../../../ui';
import { Wizard, ButtonsProps } from '@zero-tech/zui/components/Wizard';

import styles from '../FormSteps.module.scss';

export interface ConfirmProps {
zna: string;
step: Step;
errorText: string;
buyNowAmount: string;
onConfirmSetBuyNow: () => void;
onClose: () => void;
}

export const Confirm: FC<ConfirmProps> = ({
zna,
step,
errorText,
buyNowAmount,
onConfirmSetBuyNow,
onClose,
}) => {
const { paymentTokenSymbol } = useSetBuyNowData(zna);

const primaryButtonText: ButtonsProps['primaryButtonText'] = errorText
? 'Retry'
: 'Confirm';

return (
<>
<NFTDetails zna={zna} step={step} />

<div className={styles.Container}>
<FormTextContent
textContent={
buyNowAmount !== ''
? `Are you sure you want to set a buy now price of ${buyNowAmount} ${paymentTokenSymbol} for ${zna}?`
: `Are you sure you want to turn off and remove the buy now price for ${zna}?`
}
errorText={errorText}
/>

<Wizard.Buttons
className={styles.Button}
isPrimaryButtonActive
isSecondaryButtonActive
secondaryButtonText="Cancel"
primaryButtonText={primaryButtonText}
onClickPrimaryButton={onConfirmSetBuyNow}
onClickSecondaryButton={onClose}
/>
</div>
</>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './Confirm';
110 changes: 110 additions & 0 deletions src/features/set-buy-now/SetBuyNowForm/FormSteps/Details/Details.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import { FC, useState } from 'react';

import { Step } from '../hooks';
import { formatNumber } from '../../../../../lib/util';
import { useSetBuyNowData } from '../../../useSetBuyNowData';

import { NFTDetails } from '../ui';
import { ToggleButton } from '../../../../ui';
import { Input } from '@zero-tech/zui/components/Input';
import { Wizard, ButtonsProps } from '@zero-tech/zui/components/Wizard';

import styles from '../FormSteps.module.scss';

export interface DetailsProps {
zna: string;
step: Step;
errorText: string;
buyNowAmount: string;
setBuyNowAmount: (bid: string) => void;
onCheckZAuction: () => void;
onClose: () => void;
}

export const Details: FC<DetailsProps> = ({
zna,
step,
errorText,
buyNowAmount,
setBuyNowAmount,
onCheckZAuction,
onClose,
}) => {
const {
hasExistingBuyNow,
buyNowPriceAsString,
paymentTokenLabel,
paymentTokenSymbol,
paymentTokenPriceInUsd,
} = useSetBuyNowData(zna);

const [toggledValue, setToggledValue] = useState<boolean>(hasExistingBuyNow);

const isInputValueValid =
Number(buyNowAmount) &&
!Number.isNaN(parseFloat(buyNowAmount)) &&
Number(buyNowAmount) !== 0;

const isError = buyNowAmount?.length > 0 && !isInputValueValid;
const primaryButtonText: ButtonsProps['primaryButtonText'] = errorText
? 'Retry'
: 'Next';

const bidAmountConversionString =
paymentTokenSymbol && buyNowAmount
? `$${formatNumber(
Number(paymentTokenPriceInUsd) * Number(buyNowAmount),
)}`
: '-';

return (
<>
<NFTDetails zna={zna} step={step} />

<div className={styles.Container}>
{step === Step.DETAILS && (
<div className={styles.InputWrapper}>
<ToggleButton
label={'Enable Buy Now price?'}
toggled={toggledValue}
onClick={() => {
setToggledValue(!toggledValue);
setBuyNowAmount('');
}}
/>

<Input
type="number"
error={isError}
inputMode="numeric"
value={buyNowAmount}
isDisabled={!toggledValue}
placeholder={`Buy Now Price ${paymentTokenLabel}`}
onChange={(value: string) => setBuyNowAmount(value)}
/>

<span className={styles.Subtext}>{bidAmountConversionString}</span>

<span className={styles.Subtext}>
{hasExistingBuyNow
? `This NFT has an existing buy now price of ${buyNowPriceAsString}`
: 'This NFT does not have an existing buy now price'}
</span>
</div>
)}

<Wizard.Buttons
className={styles.Button}
isPrimaryButtonActive={
isInputValueValid || (!toggledValue && hasExistingBuyNow)
}
isSecondaryButtonActive
secondaryButtonText="Cancel"
primaryButtonText={primaryButtonText}
onClickPrimaryButton={onCheckZAuction}
onClickSecondaryButton={onClose}
/>
</div>
</>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './Details';
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
@import '../../../../../node_modules/@zero-tech/zui/styles/_colors.scss';
@import '../../../../../node_modules/@zero-tech/zui/styles/_typography.scss';

.Container {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;

.Button {
margin-top: 2.5rem;
}

.InputWrapper {
display: flex;
flex-direction: column;
gap: 0.5rem;
width: 100%;
}

.Subtext {
font-size: $size-tiny;
color: $grey-lighter-2;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './useFormSteps';
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import { ReactNode } from 'react';

import { Complete, Confirm, Details } from '..';
import { ApproveZAuction } from '../../../../ui';
import { Wizard } from '@zero-tech/zui/components';

export enum Step {
DETAILS,
ZAUCTION_APPROVE,
CONFIRM,
COMPLETE,
LOADING,
}

interface UseFormStepsReturn {
content: ReactNode;
}

export interface useFormStepsProps {
zna: string;
step: Step;
error: string;
statusText: string;
buyNowAmount: string;
setBuyNowAmount: (bid: string) => void;
onCheckZAuction: () => void;
onApproveZAuction: () => void;
onConfirmSetBuyNow: () => void;
onClose: () => void;
}

export const useFormSteps = ({
zna,
step,
error,
statusText,
buyNowAmount,
setBuyNowAmount,
onCheckZAuction,
onApproveZAuction,
onConfirmSetBuyNow,
onClose,
}: useFormStepsProps): UseFormStepsReturn => {
let content: ReactNode;

switch (step) {
case Step.DETAILS:
content = (
<Details
zna={zna}
step={step}
errorText={error}
buyNowAmount={buyNowAmount}
setBuyNowAmount={setBuyNowAmount}
onCheckZAuction={onCheckZAuction}
onClose={onClose}
/>
);
break;

case Step.ZAUCTION_APPROVE:
content = (
<ApproveZAuction
action={'set buy now'}
errorText={error}
onClose={onClose}
onApproveZAuction={onApproveZAuction}
/>
);
break;

case Step.CONFIRM:
content = (
<Confirm
zna={zna}
step={step}
errorText={error}
buyNowAmount={buyNowAmount}
onConfirmSetBuyNow={onConfirmSetBuyNow}
onClose={onClose}
/>
);
break;

case Step.COMPLETE:
content = <Complete zna={zna} step={step} onClose={onClose} />;
break;

case Step.LOADING:
content = <Wizard.Loading message={statusText} />;
break;
}

return { content };
};
3 changes: 3 additions & 0 deletions src/features/set-buy-now/SetBuyNowForm/FormSteps/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './Complete';
export * from './Confirm';
export * from './Details';
Loading