diff --git a/test/automated/browser/cypress/e2e/offline/00_offline_performance.cy.js b/test/automated/browser/cypress/e2e/offline/00_offline_performance.cy.js index cc233a8ac3..2771e8136b 100644 --- a/test/automated/browser/cypress/e2e/offline/00_offline_performance.cy.js +++ b/test/automated/browser/cypress/e2e/offline/00_offline_performance.cy.js @@ -6,7 +6,7 @@ describe('Lighthouse Metrics', () => { it('Capture Metrics', () => { cy.lighthouse({ accessibility: 97, - 'best-practices': 97, + 'best-practices': 90, seo: 90, performance: 60, // Once the performance issues are fixed revert this 90, }); diff --git a/web/components/admin/EditInstanceDetails2.tsx b/web/components/admin/EditInstanceDetails2.tsx index 74103e7893..87c42b3161 100644 --- a/web/components/admin/EditInstanceDetails2.tsx +++ b/web/components/admin/EditInstanceDetails2.tsx @@ -1,7 +1,6 @@ import React, { useState, useContext, useEffect } from 'react'; -import { Button, Collapse, Typography } from 'antd'; +import { Button, Collapse, Typography, Tooltip } from 'antd'; import { CopyOutlined, RedoOutlined } from '@ant-design/icons'; -import dynamic from 'next/dynamic'; import { TEXTFIELD_TYPE_NUMBER, TEXTFIELD_TYPE_PASSWORD, TEXTFIELD_TYPE_URL } from './TextField'; import { TextFieldWithSubmit } from './TextFieldWithSubmit'; import { ServerStatusContext } from '../../utils/server-status-context'; @@ -18,10 +17,6 @@ import { ResetYP } from './ResetYP'; // Lazy loaded components -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - const { Panel } = Collapse; // eslint-disable-next-line react/function-component-definition diff --git a/web/components/admin/MainLayout.tsx b/web/components/admin/MainLayout.tsx index c34e6af648..1924193fc0 100644 --- a/web/components/admin/MainLayout.tsx +++ b/web/components/admin/MainLayout.tsx @@ -4,7 +4,7 @@ import Link from 'next/link'; import Head from 'next/head'; import { differenceInSeconds } from 'date-fns'; import { useRouter } from 'next/router'; -import { Layout, Menu, Alert, Button, Space } from 'antd'; +import { Layout, Menu, Alert, Button, Space, Tooltip } from 'antd'; import { SettingOutlined, HomeOutlined, @@ -19,7 +19,6 @@ import { } from '@ant-design/icons'; import classNames from 'classnames'; -import dynamic from 'next/dynamic'; import { upgradeVersionAvailable } from '../../utils/apis'; import { parseSecondsToDurationString } from '../../utils/format'; @@ -34,12 +33,6 @@ import { UpdateArgs } from '../../types/config-section'; import FediverseIcon from '../../assets/images/fediverse-black.png'; -// Lazy loaded components - -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - export type MainLayoutProps = { children: ReactNode; }; diff --git a/web/components/admin/MessageVisiblityToggle.tsx b/web/components/admin/MessageVisiblityToggle.tsx index 4ed1c697f8..e26e6ecb19 100644 --- a/web/components/admin/MessageVisiblityToggle.tsx +++ b/web/components/admin/MessageVisiblityToggle.tsx @@ -1,23 +1,16 @@ // Custom component for AntDesign Button that makes an api call, then displays a confirmation icon upon import React, { useState, useEffect, FC } from 'react'; -import { Button } from 'antd'; +import { Button, Tooltip } from 'antd'; import { EyeOutlined, EyeInvisibleOutlined, CheckCircleFilled, ExclamationCircleFilled, } from '@ant-design/icons'; -import dynamic from 'next/dynamic'; import { fetchData, UPDATE_CHAT_MESSGAE_VIZ } from '../../utils/apis'; import { MessageType } from '../../types/chat'; import { isEmptyObject } from '../../utils/format'; -// Lazy loaded components - -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - export type MessageToggleProps = { isVisible: boolean; message: MessageType; diff --git a/web/components/admin/UserPopover.tsx b/web/components/admin/UserPopover.tsx index 673888865b..a2ad3150bc 100644 --- a/web/components/admin/UserPopover.tsx +++ b/web/components/admin/UserPopover.tsx @@ -1,12 +1,11 @@ // This displays a clickable user name (or whatever children element you provide), and displays a simple tooltip of created time. OnClick a modal with more information about the user is displayed. import { useState, ReactNode, FC } from 'react'; -import { Divider, Modal, Typography, Row, Col, Space } from 'antd'; +import { Divider, Modal, Typography, Row, Col, Space, Tooltip } from 'antd'; import formatDistanceToNow from 'date-fns/formatDistanceToNow'; import format from 'date-fns/format'; import { uniq } from 'lodash'; -import dynamic from 'next/dynamic'; import { BanUserButton } from './BanUserButton'; import { ModeratorUserButton } from './ModeratorUserButton'; @@ -14,12 +13,6 @@ import { User, UserConnectionInfo } from '../../types/chat'; import { formatDisplayDate } from './UserTable'; import { formatUAstring } from '../../utils/format'; -// Lazy loaded components - -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - export type UserPopoverProps = { user: User; connectionInfo?: UserConnectionInfo | null; diff --git a/web/components/chat/ChatSocialMessage/ChatSocialMessage.tsx b/web/components/chat/ChatSocialMessage/ChatSocialMessage.tsx index 049492e691..5378fecda0 100644 --- a/web/components/chat/ChatSocialMessage/ChatSocialMessage.tsx +++ b/web/components/chat/ChatSocialMessage/ChatSocialMessage.tsx @@ -5,9 +5,15 @@ import cn from 'classnames'; import { ChatSocialMessage as ChatMessage } from '../../../interfaces/chat-social-message.model'; import styles from './ChatSocialMessage.module.scss'; -const FollowIcon = dynamic(() => import('./follow.svg')); -const LikeIcon = dynamic(() => import('./like.svg')); -const RepostIcon = dynamic(() => import('./repost.svg')); +const FollowIcon = dynamic(() => import('./follow.svg'), { + ssr: false, +}); +const LikeIcon = dynamic(() => import('./like.svg'), { + ssr: false, +}); +const RepostIcon = dynamic(() => import('./repost.svg'), { + ssr: false, +}); export interface ChatSocialMessageProps { message: ChatMessage; diff --git a/web/components/chat/ChatTextField/ChatTextField.tsx b/web/components/chat/ChatTextField/ChatTextField.tsx index 8566a691af..0a31bb040f 100644 --- a/web/components/chat/ChatTextField/ChatTextField.tsx +++ b/web/components/chat/ChatTextField/ChatTextField.tsx @@ -13,7 +13,9 @@ import styles from './ChatTextField.module.scss'; // Lazy loaded components -const EmojiPicker = dynamic(() => import('./EmojiPicker').then(mod => mod.EmojiPicker)); +const EmojiPicker = dynamic(() => import('./EmojiPicker').then(mod => mod.EmojiPicker), { + ssr: false, +}); type CustomElement = { type: 'paragraph' | 'span'; children: CustomText[] } | ImageNode; type CustomText = { text: string }; diff --git a/web/components/chat/ChatUserMessage/ChatUserMessage.tsx b/web/components/chat/ChatUserMessage/ChatUserMessage.tsx index e4f3585ba6..6cb1747bc9 100644 --- a/web/components/chat/ChatUserMessage/ChatUserMessage.tsx +++ b/web/components/chat/ChatUserMessage/ChatUserMessage.tsx @@ -2,6 +2,7 @@ import { FC, ReactNode, useEffect, useState } from 'react'; import cn from 'classnames'; import { LinkOutlined } from '@ant-design/icons'; +import { Tooltip } from 'antd'; import { useRecoilValue } from 'recoil'; import dynamic from 'next/dynamic'; import { decodeHTML } from 'entities'; @@ -14,17 +15,19 @@ import { User } from '../../../interfaces/user.model'; // Lazy loaded components -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - -const ChatModerationActionMenu = dynamic(() => - import('../ChatModerationActionMenu/ChatModerationActionMenu').then( - mod => mod.ChatModerationActionMenu, - ), +const ChatModerationActionMenu = dynamic( + () => + import('../ChatModerationActionMenu/ChatModerationActionMenu').then( + mod => mod.ChatModerationActionMenu, + ), + { + ssr: false, + }, ); -const Highlight = dynamic(() => import('react-highlighter-ts').then(mod => mod.Highlight)); +const Highlight = dynamic(() => import('react-highlighter-ts').then(mod => mod.Highlight), { + ssr: false, +}); export type ChatUserMessageProps = { message: ChatMessage; diff --git a/web/components/common/UserDropdown/UserDropdown.tsx b/web/components/common/UserDropdown/UserDropdown.tsx index f1aec9b860..1ed7a038a3 100644 --- a/web/components/common/UserDropdown/UserDropdown.tsx +++ b/web/components/common/UserDropdown/UserDropdown.tsx @@ -19,14 +19,22 @@ import styles from './UserDropdown.module.scss'; import { AppStateOptions } from '../../stores/application-state'; // Lazy loaded components -const Modal = dynamic(() => import('../../ui/Modal/Modal').then(mod => mod.Modal)); +const Modal = dynamic(() => import('../../ui/Modal/Modal').then(mod => mod.Modal), { + ssr: false, +}); -const NameChangeModal = dynamic(() => - import('../../modals/NameChangeModal/NameChangeModal').then(mod => mod.NameChangeModal), +const NameChangeModal = dynamic( + () => import('../../modals/NameChangeModal/NameChangeModal').then(mod => mod.NameChangeModal), + { + ssr: false, + }, ); -const AuthModal = dynamic(() => - import('../../modals/AuthModal/AuthModal').then(mod => mod.AuthModal), +const AuthModal = dynamic( + () => import('../../modals/AuthModal/AuthModal').then(mod => mod.AuthModal), + { + ssr: false, + }, ); export type UserDropdownProps = { @@ -58,9 +66,6 @@ export const UserDropdown: FC = ({ username: defaultUsername ); const currentUser = useRecoilValue(currentUserAtom); - if (!currentUser) { - return null; - } const { displayName } = currentUser; const username = defaultUsername || displayName; diff --git a/web/components/layouts/Main.tsx b/web/components/layouts/Main.tsx index e79a4f8b65..d0e4c80fbf 100644 --- a/web/components/layouts/Main.tsx +++ b/web/components/layouts/Main.tsx @@ -17,28 +17,12 @@ import { DisplayableError } from '../../types/displayable-error'; import setupNoLinkReferrer from '../../utils/no-link-referrer'; import { ServerRenderedHydration } from '../ServerRendered/ServerRenderedHydration'; import { Content } from '../ui/Content/Content'; - +import { TitleNotifier } from '../TitleNotifier/TitleNotifier'; +import { PushNotificationServiceWorker } from '../workers/PushNotificationServiceWorker/PushNotificationServiceWorker'; import { Theme } from '../theme/Theme'; // Lazy loaded components -const TitleNotifier = dynamic( - () => import('../TitleNotifier/TitleNotifier').then(mod => mod.TitleNotifier), - { - ssr: false, - }, -); - -const PushNotificationServiceWorker = dynamic( - () => - import('../workers/PushNotificationServiceWorker/PushNotificationServiceWorker').then( - mod => mod.PushNotificationServiceWorker, - ), - { - ssr: false, - }, -); - const FatalErrorStateModal = dynamic( () => import('../modals/FatalErrorStateModal/FatalErrorStateModal').then( diff --git a/web/components/stores/ClientConfigStore.tsx b/web/components/stores/ClientConfigStore.tsx index c8094145e9..d073352bf8 100644 --- a/web/components/stores/ClientConfigStore.tsx +++ b/web/components/stores/ClientConfigStore.tsx @@ -388,11 +388,9 @@ export const ClientConfigStore: FC = () => { }, []); useEffect(() => { - if (!accessToken) { - return; + if (accessToken) { + getChatHistory(); } - - getChatHistory(); }, [accessToken]); useEffect(() => { diff --git a/web/components/ui/Content/Content.tsx b/web/components/ui/Content/Content.tsx index d2d9dc2004..5155583985 100644 --- a/web/components/ui/Content/Content.tsx +++ b/web/components/ui/Content/Content.tsx @@ -149,7 +149,7 @@ const MobileContent = ({ supportsBrowserNotifications, }) => { if (!currentUser) { - return null; + return ; } const { id, displayName } = currentUser; diff --git a/web/components/ui/Header/Header.tsx b/web/components/ui/Header/Header.tsx index 60bfdf8f15..9d57a20a80 100644 --- a/web/components/ui/Header/Header.tsx +++ b/web/components/ui/Header/Header.tsx @@ -1,4 +1,4 @@ -import { Tag } from 'antd'; +import { Tag, Tooltip } from 'antd'; import { FC } from 'react'; import cn from 'classnames'; import dynamic from 'next/dynamic'; @@ -7,14 +7,13 @@ import styles from './Header.module.scss'; // Lazy loaded components -const UserDropdown = dynamic(() => - import('../../common/UserDropdown/UserDropdown').then(mod => mod.UserDropdown), +const UserDropdown = dynamic( + () => import('../../common/UserDropdown/UserDropdown').then(mod => mod.UserDropdown), + { + ssr: false, + }, ); -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - export type HeaderComponentProps = { name: string; chatAvailable: boolean; diff --git a/web/components/ui/Sidebar/Sidebar.tsx b/web/components/ui/Sidebar/Sidebar.tsx index 952c6b9126..68971a8abb 100644 --- a/web/components/ui/Sidebar/Sidebar.tsx +++ b/web/components/ui/Sidebar/Sidebar.tsx @@ -8,16 +8,18 @@ import styles from './Sidebar.module.scss'; import { currentUserAtom, visibleChatMessagesSelector } from '../../stores/ClientConfigStore'; // Lazy loaded components -const ChatContainer = dynamic(() => - import('../../chat/ChatContainer/ChatContainer').then(mod => mod.ChatContainer), +const ChatContainer = dynamic( + () => import('../../chat/ChatContainer/ChatContainer').then(mod => mod.ChatContainer), + { + ssr: false, + }, ); export const Sidebar: FC = () => { const currentUser = useRecoilValue(currentUserAtom); const messages = useRecoilValue(visibleChatMessagesSelector); - if (!currentUser) { - return null; + return ; } const { id, isModerator, displayName } = currentUser; diff --git a/web/pages/admin/access-tokens.tsx b/web/pages/admin/access-tokens.tsx index 473e851185..2973bc5b83 100644 --- a/web/pages/admin/access-tokens.tsx +++ b/web/pages/admin/access-tokens.tsx @@ -1,10 +1,21 @@ import React, { useState, useEffect } from 'react'; -import { Table, Tag, Space, Button, Modal, Checkbox, Input, Typography, Row, Col } from 'antd'; +import { + Table, + Tag, + Space, + Button, + Modal, + Checkbox, + Input, + Typography, + Row, + Col, + Tooltip, +} from 'antd'; import { DeleteOutlined } from '@ant-design/icons'; import format from 'date-fns/format'; -import dynamic from 'next/dynamic'; import { fetchData, ACCESS_TOKENS, @@ -14,12 +25,6 @@ import { const { Title, Paragraph } = Typography; -// Lazy loaded components - -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - const availableScopes = { CAN_SEND_SYSTEM_MESSAGES: { name: 'System messages', diff --git a/web/pages/admin/webhooks.tsx b/web/pages/admin/webhooks.tsx index 022b0435ef..e07621fd96 100644 --- a/web/pages/admin/webhooks.tsx +++ b/web/pages/admin/webhooks.tsx @@ -1,17 +1,22 @@ /* eslint-disable react/destructuring-assignment */ import { DeleteOutlined } from '@ant-design/icons'; -import { Button, Checkbox, Col, Input, Modal, Row, Space, Table, Tag, Typography } from 'antd'; -import dynamic from 'next/dynamic'; +import { + Button, + Checkbox, + Col, + Input, + Modal, + Row, + Space, + Table, + Tag, + Typography, + Tooltip, +} from 'antd'; import React, { useEffect, useState } from 'react'; import { CREATE_WEBHOOK, DELETE_WEBHOOK, fetchData, WEBHOOKS } from '../../utils/apis'; import { isValidUrl, DEFAULT_TEXTFIELD_URL_PATTERN } from '../../utils/urls'; -// Lazy loaded components - -const Tooltip = dynamic(() => import('antd').then(mod => mod.Tooltip), { - ssr: false, -}); - const { Title, Paragraph } = Typography; const availableEvents = {