Skip to content

Commit afc8f19

Browse files
committed
feat: show more and less
1 parent 0a6b7c3 commit afc8f19

File tree

1 file changed

+98
-41
lines changed

1 file changed

+98
-41
lines changed

apps/frontend/src/components/launches/calendar.tsx

Lines changed: 98 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,22 @@ export const CalendarColumn: FC<{
298298
});
299299
}, [posts, display, getDate]);
300300

301+
const [showAll, setShowAll] = useState(false);
302+
const showAllFunc = useCallback(() => {
303+
setShowAll(true);
304+
}, []);
305+
306+
const showLessFunc = useCallback(() => {
307+
setShowAll(false);
308+
}, []);
309+
310+
const list = useMemo(() => {
311+
if (showAll) {
312+
return postList;
313+
}
314+
return postList.slice(0, 3);
315+
}, [postList, showAll]);
316+
301317
const canBeTrending = useMemo(() => {
302318
return !!trendings.find((trend) => {
303319
return dayjs
@@ -404,42 +420,56 @@ export const CalendarColumn: FC<{
404420
);
405421

406422
const editPost = useCallback(
407-
(post: Post & { integration: Integration }, isDuplicate?: boolean) => async () => {
408-
if (user?.orgId === post.submittedForOrganizationId) {
409-
return previewPublication(post);
410-
}
411-
const data = await (await fetch(`/posts/${post.id}`)).json();
412-
const date = !isDuplicate ? null : (await (await fetch('/posts/find-slot')).json()).date;
413-
const publishDate = dayjs.utc(date || data.posts[0].publishDate).local();
414-
415-
const ExistingData = !isDuplicate ? ExistingDataContextProvider : Fragment;
416-
417-
modal.openModal({
418-
closeOnClickOutside: false,
419-
closeOnEscape: false,
420-
withCloseButton: false,
421-
classNames: {
422-
modal: 'w-[100%] max-w-[1400px] bg-transparent text-textColor',
423-
},
424-
children: (
425-
<ExistingData value={data}>
426-
<AddEditModal
427-
{...isDuplicate ? {onlyValues: data.posts} : {}}
428-
allIntegrations={integrations.map((p) => ({ ...p }))}
429-
reopenModal={editPost(post)}
430-
mutate={reloadCalendarView}
431-
integrations={isDuplicate ? integrations : integrations
432-
.slice(0)
433-
.filter((f) => f.id === data.integration)
434-
.map((p) => ({ ...p, picture: data.integrationPicture }))}
435-
date={publishDate}
436-
/>
437-
</ExistingData>
438-
),
439-
size: '80%',
440-
title: ``,
441-
});
442-
},
423+
(post: Post & { integration: Integration }, isDuplicate?: boolean) =>
424+
async () => {
425+
if (user?.orgId === post.submittedForOrganizationId) {
426+
return previewPublication(post);
427+
}
428+
const data = await (await fetch(`/posts/${post.id}`)).json();
429+
const date = !isDuplicate
430+
? null
431+
: (await (await fetch('/posts/find-slot')).json()).date;
432+
const publishDate = dayjs
433+
.utc(date || data.posts[0].publishDate)
434+
.local();
435+
436+
const ExistingData = !isDuplicate
437+
? ExistingDataContextProvider
438+
: Fragment;
439+
440+
modal.openModal({
441+
closeOnClickOutside: false,
442+
closeOnEscape: false,
443+
withCloseButton: false,
444+
classNames: {
445+
modal: 'w-[100%] max-w-[1400px] bg-transparent text-textColor',
446+
},
447+
children: (
448+
<ExistingData value={data}>
449+
<AddEditModal
450+
{...(isDuplicate ? { onlyValues: data.posts } : {})}
451+
allIntegrations={integrations.map((p) => ({ ...p }))}
452+
reopenModal={editPost(post)}
453+
mutate={reloadCalendarView}
454+
integrations={
455+
isDuplicate
456+
? integrations
457+
: integrations
458+
.slice(0)
459+
.filter((f) => f.id === data.integration)
460+
.map((p) => ({
461+
...p,
462+
picture: data.integrationPicture,
463+
}))
464+
}
465+
date={publishDate}
466+
/>
467+
</ExistingData>
468+
),
469+
size: '80%',
470+
title: ``,
471+
});
472+
},
443473
[integrations]
444474
);
445475

@@ -497,7 +527,7 @@ export const CalendarColumn: FC<{
497527
canBeTrending && 'bg-customColor24'
498528
)}
499529
>
500-
{postList.map((post) => (
530+
{list.map((post) => (
501531
<div
502532
key={post.id}
503533
className={clsx(
@@ -518,6 +548,22 @@ export const CalendarColumn: FC<{
518548
</div>
519549
</div>
520550
))}
551+
{!showAll && postList.length > 3 && (
552+
<div
553+
className="text-center hover:underline py-[5px]"
554+
onClick={showAllFunc}
555+
>
556+
+ Show more ({postList.length - 3})
557+
</div>
558+
)}
559+
{showAll && postList.length > 3 && (
560+
<div
561+
className="text-center hover:underline py-[5px]"
562+
onClick={showLessFunc}
563+
>
564+
- Show less
565+
</div>
566+
)}
521567
</div>
522568
{(display === 'day'
523569
? !isBeforeNow && postList.length === 0
@@ -602,7 +648,8 @@ const CalendarItem: FC<{
602648
display: 'day' | 'week' | 'month';
603649
post: Post & { integration: Integration };
604650
}> = (props) => {
605-
const { editPost, duplicatePost, post, date, isBeforeNow, state, display } = props;
651+
const { editPost, duplicatePost, post, date, isBeforeNow, state, display } =
652+
props;
606653

607654
const preview = useCallback(() => {
608655
window.open(`/p/` + post.id + '?share=true', '_blank');
@@ -626,15 +673,25 @@ const CalendarItem: FC<{
626673
style={{ opacity }}
627674
>
628675
<div className="bg-forth text-[11px] h-[15px] w-full rounded-tr-[10px] rounded-tl-[10px] flex justify-center gap-[10px] px-[5px]">
629-
<div className="hidden group-hover:block hover:underline cursor-pointer" onClick={duplicatePost}>Duplicate</div>
630-
<div className="hidden group-hover:block hover:underline cursor-pointer" onClick={preview}>Preview</div>
676+
<div
677+
className="hidden group-hover:block hover:underline cursor-pointer"
678+
onClick={duplicatePost}
679+
>
680+
Duplicate
681+
</div>
682+
<div
683+
className="hidden group-hover:block hover:underline cursor-pointer"
684+
onClick={preview}
685+
>
686+
Preview
687+
</div>
631688
</div>
632689
<div
633690
onClick={editPost}
634691
className={clsx(
635692
'gap-[5px] w-full flex h-full flex-1 rounded-br-[10px] rounded-bl-[10px] border border-seventh px-[5px] p-[2.5px]',
636693
'relative',
637-
(isBeforeNow) && '!grayscale'
694+
isBeforeNow && '!grayscale'
638695
)}
639696
>
640697
<div

0 commit comments

Comments
 (0)