From dd7456040fb3c682794d82c79564dcf0dd614692 Mon Sep 17 00:00:00 2001 From: edwinjojie <148234464+edwinjojie@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:27:52 +0530 Subject: [PATCH 1/3] fix(share-link): enforce 250 character limit on commentary --- package-lock.json | 22 +++++++++++++++++++ .../src/components/post/write/ShareLink.tsx | 7 ++++++ 2 files changed, 29 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..34682730c1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,22 @@ +{ + "name": "daily-apps", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "daily-apps", + "dependencies": { + "postcss-rem-to-responsive-pixel": "^6.0.2" + } + }, + "node_modules/postcss-rem-to-responsive-pixel": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-rem-to-responsive-pixel/-/postcss-rem-to-responsive-pixel-6.1.0.tgz", + "integrity": "sha512-rttz/ThJWKpmhS134NcQCZQBE4CUJIAJAMx9DB0YudIeTH4fNp/hhhjxo14RnGF/OGdBpX9PQw1bnPZ56H0E1Q==", + "license": "MIT", + "engines": { + "node": ">=16.6.0" + } + } + } +} diff --git a/packages/shared/src/components/post/write/ShareLink.tsx b/packages/shared/src/components/post/write/ShareLink.tsx index f6db6f13a8..819db00b29 100644 --- a/packages/shared/src/components/post/write/ShareLink.tsx +++ b/packages/shared/src/components/post/write/ShareLink.tsx @@ -34,6 +34,8 @@ const confirmSharingAgainPrompt = { }, }; +const MAX_COMMENTARY_LENGTH = 250; + export function ShareLink({ squad, className, @@ -109,6 +111,10 @@ export function ShareLink({ return null; } + if ((commentary || '').length > MAX_COMMENTARY_LENGTH) { + return null; + } + if (!isCreatingPost) { return onUpdateSubmit(e); } @@ -169,6 +175,7 @@ export function ShareLink({ enabledCommand={{ mention: true }} showMarkdownGuide={false} onValueUpdate={setCommentary} + maxInputLength={MAX_COMMENTARY_LENGTH} /> Date: Tue, 23 Dec 2025 23:10:34 +0530 Subject: [PATCH 2/3] centralize post character limits Moves the 250-character post constraints into a shared constant to avoid duplication and keep write flows consistent. --- .../freeform/write/WriteFreeformContent.tsx | 4 +- .../src/components/post/write/ShareLink.tsx | 6 +-- packages/shared/src/constants/README.md | 38 +++++++++++++++++++ packages/shared/src/constants/post.ts | 2 + 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 packages/shared/src/constants/README.md create mode 100644 packages/shared/src/constants/post.ts diff --git a/packages/shared/src/components/post/freeform/write/WriteFreeformContent.tsx b/packages/shared/src/components/post/freeform/write/WriteFreeformContent.tsx index f2f0573ba8..fd1243d3ca 100644 --- a/packages/shared/src/components/post/freeform/write/WriteFreeformContent.tsx +++ b/packages/shared/src/components/post/freeform/write/WriteFreeformContent.tsx @@ -19,6 +19,7 @@ import type { MergedWriteObject, WriteForm } from '../../../../contexts'; import { useWritePostContext } from '../../../../contexts'; import { defaultMarkdownCommands } from '../../../../hooks/input'; import { WriteFooter } from '../../write'; +import { MAX_POST_TITLE_LENGTH } from '../../../../constants/post'; export const generateWritePostKey = (reference = 'create'): string => `write:post:${reference}`; @@ -34,7 +35,6 @@ export const checkSavedProperty = ( const defaultFilename = 'thumbnail.png'; // Shared constants - remember to update them in daily-api -const MAX_TITLE_LENGTH = 250; const MAX_CONTENT_LENGTH = 10_000; interface WriteFreeformContentProps { @@ -154,7 +154,7 @@ export function WriteFreeformContent({ required defaultValue={draft?.title ?? fetchedPost?.title} onInput={onFormUpdate} - maxLength={MAX_TITLE_LENGTH} + maxLength={MAX_POST_TITLE_LENGTH} /> MAX_COMMENTARY_LENGTH) { + if ((commentary || '').length > MAX_POST_COMMENTARY_LENGTH) { return null; } @@ -175,7 +175,7 @@ export function ShareLink({ enabledCommand={{ mention: true }} showMarkdownGuide={false} onValueUpdate={setCommentary} - maxInputLength={MAX_COMMENTARY_LENGTH} + maxInputLength={MAX_POST_COMMENTARY_LENGTH} /> +``` + +### `MAX_POST_COMMENTARY_LENGTH = 250` + +Maximum characters for link commentary/descriptions. + +**Used in:** `ShareLink.tsx` (commentary field + validation) + +```typescript +import { MAX_POST_COMMENTARY_LENGTH } from '../../../constants/post'; + +// Validation +if (commentary.length > MAX_POST_COMMENTARY_LENGTH) return null; + +// Component + +``` + +## Notes + +- **Backend sync required:** Keep these in sync with `daily-api` validation +- **Naming pattern:** `MAX_POST_[FIELD]_LENGTH` diff --git a/packages/shared/src/constants/post.ts b/packages/shared/src/constants/post.ts new file mode 100644 index 0000000000..494543ebe2 --- /dev/null +++ b/packages/shared/src/constants/post.ts @@ -0,0 +1,2 @@ +export const MAX_POST_TITLE_LENGTH = 250; +export const MAX_POST_COMMENTARY_LENGTH = 250; From 38a47453a7e6f906e6dafe371ea7a1773dec3d13 Mon Sep 17 00:00:00 2001 From: edwinjojie <148234464+edwinjojie@users.noreply.github.com> Date: Tue, 23 Dec 2025 23:38:05 +0530 Subject: [PATCH 3/3] fix(share-link): disable submit and show character limit feedback Disables the submit action when commentary exceeds the allowed character limit and adds a subtle inline hint alongside the character counter to explain the constraint to users. --- .../shared/src/components/post/write/ShareLink.tsx | 14 ++++++++++---- .../src/components/post/write/WriteFooter.tsx | 4 +++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/shared/src/components/post/write/ShareLink.tsx b/packages/shared/src/components/post/write/ShareLink.tsx index 97a0e98313..846429c059 100644 --- a/packages/shared/src/components/post/write/ShareLink.tsx +++ b/packages/shared/src/components/post/write/ShareLink.tsx @@ -77,6 +77,10 @@ export function ShareLink({ onSuccess: async () => push(squad?.permalink), }); + // Character limit state + const commentaryLength = commentary?.length ?? 0; + const isCommentaryTooLong = commentaryLength > MAX_POST_COMMENTARY_LENGTH; + const onUpdateSubmit: FormEventHandler = async (e) => { if (!fetchedPost?.id || !squad) { return null; @@ -111,10 +115,6 @@ export function ShareLink({ return null; } - if ((commentary || '').length > MAX_POST_COMMENTARY_LENGTH) { - return null; - } - if (!isCreatingPost) { return onUpdateSubmit(e); } @@ -177,8 +177,14 @@ export function ShareLink({ onValueUpdate={setCommentary} maxInputLength={MAX_POST_COMMENTARY_LENGTH} /> + {isCommentaryTooLong && ( +

+ Maximum length is {MAX_POST_COMMENTARY_LENGTH} characters +

+ )} ); diff --git a/packages/shared/src/components/post/write/WriteFooter.tsx b/packages/shared/src/components/post/write/WriteFooter.tsx index 0ace97b77e..6d8043420d 100644 --- a/packages/shared/src/components/post/write/WriteFooter.tsx +++ b/packages/shared/src/components/post/write/WriteFooter.tsx @@ -11,12 +11,14 @@ interface WriteFooterProps { isLoading?: boolean; className?: string; isPoll?: boolean; + disabled?: boolean; } export function WriteFooter({ isLoading, className, isPoll, + disabled, }: WriteFooterProps): ReactElement { const { sidebarRendered } = useSidebarRendered(); const { shouldShowCta, isEnabled, onToggle, onSubmitted } = @@ -54,7 +56,7 @@ export function WriteFooter({ 'ml-auto hidden w-full tablet:mt-0 tablet:w-32 laptop:flex', shouldShowCta && 'mt-6', )} - disabled={isLoading} + disabled={isLoading || disabled} loading={isLoading} onClick={onSubmitted} >