diff --git a/webapp/channels/src/components/custom_status/custom_status_modal.tsx b/webapp/channels/src/components/custom_status/custom_status_modal.tsx index 576c832972..69fcbd5cb2 100644 --- a/webapp/channels/src/components/custom_status/custom_status_modal.tsx +++ b/webapp/channels/src/components/custom_status/custom_status_modal.tsx @@ -5,7 +5,8 @@ import classNames from 'classnames'; import type {Moment} from 'moment-timezone'; import moment from 'moment-timezone'; import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; -import {FormattedMessage, useIntl} from 'react-intl'; +import type {MessageDescriptor} from 'react-intl'; +import {FormattedMessage, defineMessage, useIntl} from 'react-intl'; import {useDispatch, useSelector} from 'react-redux'; import {useRouteMatch} from 'react-router-dom'; @@ -33,10 +34,8 @@ import EmojiIcon from 'components/widgets/icons/emoji_icon'; import {A11yCustomEventTypes, Constants, ModalIdentifiers} from 'utils/constants'; import type {A11yFocusEventDetail} from 'utils/constants'; -import {t} from 'utils/i18n'; import {isKeyPressed} from 'utils/keyboard'; import {getCurrentMomentForTimezone} from 'utils/timezone'; -import {localizeMessage} from 'utils/utils'; import type {GlobalState} from 'types/store'; @@ -54,8 +53,7 @@ const EMOJI_PICKER_WIDTH_OFFSET = 308; type DefaultUserCustomStatus = { emoji: string; - message: string; - messageDefault: string; + message: MessageDescriptor; duration: CustomStatusDuration; }; @@ -73,32 +71,42 @@ const { const defaultCustomStatusSuggestions: DefaultUserCustomStatus[] = [ { emoji: 'calendar', - message: t('custom_status.suggestions.in_a_meeting'), - messageDefault: 'In a meeting', + message: defineMessage({ + id: 'custom_status.suggestions.in_a_meeting', + defaultMessage: 'In a meeting', + }), duration: ONE_HOUR, }, { emoji: 'hamburger', - message: t('custom_status.suggestions.out_for_lunch'), - messageDefault: 'Out for lunch', + message: defineMessage({ + id: 'custom_status.suggestions.out_for_lunch', + defaultMessage: 'Out for lunch', + }), duration: THIRTY_MINUTES, }, { emoji: 'sneezing_face', - message: t('custom_status.suggestions.out_sick'), - messageDefault: 'Out sick', + message: defineMessage({ + id: 'custom_status.suggestions.out_sick', + defaultMessage: 'Out sick', + }), duration: TODAY, }, { emoji: 'house', - message: t('custom_status.suggestions.working_from_home'), - messageDefault: 'Working from home', + message: defineMessage({ + id: 'custom_status.suggestions.working_from_home', + defaultMessage: 'Working from home', + }), duration: TODAY, }, { emoji: 'palm_tree', - message: t('custom_status.suggestions.on_a_vacation'), - messageDefault: 'On a vacation', + message: defineMessage({ + id: 'custom_status.suggestions.on_a_vacation', + defaultMessage: 'On a vacation', + }), duration: THIS_WEEK, }, ]; @@ -320,7 +328,7 @@ const CustomStatusModal: React.FC = (props: Props) => { const customStatusSuggestions = defaultCustomStatusSuggestions. map((status) => ({ emoji: status.emoji, - text: formatMessage({id: status.message, defaultMessage: status.messageDefault}), + text: formatMessage(status.message), duration: status.duration, })). filter((status: UserCustomStatus) => !recentCustomStatusTexts.includes(status.text)). @@ -399,7 +407,7 @@ const CustomStatusModal: React.FC = (props: Props) => { handleEnterKeyPress={handleSetStatus} handleCancel={handleClearStatus} confirmButtonClassName='btn btn-primary' - ariaLabel={localizeMessage('custom_status.set_status', 'Set a status')} + ariaLabel={formatMessage({id: 'custom_status.set_status', defaultMessage: 'Set a status'})} keyboardEscape={false} tabIndex={-1} > diff --git a/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx b/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx index 655de7b390..e40d761827 100644 --- a/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx +++ b/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx @@ -5,7 +5,7 @@ import React from 'react'; import type {ReactNode} from 'react'; -import {FormattedMessage} from 'react-intl'; +import {FormattedMessage, defineMessages} from 'react-intl'; import type {PreferenceType} from '@mattermost/types/preferences'; import type {UserProfile} from '@mattermost/types/users'; @@ -19,7 +19,6 @@ import SettingItem from 'components/setting_item'; import SettingItemMax from 'components/setting_item_max'; import Constants, {AdvancedSections, Preferences} from 'utils/constants'; -import {t} from 'utils/i18n'; import {isMac} from 'utils/user_agent'; import {a11yFocus, localizeMessage} from 'utils/utils'; @@ -224,26 +223,26 @@ export default class AdvancedSettingsDisplay extends React.PureComponent { - const description = { + const description = defineMessages({ default: { - id: t('user.settings.advance.sendDesc'), + id: 'user.settings.advance.sendDesc', defaultMessage: 'When enabled, CTRL + ENTER will send the message and ENTER inserts a new line.', }, mac: { - id: t('user.settings.advance.sendDesc.mac'), + id: 'user.settings.advance.sendDesc.mac', defaultMessage: 'When enabled, ⌘ + ENTER will send the message and ENTER inserts a new line.', }, - }; - const title = { + }); + const title = defineMessages({ default: { - id: t('user.settings.advance.sendTitle'), + id: 'user.settings.advance.sendTitle', defaultMessage: 'Send Messages on CTRL+ENTER', }, mac: { - id: t('user.settings.advance.sendTitle.mac'), + id: 'user.settings.advance.sendTitle.mac', defaultMessage: 'Send Messages on ⌘+ENTER', }, - }; + }); if (isMac()) { return { ctrlSendTitle: title.mac, diff --git a/webapp/channels/src/components/user_settings/display/__snapshots__/user_settings_display.test.tsx.snap b/webapp/channels/src/components/user_settings/display/__snapshots__/user_settings_display.test.tsx.snap index 4f462276a8..b51ddfe0c2 100644 --- a/webapp/channels/src/components/user_settings/display/__snapshots__/user_settings_display.test.tsx.snap +++ b/webapp/channels/src/components/user_settings/display/__snapshots__/user_settings_display.test.tsx.snap @@ -1237,7 +1237,7 @@ exports[`components/user_settings/display/UserSettingsDisplay should match snaps type="radio" /> @@ -1255,7 +1255,7 @@ exports[`components/user_settings/display/UserSettingsDisplay should match snaps type="radio" /> diff --git a/webapp/channels/src/components/user_settings/display/user_settings_display.tsx b/webapp/channels/src/components/user_settings/display/user_settings_display.tsx index 38bdaca613..2df86c35db 100644 --- a/webapp/channels/src/components/user_settings/display/user_settings_display.tsx +++ b/webapp/channels/src/components/user_settings/display/user_settings_display.tsx @@ -4,9 +4,9 @@ /* eslint-disable max-lines */ import deepEqual from 'fast-deep-equal'; -import type {PrimitiveType, FormatXMLElementFn} from 'intl-messageformat'; import React from 'react'; -import {FormattedMessage} from 'react-intl'; +import type {MessageDescriptor} from 'react-intl'; +import {FormattedMessage, defineMessage} from 'react-intl'; import type {Timezone} from 'timezones.json'; import type {PreferenceType} from '@mattermost/types/preferences'; @@ -23,7 +23,6 @@ import ThemeSetting from 'components/user_settings/display/user_settings_theme'; import type {Language} from 'i18n/i18n'; import {getLanguageInfo} from 'i18n/i18n'; import Constants from 'utils/constants'; -import {t} from 'utils/i18n'; import {getBrowserTimezone} from 'utils/timezone'; import {a11yFocus} from 'utils/utils'; @@ -53,21 +52,17 @@ function getDisplayStateFromProps(props: Props) { } type ChildOption = { - id: string; - message: string; + label: MessageDescriptor; value: string; display: string; - moreId: string; - moreMessage: string; + more: MessageDescriptor; }; type Option = { value: string; radionButtonText: { - id: string; - message: string; - moreId?: string; - moreMessage?: string; + label: MessageDescriptor; + more?: MessageDescriptor; }; childOption?: ChildOption; } @@ -77,18 +72,11 @@ type SectionProps ={ display: string; defaultDisplay: string; value: string; - title: { - id: string; - message: string; - }; + title: MessageDescriptor; firstOption: Option; secondOption: Option; thirdOption?: Option; - description: { - id: string; - message: string; - values?: Record>; - }; + description: MessageDescriptor; disabled?: boolean; onSubmit?: () => void; } @@ -411,20 +399,20 @@ export default class UserSettingsDisplay extends React.PureComponent ); let moreColon; let firstMessageMore; - if (firstOption.radionButtonText.moreId) { + if (firstOption.radionButtonText.more?.id) { moreColon = ': '; firstMessageMore = ( ); @@ -432,18 +420,18 @@ export default class UserSettingsDisplay extends React.PureComponent ); let secondMessageMore; - if (secondOption.radionButtonText.moreId) { + if (secondOption.radionButtonText.more?.id) { secondMessageMore = ( ); @@ -453,8 +441,8 @@ export default class UserSettingsDisplay extends React.PureComponent ); } @@ -462,15 +450,14 @@ export default class UserSettingsDisplay extends React.PureComponent ); const messageDesc = ( ); @@ -536,21 +523,21 @@ export default class UserSettingsDisplay extends React.PureComponent { this.handleOnChange(e, {[childDisplay]: e.target.checked ? 'true' : 'false'}); }} /> {moreColon} @@ -658,28 +645,32 @@ export default class UserSettingsDisplay extends React.PureComponent