From 9321eb59ee7732e58b85dca92d6574673bf95f71 Mon Sep 17 00:00:00 2001 From: marshennikovaolga Date: Sun, 11 Aug 2024 01:27:59 +0300 Subject: [PATCH] link title editing --- web/components/routes/link/form/manage.tsx | 40 ++++++++++++---------- web/components/routes/link/form/schema.ts | 12 +++---- web/lib/schema/personal-link.ts | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/web/components/routes/link/form/manage.tsx b/web/components/routes/link/form/manage.tsx index f25ed934..7c549971 100644 --- a/web/components/routes/link/form/manage.tsx +++ b/web/components/routes/link/form/manage.tsx @@ -121,22 +121,24 @@ interface LinkFormProps extends React.ComponentPropsWithoutRef<"form"> { } const LinkForm = React.forwardRef(({ onSuccess, onCancel, personalLink }, ref) => { - const selectedLink = useCoState(PersonalLink, personalLink?.id) const [isFetching, setIsFetching] = useState(false) const { me } = useAccount() const form = useForm({ resolver: zodResolver(createLinkSchema), - defaultValues: DEFAULT_FORM_VALUES + defaultValues: { + ...DEFAULT_FORM_VALUES, + isLink: true + } }) - + const selectedLink = useCoState(PersonalLink, personalLink?.id) const title = form.watch("title") const [inputValue, setInputValue] = useState("") const [originalLink, setOriginalLink] = useState("") + const [linkValidation, setLinkValidation] = useState(null) const [invalidLink, setInvalidLink] = useState(false) - const [showLinkStatus, setShowLinkStatus] = useState(false) + const [showLink, setShowLink] = useState(false) const [debouncedText, setDebouncedText] = useState("") useDebounce(() => setDebouncedText(title), 300, [title]) - const [showStatusOptions, setShowStatusOptions] = useState(false) const [selectedStatus, setSelectedStatus] = useState(null) @@ -171,21 +173,23 @@ const LinkForm = React.forwardRef(({ onSuccess, const changeInput = (e: React.ChangeEvent) => { const value = e.target.value setInputValue(value) - setShowLinkStatus(false) - setInvalidLink(false) + form.setValue("title", value) } const pressEnter = (e: React.KeyboardEvent) => { - if (e.key === "Enter") { + if (e.key === "Enter" && !showLink) { e.preventDefault() const trimmedValue = inputValue.trim().toLowerCase() if (LibIsUrl(trimmedValue)) { - form.setValue("title", trimmedValue) - setShowLinkStatus(true) + setShowLink(true) setInvalidLink(false) + setLinkValidation(trimmedValue) + setInputValue(trimmedValue) + form.setValue("title", trimmedValue) } else { setInvalidLink(true) - setShowLinkStatus(true) + setShowLink(true) + setLinkValidation(null) } } } @@ -212,10 +216,10 @@ const LinkForm = React.forwardRef(({ onSuccess, setIsFetching(false) } } - if (showLinkStatus && !invalidLink && LibIsUrl(form.getValues("title").toLowerCase())) { + if (showLink && !invalidLink && LibIsUrl(form.getValues("title").toLowerCase())) { fetchMetadata(ensureUrlProtocol(form.getValues("title").toLowerCase())) } - }, [showLinkStatus, invalidLink, form]) + }, [showLink, invalidLink, form]) const onSubmit = (values: LinkFormValues) => { if (isFetching) return @@ -279,7 +283,7 @@ const LinkForm = React.forwardRef(({ onSuccess,
- + */} (({ onSuccess, )} /> - {showLinkStatus && ( + {showLink && ( - {invalidLink ? "Allowing links only" : originalLink || ""} + {invalidLink ? "Only links are allowed" : linkValidation || originalLink || ""} )}
@@ -423,7 +427,7 @@ const LinkForm = React.forwardRef(({ onSuccess, -
diff --git a/web/components/routes/link/form/schema.ts b/web/components/routes/link/form/schema.ts index ace8a90d..1ed6b98b 100644 --- a/web/components/routes/link/form/schema.ts +++ b/web/components/routes/link/form/schema.ts @@ -1,16 +1,12 @@ import { z } from "zod" +import { isUrl } from "@/lib/utils" export const createLinkSchema = z.object({ - title: z - .string({ - message: "Please enter a valid title" - }) - .min(1, { - message: "Please enter a valid title" - }), + title: z.string().min(1, { message: "Title can't be empty" }), + originalUrl: z.string().refine(isUrl, { message: "Only links are allowed" }), description: z.string().optional(), topic: z.string().optional(), - isLink: z.boolean().default(false), + isLink: z.boolean().default(true), meta: z .object({ url: z.string(), diff --git a/web/lib/schema/personal-link.ts b/web/lib/schema/personal-link.ts index 905a09e7..2d21a646 100644 --- a/web/lib/schema/personal-link.ts +++ b/web/lib/schema/personal-link.ts @@ -17,7 +17,7 @@ export class LinkMetadata extends CoMap { export class PersonalLink extends CoMap { title = co.string slug = co.string - description = nullable(co.string) + description = co.optional.string completed = co.boolean sequence = co.number isLink = co.boolean