From a5d904eb1e415bb6af207d366e98ddab4396c929 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 18 Nov 2024 22:06:18 -0600 Subject: [PATCH 1/2] StatusContent: fix isOnlyEmoji on multiple lines --- src/components/status-content.tsx | 2 +- src/features/chats/components/chat-message.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/status-content.tsx b/src/components/status-content.tsx index 5ff45f88f..91ec91e25 100644 --- a/src/components/status-content.tsx +++ b/src/components/status-content.tsx @@ -53,7 +53,7 @@ const StatusContent: React.FC = ({ const node = useRef(null); const isOnlyEmoji = useMemo(() => { - const textContent = new DOMParser().parseFromString(status.content, 'text/html').body.firstChild?.textContent ?? ''; + const textContent = new DOMParser().parseFromString(status.content, 'text/html').body.textContent ?? ''; return Boolean(/^\p{Extended_Pictographic}+$/u.test(textContent) && (graphemesplit(textContent).length <= BIG_EMOJI_LIMIT)); }, [status.content]); diff --git a/src/features/chats/components/chat-message.tsx b/src/features/chats/components/chat-message.tsx index ad2b7694a..f26fb80cb 100644 --- a/src/features/chats/components/chat-message.tsx +++ b/src/features/chats/components/chat-message.tsx @@ -99,8 +99,8 @@ const ChatMessage = (props: IChatMessage) => { && lastReadMessageTimestamp >= new Date(chatMessage.created_at); const isOnlyEmoji = useMemo(() => { - const textContent = new DOMParser().parseFromString(content, 'text/html').body.firstChild?.textContent; - return Boolean(textContent && /^\p{Extended_Pictographic}+$/u.test(textContent) && (graphemesplit(textContent).length <= BIG_EMOJI_LIMIT)); + const textContent = new DOMParser().parseFromString(content, 'text/html').body.textContent ?? ''; + return Boolean(/^\p{Extended_Pictographic}+$/u.test(textContent) && (graphemesplit(textContent).length <= BIG_EMOJI_LIMIT)); }, [content]); const emojiReactionRows = useMemo(() => { From 4024151f6ba725df26061317908b116f661118e4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 18 Nov 2024 22:39:23 -0600 Subject: [PATCH 2/2] Replace some usages of lodash --- src/build-config-compiletime.ts | 7 ++----- src/features/emoji/search.test.ts | 3 +-- .../report/components/status-check-box.tsx | 3 +-- src/features/ui/components/poll-preview.tsx | 4 +--- src/normalizers/soapbox/soapbox-config.ts | 3 +-- src/queries/chats.test.ts | 19 ++++++++++++------- src/queries/chats.ts | 9 ++++----- src/utils/chats.ts | 3 +-- src/utils/config-db.ts | 3 +-- 9 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/build-config-compiletime.ts b/src/build-config-compiletime.ts index 8c74312b2..c588a7ac3 100644 --- a/src/build-config-compiletime.ts +++ b/src/build-config-compiletime.ts @@ -3,9 +3,6 @@ * @module soapbox/build-config */ -// eslint-disable-next-line import/extensions -import trimEnd from 'lodash/trimEnd.js'; - const { NODE_ENV, BACKEND_URL, @@ -13,9 +10,9 @@ const { SENTRY_DSN, } = process.env; -const sanitizeURL = (url: string | undefined = ''): string => { +const sanitizeURL = (url: string = ''): string => { try { - return trimEnd(new URL(url).toString(), '/'); + return new URL(url).href; } catch { return ''; } diff --git a/src/features/emoji/search.test.ts b/src/features/emoji/search.test.ts index 4d2982e5a..e37ac4a6e 100644 --- a/src/features/emoji/search.test.ts +++ b/src/features/emoji/search.test.ts @@ -1,9 +1,8 @@ -import pick from 'lodash/pick'; import { describe, expect, it } from 'vitest'; import search, { addCustomToPool } from './search.ts'; -const trimEmojis = (emoji: any) => pick(emoji, ['id', 'unified', 'native', 'custom']); +const trimEmojis = ({ id, unified, native, custom }: any) => ({ id, unified, native, custom }); describe('emoji_index', () => { it('should give same result for emoji_index_light and emoji-mart', () => { diff --git a/src/features/report/components/status-check-box.tsx b/src/features/report/components/status-check-box.tsx index 588545742..149a5b352 100644 --- a/src/features/report/components/status-check-box.tsx +++ b/src/features/report/components/status-check-box.tsx @@ -1,5 +1,4 @@ import clsx from 'clsx'; -import noop from 'lodash/noop'; import { Suspense } from 'react'; import { toggleStatusReport } from 'soapbox/actions/reports.ts'; @@ -66,7 +65,7 @@ const StatusCheckBox: React.FC = ({ id, disabled }) => { media={status.media_attachments} sensitive={status.sensitive} height={110} - onOpenMedia={noop} + onOpenMedia={() => {}} /> ); } diff --git a/src/features/ui/components/poll-preview.tsx b/src/features/ui/components/poll-preview.tsx index 4fb80a8e0..9932a37fa 100644 --- a/src/features/ui/components/poll-preview.tsx +++ b/src/features/ui/components/poll-preview.tsx @@ -1,5 +1,3 @@ -import noop from 'lodash/noop'; - import PollOption from 'soapbox/components/polls/poll-option.tsx'; import Stack from 'soapbox/components/ui/stack.tsx'; import { useAppSelector } from 'soapbox/hooks/useAppSelector.ts'; @@ -26,7 +24,7 @@ const PollPreview: React.FC = ({ pollId }) => { index={i} showResults={false} active={false} - onToggle={noop} + onToggle={() => {}} /> ))} diff --git a/src/normalizers/soapbox/soapbox-config.ts b/src/normalizers/soapbox/soapbox-config.ts index 167803d32..279b88329 100644 --- a/src/normalizers/soapbox/soapbox-config.ts +++ b/src/normalizers/soapbox/soapbox-config.ts @@ -4,7 +4,6 @@ import { Record as ImmutableRecord, fromJS, } from 'immutable'; -import trimStart from 'lodash/trimStart'; import { normalizeUsername } from 'soapbox/utils/input.ts'; import { toTailwind } from 'soapbox/utils/tailwind.ts'; @@ -123,7 +122,7 @@ type SoapboxConfigMap = ImmutableMap; const normalizeCryptoAddress = (address: unknown): CryptoAddress => { return CryptoAddressRecord(ImmutableMap(fromJS(address))).update('ticker', ticker => { - return trimStart(ticker, '$').toLowerCase(); + return ticker.replace(/^\$/, '').toLowerCase(); }); }; diff --git a/src/queries/chats.test.ts b/src/queries/chats.test.ts index e43bd8781..7d325917b 100644 --- a/src/queries/chats.test.ts +++ b/src/queries/chats.test.ts @@ -1,5 +1,4 @@ import { Map as ImmutableMap } from 'immutable'; -import sumBy from 'lodash/sumBy'; import { useEffect } from 'react'; import { beforeEach, describe, expect, it } from 'vitest'; @@ -79,8 +78,9 @@ describe('isLastMessage', () => { ], pageParams: [undefined], }; - const initialFlattenedData = flattenPages(initialQueryData); - expect(sumBy(initialFlattenedData, (chat: IChat) => chat.unread)).toBe(0); + const initialFlattenedData = flattenPages(initialQueryData); + const count = initialFlattenedData!.reduce((n, chat) => n + chat.unread, 0); + expect(count).toBe(0); queryClient.setQueryData(ChatKeys.chatSearch(), initialQueryData); @@ -99,7 +99,8 @@ describe('isLastMessage', () => { pageParams: [undefined], }; const initialFlattenedData = flattenPages(initialQueryData); - expect(sumBy(initialFlattenedData, (chat: IChat) => chat.unread)).toBe(0); + const count = initialFlattenedData!.reduce((n, chat) => n + chat.unread, 0); + expect(count).toBe(0); queryClient.setQueryData(ChatKeys.chatSearch(), initialQueryData); @@ -297,7 +298,9 @@ describe('useChatActions', () => { pageParams: [undefined], }; const initialFlattenedData = flattenPages(initialQueryData); - expect(sumBy(initialFlattenedData, (chat: IChat) => chat.unread)).toBe(0); + const count = initialFlattenedData!.reduce((n, chat) => n + chat.unread, 0); + + expect(count).toBe(0); queryClient.setQueryData(ChatKeys.chatSearch(), initialQueryData); @@ -308,8 +311,10 @@ describe('useChatActions', () => { }); const nextQueryData = queryClient.getQueryData(ChatKeys.chatSearch()); - const nextFlattenedData = flattenPages(nextQueryData as any); - expect(sumBy(nextFlattenedData as any, (chat: IChat) => chat.unread)).toBe(nextUnreadCount); + const nextFlattenedData = flattenPages(nextQueryData as any); + const nextCount = nextFlattenedData!.reduce((n, chat) => n + chat.unread, 0); + + expect(nextCount).toBe(nextUnreadCount); }); }); diff --git a/src/queries/chats.ts b/src/queries/chats.ts index f353da79e..5461c1a8b 100644 --- a/src/queries/chats.ts +++ b/src/queries/chats.ts @@ -1,5 +1,4 @@ import { InfiniteData, keepPreviousData, useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query'; -import sumBy from 'lodash/sumBy'; import { importFetchedAccount, importFetchedAccounts } from 'soapbox/actions/importer/index.ts'; import { ChatWidgetScreens, useChatContext } from 'soapbox/contexts/chat-context.tsx'; @@ -146,7 +145,7 @@ const useChats = (search?: string) => { const { next } = response.pagination(); const hasMore = !!next; - setUnreadChatsCount(Number(response.headers.get('x-unread-messages-count')) || sumBy(data, (chat) => chat.unread)); + setUnreadChatsCount(Number(response.headers.get('x-unread-messages-count')) || data.reduce((n, chat) => n + chat.unread, 0)); // Set the relationships to these users in the redux store. fetchRelationships.mutate({ accountIds: data.map((item) => item.account.id) }); @@ -225,17 +224,17 @@ const useChatActions = (chatId: string) => { .then(async (response) => { const data = await response.json(); updatePageItem(ChatKeys.chatSearch(), data, (o, n) => o.id === n.id); - const queryData = queryClient.getQueryData>>(ChatKeys.chatSearch()); + const queryData = queryClient.getQueryData>>(ChatKeys.chatSearch()); if (queryData) { - const flattenedQueryData: any = flattenPages(queryData)?.map((chat: any) => { + const flattenedQueryData = flattenPages(queryData)?.map((chat: any) => { if (chat.id === data.id) { return data; } else { return chat; } }); - setUnreadChatsCount(sumBy(flattenedQueryData, (chat: IChat) => chat.unread)); + setUnreadChatsCount(flattenedQueryData?.reduce((n, chat) => n + chat.unread, 0)); } return data; diff --git a/src/utils/chats.ts b/src/utils/chats.ts index 53a60be7d..29cd7ec0f 100644 --- a/src/utils/chats.ts +++ b/src/utils/chats.ts @@ -1,5 +1,4 @@ import { InfiniteData } from '@tanstack/react-query'; -import sumBy from 'lodash/sumBy'; import { normalizeChatMessage } from 'soapbox/normalizers/index.ts'; import { ChatKeys } from 'soapbox/queries/chats.ts'; @@ -83,7 +82,7 @@ const getUnreadChatsCount = (): number => { queryClient.getQueryData>>(ChatKeys.chatSearch()), ); - return sumBy(chats, chat => chat.unread); + return chats?.reduce((acc, chat) => acc + chat.unread, 0) ?? 0; }; /** Update the query cache for an individual Chat Message */ diff --git a/src/utils/config-db.ts b/src/utils/config-db.ts index cbea280e1..e5421766f 100644 --- a/src/utils/config-db.ts +++ b/src/utils/config-db.ts @@ -4,7 +4,6 @@ import { Set as ImmutableSet, fromJS, } from 'immutable'; -import trimStart from 'lodash/trimStart'; import { type MRFSimple, mrfSimpleSchema } from 'soapbox/schemas/pleroma.ts'; @@ -27,7 +26,7 @@ const toSimplePolicy = (configs: ImmutableList): MRFSimple => { const reducer = (acc: ImmutableMap, curr: ImmutableMap) => { const key = curr.getIn(['tuple', 0]) as string; const hosts = curr.getIn(['tuple', 1]) as ImmutableList; - return acc.set(trimStart(key, ':'), ImmutableSet(hosts)); + return acc.set(key.replace(/^:/, ''), ImmutableSet(hosts)); }; if (config?.get) {