From 8527384479ad764991124a45d4a7fc88723002e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Tue, 6 Sep 2022 15:13:28 +0200 Subject: [PATCH] Display event previews MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- .../components/announcements/announcement.tsx | 3 +- app/soapbox/components/event-preview.tsx | 126 ++++++++++++++++++ app/soapbox/components/status.tsx | 35 ++--- 3 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 app/soapbox/components/event-preview.tsx diff --git a/app/soapbox/components/announcements/announcement.tsx b/app/soapbox/components/announcements/announcement.tsx index f6344f7b5..09767f458 100644 --- a/app/soapbox/components/announcements/announcement.tsx +++ b/app/soapbox/components/announcements/announcement.tsx @@ -38,7 +38,8 @@ const Announcement: React.FC = ({ announcement, addReaction, remo year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' - hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} + hour={skipTime ? undefined : '2-digit'} + minute={skipTime ? undefined : '2-digit'} /> {' '} - diff --git a/app/soapbox/components/event-preview.tsx b/app/soapbox/components/event-preview.tsx new file mode 100644 index 000000000..bf9ef4353 --- /dev/null +++ b/app/soapbox/components/event-preview.tsx @@ -0,0 +1,126 @@ +import React, { useCallback } from 'react'; +import { FormattedDate, FormattedMessage } from 'react-intl'; + +import { useAppSelector } from 'soapbox/hooks'; + +import Icon from './icon'; +import { Button, HStack, Stack, Text } from './ui'; +import VerificationBadge from './verification_badge'; + +import type { Account as AccountEntity, Status as StatusEntity } from 'soapbox/types/entities'; + +interface IEventPreview { + status: StatusEntity, +} + +const EventPreview: React.FC = ({ status }) => { + const me = useAppSelector((state) => state.me); + + const account = status.account as AccountEntity; + const event = status.event!; + + const banner = status.media_attachments?.find(({ description }) => description === 'Banner'); + + const renderDate = useCallback(() => { + if (!event.start_time) return null; + + const startDate = new Date(event.start_time); + + let date; + + if (event.end_time) { + const endDate = new Date(event.end_time); + + const sameDay = startDate.getDate() === endDate.getDate() && startDate.getMonth() === endDate.getMonth() && startDate.getFullYear() === endDate.getFullYear(); + + if (sameDay) { + date = ( + <> + + {' - '} + + + ); + } else { + date = ( + <> + + {' - '} + + + ); + } + } else { + date = ( + + ); + } + + return ( + + + {date} + + ); + }, [event.start_time, event.end_time]); + + return ( +
+
+ {account.id === me ? ( + + ) : event.join_state === 'accept' ? ( + + ) : ( + + )} +
+
+ {banner && {banner.url}} +
+ + {event.name} + +
+ + + + + {account.verified && } + + + + {renderDate()} + + {event.location && ( + + + + {event.location.get('name')} + + + )} +
+
+
+ ); +}; + +export default EventPreview; diff --git a/app/soapbox/components/status.tsx b/app/soapbox/components/status.tsx index dd2a15142..094e1aaed 100644 --- a/app/soapbox/components/status.tsx +++ b/app/soapbox/components/status.tsx @@ -14,6 +14,7 @@ import QuotedStatus from 'soapbox/features/status/containers/quoted_status_conta import { useAppDispatch, useSettings } from 'soapbox/hooks'; import { defaultMediaVisibility, textForScreenReader, getActualStatus } from 'soapbox/utils/status'; +import EventPreview from './event-preview'; import StatusActionBar from './status-action-bar'; import StatusMedia from './status-media'; import StatusReplyMentions from './status-reply-mentions'; @@ -360,23 +361,27 @@ const Status: React.FC = (props) => { hoverable={hoverable} /> - + {actualStatus.event ? : ( + <> + - + - {quote} + {quote} + + )} {!hideActionBar && (