From adda6ba3b7538856875471577a49968bef4c726a Mon Sep 17 00:00:00 2001 From: Ebube Date: Wed, 26 Feb 2025 14:41:07 +0100 Subject: [PATCH 1/4] fixed issue with start date --- src/entities/campaign/hooks/forms.ts | 5 +++-- src/entities/campaign/models/schema.ts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/entities/campaign/hooks/forms.ts b/src/entities/campaign/hooks/forms.ts index d94511cc..4c4b0d16 100644 --- a/src/entities/campaign/hooks/forms.ts +++ b/src/entities/campaign/hooks/forms.ts @@ -14,6 +14,7 @@ import { dispatch } from "@/store"; import { campaignFormSchema } from "../models/schema"; import { CampaignEnumType } from "../types"; +import { Temporal } from "temporal-polyfill"; export const useCampaignForm = ({ campaignId }: { campaignId?: CampaignId }) => { const viewer = useWalletUserSession(); @@ -152,8 +153,8 @@ export const useCampaignForm = ({ campaignId }: { campaignId?: CampaignId }) => max_amount: floatToYoctoNear(values.max_amount) as any, }), ...(values.start_ms && - timeToMilliseconds(values.start_ms) > Date.now() && { - start_ms: timeToMilliseconds(values.start_ms), + { + start_ms: timeToMilliseconds(values.start_ms.toString()), }), ...(values.end_ms && { end_ms: timeToMilliseconds(values.end_ms), diff --git a/src/entities/campaign/models/schema.ts b/src/entities/campaign/models/schema.ts index 7a50e367..d5cefd64 100644 --- a/src/entities/campaign/models/schema.ts +++ b/src/entities/campaign/models/schema.ts @@ -2,6 +2,7 @@ import { z } from "zod"; import { NETWORK } from "@/common/_config"; import { near } from "@/common/blockchains/near-protocol/client"; +import { futureTimestamp } from "@/common/lib"; export const campaignFormSchema = z .object({ @@ -14,7 +15,7 @@ export const campaignFormSchema = z min_amount: z.number().optional(), max_amount: z.number().optional(), cover_image_url: z.string().optional(), - start_ms: z.string().min(1, "Start Time is Required"), + start_ms: futureTimestamp.describe('Campaign Start Date'), end_ms: z.string()?.optional(), owner: z.string()?.optional(), recipient: z.string().refine(near.isAccountValid, { @@ -22,7 +23,7 @@ export const campaignFormSchema = z }), }) .superRefine((data, ctx) => { - if (data.end_ms && data.start_ms >= data.end_ms) { + if (data.end_ms && data.start_ms.toString() >= data.end_ms) { ctx.addIssue({ path: ["start_ms"], message: "Start time must be earlier than end time", From 9d739ff7766de6cccff4a2fd3dda39a560154f3d Mon Sep 17 00:00:00 2001 From: Ebube Date: Wed, 26 Feb 2025 14:46:53 +0100 Subject: [PATCH 2/4] es lint fix --- src/entities/campaign/components/CampaignForm.tsx | 2 +- src/entities/campaign/hooks/forms.ts | 7 ++++--- src/entities/campaign/models/schema.ts | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/entities/campaign/components/CampaignForm.tsx b/src/entities/campaign/components/CampaignForm.tsx index 482f7a77..5a683873 100644 --- a/src/entities/campaign/components/CampaignForm.tsx +++ b/src/entities/campaign/components/CampaignForm.tsx @@ -60,7 +60,7 @@ export const CampaignForm = ({ existingData?.end_ms ? formatTimestampForInput(existingData?.end_ms) : "", ); } - }, [isUpdate, existingData, form]); + }, [isUpdate, existingData]); const handleCoverImageChange = async (e: ChangeEvent) => { const target = e.target as HTMLInputElement; diff --git a/src/entities/campaign/hooks/forms.ts b/src/entities/campaign/hooks/forms.ts index 4c4b0d16..1eb53d9d 100644 --- a/src/entities/campaign/hooks/forms.ts +++ b/src/entities/campaign/hooks/forms.ts @@ -3,6 +3,7 @@ import { useCallback, useEffect } from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/router"; import { SubmitHandler, useForm, useWatch } from "react-hook-form"; +import { Temporal } from "temporal-polyfill"; import { infer as FromSchema } from "zod"; import { campaignsContractClient } from "@/common/contracts/core/campaigns"; @@ -14,7 +15,6 @@ import { dispatch } from "@/store"; import { campaignFormSchema } from "../models/schema"; import { CampaignEnumType } from "../types"; -import { Temporal } from "temporal-polyfill"; export const useCampaignForm = ({ campaignId }: { campaignId?: CampaignId }) => { const viewer = useWalletUserSession(); @@ -153,8 +153,9 @@ export const useCampaignForm = ({ campaignId }: { campaignId?: CampaignId }) => max_amount: floatToYoctoNear(values.max_amount) as any, }), ...(values.start_ms && - { - start_ms: timeToMilliseconds(values.start_ms.toString()), + !campaignId && + timeToMilliseconds(values.start_ms) >= Date.now() && { + start_ms: timeToMilliseconds(values.start_ms), }), ...(values.end_ms && { end_ms: timeToMilliseconds(values.end_ms), diff --git a/src/entities/campaign/models/schema.ts b/src/entities/campaign/models/schema.ts index d5cefd64..8bde2dad 100644 --- a/src/entities/campaign/models/schema.ts +++ b/src/entities/campaign/models/schema.ts @@ -15,7 +15,17 @@ export const campaignFormSchema = z min_amount: z.number().optional(), max_amount: z.number().optional(), cover_image_url: z.string().optional(), - start_ms: futureTimestamp.describe('Campaign Start Date'), + start_ms: z + .string() + .describe("Campaign Start Date") + .refine( + (date) => { + return new Date(date).getTime() > Date.now(); + }, + { + message: "Start date must be in the future", + }, + ), end_ms: z.string()?.optional(), owner: z.string()?.optional(), recipient: z.string().refine(near.isAccountValid, { @@ -23,7 +33,7 @@ export const campaignFormSchema = z }), }) .superRefine((data, ctx) => { - if (data.end_ms && data.start_ms.toString() >= data.end_ms) { + if (data.end_ms && data.start_ms >= data.end_ms) { ctx.addIssue({ path: ["start_ms"], message: "Start time must be earlier than end time", From 605f2f91779d25f332f7b6bdaba3f9be6f74ec5a Mon Sep 17 00:00:00 2001 From: Ebube Date: Wed, 26 Feb 2025 19:06:57 +0100 Subject: [PATCH 3/4] change field to number field --- .../campaign/components/CampaignForm.tsx | 43 +++++++++++-------- src/entities/campaign/hooks/forms.ts | 2 +- src/entities/campaign/models/schema.ts | 15 ++----- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/entities/campaign/components/CampaignForm.tsx b/src/entities/campaign/components/CampaignForm.tsx index 5a683873..b468376c 100644 --- a/src/entities/campaign/components/CampaignForm.tsx +++ b/src/entities/campaign/components/CampaignForm.tsx @@ -10,12 +10,8 @@ import { TextAreaField, TextField } from "@/common/ui/form-fields"; import { NearInputField } from "@/entities/_shared"; import { useCampaignForm } from "../hooks/forms"; +import { Temporal } from "temporal-polyfill"; -const formatTimestampForInput = (timestamp: number) => { - if (!timestamp) return ""; - const date = new Date(timestamp); - return date.toISOString().slice(0, 16); -}; export const CampaignForm = ({ existingData, @@ -52,13 +48,14 @@ export const CampaignForm = ({ form.setValue( "start_ms", - existingData?.start_ms ? formatTimestampForInput(existingData?.start_ms) : "", - ); - - form.setValue( - "end_ms", - existingData?.end_ms ? formatTimestampForInput(existingData?.end_ms) : "", + existingData?.start_ms, ); + if(existingData?.end_ms) { + form.setValue( + "end_ms", + existingData?.end_ms, + ); + } } }, [isUpdate, existingData]); @@ -209,11 +206,17 @@ export const CampaignForm = ({ ( + render={({ field: {value, ...field} }) => ( @@ -222,11 +225,17 @@ export const CampaignForm = ({ ( + render={({ field: {value, ...field} }) => ( diff --git a/src/entities/campaign/hooks/forms.ts b/src/entities/campaign/hooks/forms.ts index 1eb53d9d..4838936d 100644 --- a/src/entities/campaign/hooks/forms.ts +++ b/src/entities/campaign/hooks/forms.ts @@ -80,7 +80,7 @@ export const useCampaignForm = ({ campaignId }: { campaignId?: CampaignId }) => }); }, [values, self]); - const timeToMilliseconds = (time: string) => { + const timeToMilliseconds = (time: number) => { return new Date(time).getTime(); }; diff --git a/src/entities/campaign/models/schema.ts b/src/entities/campaign/models/schema.ts index 8bde2dad..34a31b7a 100644 --- a/src/entities/campaign/models/schema.ts +++ b/src/entities/campaign/models/schema.ts @@ -15,18 +15,9 @@ export const campaignFormSchema = z min_amount: z.number().optional(), max_amount: z.number().optional(), cover_image_url: z.string().optional(), - start_ms: z - .string() - .describe("Campaign Start Date") - .refine( - (date) => { - return new Date(date).getTime() > Date.now(); - }, - { - message: "Start date must be in the future", - }, - ), - end_ms: z.string()?.optional(), + start_ms: + futureTimestamp.describe("Campaign Start Date"), + end_ms: futureTimestamp.describe("Campaign End Date"), owner: z.string()?.optional(), recipient: z.string().refine(near.isAccountValid, { message: `Account does not exist on ${NETWORK}`, From 72a0385dea47c4e73e9ad0e4d9fcd314731b50a8 Mon Sep 17 00:00:00 2001 From: Ebube Date: Wed, 26 Feb 2025 19:07:35 +0100 Subject: [PATCH 4/4] es lint fix --- .../campaign/components/CampaignForm.tsx | 57 +++++++++---------- src/entities/campaign/models/schema.ts | 3 +- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/entities/campaign/components/CampaignForm.tsx b/src/entities/campaign/components/CampaignForm.tsx index b468376c..82948e60 100644 --- a/src/entities/campaign/components/CampaignForm.tsx +++ b/src/entities/campaign/components/CampaignForm.tsx @@ -1,5 +1,7 @@ import { ChangeEvent, useEffect, useState } from "react"; +import { Temporal } from "temporal-polyfill"; + import { IPFS_NEAR_SOCIAL_URL } from "@/common/constants"; import { Campaign } from "@/common/contracts/core/campaigns"; import { yoctoNearToFloat } from "@/common/lib"; @@ -10,8 +12,6 @@ import { TextAreaField, TextField } from "@/common/ui/form-fields"; import { NearInputField } from "@/entities/_shared"; import { useCampaignForm } from "../hooks/forms"; -import { Temporal } from "temporal-polyfill"; - export const CampaignForm = ({ existingData, @@ -46,15 +46,10 @@ export const CampaignForm = ({ form.setValue("max_amount", yoctoNearToFloat(existingData.max_amount)); } - form.setValue( - "start_ms", - existingData?.start_ms, - ); - if(existingData?.end_ms) { - form.setValue( - "end_ms", - existingData?.end_ms, - ); + form.setValue("start_ms", existingData?.start_ms); + + if (existingData?.end_ms) { + form.setValue("end_ms", existingData?.end_ms); } } }, [isUpdate, existingData]); @@ -206,17 +201,19 @@ export const CampaignForm = ({ ( + render={({ field: { value, ...field } }) => ( @@ -225,17 +222,19 @@ export const CampaignForm = ({ ( + render={({ field: { value, ...field } }) => ( diff --git a/src/entities/campaign/models/schema.ts b/src/entities/campaign/models/schema.ts index 34a31b7a..93c0fc89 100644 --- a/src/entities/campaign/models/schema.ts +++ b/src/entities/campaign/models/schema.ts @@ -15,8 +15,7 @@ export const campaignFormSchema = z min_amount: z.number().optional(), max_amount: z.number().optional(), cover_image_url: z.string().optional(), - start_ms: - futureTimestamp.describe("Campaign Start Date"), + start_ms: futureTimestamp.describe("Campaign Start Date"), end_ms: futureTimestamp.describe("Campaign End Date"), owner: z.string()?.optional(), recipient: z.string().refine(near.isAccountValid, {