diff --git a/src/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx b/src/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx index c8b03bac4c..fe9f28a77e 100644 --- a/src/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx +++ b/src/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx @@ -19,7 +19,7 @@ import { useWallet } from 'hooks/Wallet' import { trackFathomGoal } from 'lib/fathom' import { V2V3CurrencyOption } from 'models/v2v3/currencyOption' import Link from 'next/link' -import { useCallback, useContext, useState } from 'react' +import { useCallback, useContext, useMemo, useState } from 'react' import { useSetCreateFurthestPageReached } from 'redux/hooks/useEditingCreateFurthestPageReached' import { inputMustBeEthAddressRule, inputMustExistRule } from 'utils/antdRules' import { inputIsLengthRule } from 'utils/antdRules/inputIsLengthRule' @@ -46,6 +46,32 @@ export const ProjectDetailsPage: React.FC< const projectOwnerDifferentThanWalletAddress = inputWalletAddress && wallet.userAddress !== inputWalletAddress + const startTimestamp = Form.useWatch('startTimestamp', formProps.form) + + // just for juicecrowd + const launchDate = useMemo(() => { + if (!startTimestamp) { + return null + } + const number = Number(startTimestamp) + if (isNaN(number)) { + return null + } + + let date + if (number > 1000000000000) { + date = new Date(number) + } else { + date = new Date(number * 1000) + } + + // format in local timezone + return { + local: date.toLocaleString(), + utc: date.toUTCString(), + } + }, [startTimestamp]) + return (
+ + Start date timestamp} + tooltip={t`The timestamp for the start of the project.`} + > + + + {launchDate && ( +
+ {t`Launch date: ${launchDate.local} (${launchDate.utc})`} +
+ )} )} diff --git a/src/components/Create/components/pages/ProjectDetails/hooks/useProjectDetailsForm.ts b/src/components/Create/components/pages/ProjectDetails/hooks/useProjectDetailsForm.ts index 1f63cf83d7..f8cff12493 100644 --- a/src/components/Create/components/pages/ProjectDetails/hooks/useProjectDetailsForm.ts +++ b/src/components/Create/components/pages/ProjectDetails/hooks/useProjectDetailsForm.ts @@ -1,9 +1,14 @@ +import { Form } from 'antd' import { useForm } from 'antd/lib/form/Form' import { ProjectTagName } from 'models/project-tags' import { V2V3CurrencyOption } from 'models/v2v3/currencyOption' -import { useMemo } from 'react' +import { useEffect, useMemo } from 'react' +import { useAppDispatch } from 'redux/hooks/useAppDispatch' import { useAppSelector } from 'redux/hooks/useAppSelector' -import { editingV2ProjectActions } from 'redux/slices/editingV2Project' +import { + DEFAULT_MUST_START_AT_OR_AFTER, + editingV2ProjectActions, +} from 'redux/slices/editingV2Project' import { V2V3_CURRENCY_USD } from 'utils/v2v3/currency' import { useFormDispatchWatch } from '../../hooks' import { AmountInputValue } from '../ProjectDetailsPage' @@ -28,13 +33,13 @@ type ProjectDetailsFormProps = Partial<{ introImageUri: string // Only relevant to Juicecrowd softTarget: AmountInputValue + startTimestamp: string }> export const useProjectDetailsForm = () => { const [form] = useForm() - const { projectMetadata, inputProjectOwner } = useAppSelector( - state => state.editingV2Project, - ) + const { projectMetadata, inputProjectOwner, mustStartAtOrAfter } = + useAppSelector(state => state.editingV2Project) const initialValues: ProjectDetailsFormProps = useMemo( () => ({ @@ -54,6 +59,11 @@ export const useProjectDetailsForm = () => { // Only relevant to Juicecrowd introVideoUrl: projectMetadata.introVideoUrl, introImageUri: projectMetadata.introImageUri, + startTimestamp: + mustStartAtOrAfter !== DEFAULT_MUST_START_AT_OR_AFTER && + !isNaN(parseInt(mustStartAtOrAfter)) + ? mustStartAtOrAfter + : '', softTarget: projectMetadata.softTargetAmount && projectMetadata.softTargetCurrency ? { @@ -82,6 +92,7 @@ export const useProjectDetailsForm = () => { projectMetadata.softTargetAmount, projectMetadata.softTargetCurrency, inputProjectOwner, + mustStartAtOrAfter, ], ) @@ -198,5 +209,26 @@ export const useProjectDetailsForm = () => { formatter: v => v ?? { amount: '', currency: V2V3_CURRENCY_USD }, }) + const startTimestamp = Form.useWatch('startTimestamp', form) + const dispatch = useAppDispatch() + + useEffect(() => { + if (!startTimestamp) return + const launchDate = parseInt(startTimestamp) + if (isNaN(launchDate)) return + // check if launch date is in ms or seconds + if (launchDate > 1000000000000) { + dispatch( + editingV2ProjectActions.setMustStartAtOrAfter( + (launchDate / 1000).toString(), + ), + ) + } else { + dispatch( + editingV2ProjectActions.setMustStartAtOrAfter(launchDate.toString()), + ) + } + }, [dispatch, startTimestamp]) + return { form, initialValues } } diff --git a/src/locales/messages.pot b/src/locales/messages.pot index 9be84214c6..d11a21c48c 100644 --- a/src/locales/messages.pot +++ b/src/locales/messages.pot @@ -1379,6 +1379,9 @@ msgstr "" msgid "Use NFTs for redemptions" msgstr "" +msgid "Launch date: {0} ({1})" +msgstr "" + msgid "Assets" msgstr "" @@ -2090,6 +2093,9 @@ msgstr "" msgid "Crowdfunding" msgstr "" +msgid "Start date timestamp" +msgstr "" + msgid "30 days" msgstr "" @@ -3143,6 +3149,9 @@ msgstr "" msgid "Payments to this project are paused in this cycle." msgstr "" +msgid "The timestamp for the start of the project." +msgstr "" + msgid "Redemption rate" msgstr ""