From 418f3e320726d2fe0775715646e0ebb390b3c6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Mon, 27 Oct 2025 16:49:49 +0100 Subject: [PATCH] pl-fe: wip notifications sidebar panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../src/components/status-hover-card.tsx | 1 - .../src/components/statuses/status-info.tsx | 2 +- .../notifications/components/notification.tsx | 64 ++++++++++++++----- 3 files changed, 48 insertions(+), 19 deletions(-) diff --git a/packages/pl-fe/src/components/status-hover-card.tsx b/packages/pl-fe/src/components/status-hover-card.tsx index ad544e57a..cfe7c6015 100644 --- a/packages/pl-fe/src/components/status-hover-card.tsx +++ b/packages/pl-fe/src/components/status-hover-card.tsx @@ -24,7 +24,6 @@ const StatusHoverCard: React.FC = ({ visible = true }) => { const { statusId, ref } = useStatusHoverCardStore(); const { closeStatusHoverCard, updateStatusHoverCard } = useStatusHoverCardActions(); - const status = useAppSelector(state => state.statuses[statusId!]); useEffect(() => { diff --git a/packages/pl-fe/src/components/statuses/status-info.tsx b/packages/pl-fe/src/components/statuses/status-info.tsx index 02ae5f425..ba5ee1ba7 100644 --- a/packages/pl-fe/src/components/statuses/status-info.tsx +++ b/packages/pl-fe/src/components/statuses/status-info.tsx @@ -25,7 +25,7 @@ const StatusInfo = (props: IStatusInfo) => { alignItems='center' className={clsx('w-fit max-w-full cursor-default rounded-full border border-gray-200 bg-gray-100 px-3 py-1 black:border-gray-800 black:bg-gray-900 dark:border-transparent dark:bg-primary-800 rtl:space-x-reverse', className)} onClick={onClick} - style={{ marginLeft: avatarSize - 25, maxWidth: `calc(100% - ${avatarSize - 25}px)` }} + style={{ marginLeft: Math.max(0, avatarSize - 25), maxWidth: `calc(100% - ${Math.max(0, avatarSize - 25)}px)` }} title={title} > {icon} diff --git a/packages/pl-fe/src/features/notifications/components/notification.tsx b/packages/pl-fe/src/features/notifications/components/notification.tsx index 4bac0addb..1501d210d 100644 --- a/packages/pl-fe/src/features/notifications/components/notification.tsx +++ b/packages/pl-fe/src/features/notifications/components/notification.tsx @@ -1,10 +1,13 @@ -import React, { useCallback, useRef } from 'react'; +import React, { useCallback, useMemo, useRef } from 'react'; import { defineMessages, useIntl, FormattedList, FormattedMessage, IntlShape, MessageDescriptor } from 'react-intl'; import { Link, useHistory } from 'react-router-dom'; import { mentionCompose, replyCompose } from 'pl-fe/actions/compose'; +import AttachmentThumbs from 'pl-fe/components/attachment-thumbs'; import HoverAccountWrapper from 'pl-fe/components/hover-account-wrapper'; import Icon from 'pl-fe/components/icon'; +import Markup from 'pl-fe/components/markup'; +import { ParsedContent } from 'pl-fe/components/parsed-content'; import RelativeTimestamp from 'pl-fe/components/relative-timestamp'; import StatusInfo from 'pl-fe/components/statuses/status-info'; import Emoji from 'pl-fe/components/ui/emoji'; @@ -17,7 +20,7 @@ import { useAppSelector } from 'pl-fe/hooks/use-app-selector'; import { useInstance } from 'pl-fe/hooks/use-instance'; import { useLoggedIn } from 'pl-fe/hooks/use-logged-in'; import { useFavouriteStatus, useUnfavouriteStatus, useReblogStatus, useUnreblogStatus } from 'pl-fe/queries/statuses/use-status-interactions'; -import { makeGetNotification } from 'pl-fe/selectors'; +import { makeGetNotification, makeGetStatus } from 'pl-fe/selectors'; import { useModalsActions } from 'pl-fe/stores/modals'; import { useSettings } from 'pl-fe/stores/settings'; import { useStatusMetaActions } from 'pl-fe/stores/status-meta'; @@ -191,11 +194,37 @@ const buildMessage = ( const avatarSize = 48; +interface IStatusPreview { + status: StatusEntity; +} + +const StatusPreview: React.FC = ({ status }) => { + const output: Array = []; + + if (status.content) { + output.push( + + + , + ); + } + + if (status.media_attachments.length) { + output.push(); + } + + return output; +}; + interface INotification { notification: NotificationGroup; onMoveUp?: (notificationId: string) => void; onMoveDown?: (notificationId: string) => void; - onReblog?: (status: StatusEntity, e?: KeyboardEvent) => void; + compact?: boolean; } const getNotificationStatus = (n: Pick & ({ status: StatusEntity } | { })): StatusEntity | null => { @@ -206,7 +235,7 @@ const getNotificationStatus = (n: Pick & ({ status: S }; const Notification: React.FC = (props) => { - const { onMoveUp, onMoveDown } = props; + const { onMoveUp, onMoveDown, compact } = props; const dispatch = useAppDispatch(); @@ -350,7 +379,7 @@ const Notification: React.FC = (props) => { const renderContent = () => { if (type === 'bite' && status) { - return ( + return compact ? : ( = (props) => { case 'quote': case 'quoted_update': return status ? ( - - ) : null; + compact ? : ( + + )) : null; default: return null; } @@ -443,7 +473,7 @@ const Notification: React.FC = (props) => { ) ); - const statusInfo = ; + const statusInfo = ; return ( @@ -453,7 +483,7 @@ const Notification: React.FC = (props) => { aria-label={ariaLabel} ref={node} > - {!['mention', 'status'].includes(notification.type) ? ( + {compact || !['mention', 'status'].includes(notification.type) ? (
{statusInfo}