From b4a44f3e8206522b8a1d5bd7e8916aedf56fe0b6 Mon Sep 17 00:00:00 2001 From: "minh.do" Date: Wed, 17 Sep 2025 13:37:06 +0700 Subject: [PATCH 1/3] task-63787: add e2e test identifiers for file inputs and modals --- .../ClanBannerBackground/index.tsx | 11 +++++++++-- .../ClanSettingOverview/ClanLogoName/index.tsx | 9 ++++++++- .../src/lib/components/DragAndDrop/TooManyUpload.tsx | 4 ++-- .../src/lib/components/ModalValidateFile/index.tsx | 3 ++- libs/utils/src/lib/e2e-testing/constants.ts | 8 ++++++++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/libs/components/src/lib/components/ClanSettings/ClanSettingOverview/ClanBannerBackground/index.tsx b/libs/components/src/lib/components/ClanSettings/ClanSettingOverview/ClanBannerBackground/index.tsx index 6a9d3b1dfb..4e8c168528 100644 --- a/libs/components/src/lib/components/ClanSettings/ClanSettingOverview/ClanBannerBackground/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/ClanSettingOverview/ClanBannerBackground/index.tsx @@ -1,7 +1,7 @@ import { selectCurrentChannelId, selectCurrentClanId } from '@mezon/store'; import { handleUploadFile, useMezon } from '@mezon/transport'; import { Icons } from '@mezon/ui'; -import { MAX_FILE_SIZE_10MB, fileTypeImage } from '@mezon/utils'; +import { MAX_FILE_SIZE_10MB, fileTypeImage, generateE2eId } from '@mezon/utils'; import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; @@ -95,7 +95,14 @@ const ClanBannerBackground = ({ onUpload, urlImage }: ClanBannerBackgroundProps) > {!urlImage &&

{t('clanBanner.chooseImage')}

} - handleFile(e)} type="file" className="hidden" /> + handleFile(e)} + type="file" + className="hidden" + data-e2e={generateE2eId('clan_page.settings.upload.clan_banner_input')} + /> )} diff --git a/libs/components/src/lib/components/ModalValidateFile/index.tsx b/libs/components/src/lib/components/ModalValidateFile/index.tsx index 8d24321466..85af79a247 100644 --- a/libs/components/src/lib/components/ModalValidateFile/index.tsx +++ b/libs/components/src/lib/components/ModalValidateFile/index.tsx @@ -26,8 +26,12 @@ const ModalValidateFile = ({ title, content, onClose, open = true }: ModalValida
-

{title}

-

{content}

+

+ {title} +

+

+ {content} +

diff --git a/libs/utils/src/lib/e2e-testing/constants.ts b/libs/utils/src/lib/e2e-testing/constants.ts index 53daf1de7c..165684d6b2 100644 --- a/libs/utils/src/lib/e2e-testing/constants.ts +++ b/libs/utils/src/lib/e2e-testing/constants.ts @@ -126,7 +126,11 @@ export const DATA_E2E_IDENTIFIER = { }, settings: { sidebar: { - delete: '' + delete: '', + item: '' + }, + emoji: { + upload: '' }, modal: { delete_clan: { @@ -146,7 +150,8 @@ export const DATA_E2E_IDENTIFIER = { }, upload: { clan_logo_input: '', - clan_banner_input: '' + clan_banner_input: '', + emoji_input: '' } }, channel_list: { @@ -327,7 +332,10 @@ export const DATA_E2E_IDENTIFIER = { }, modal: { too_many_upload: '', - validate_file: '' + validate_file: { + title: '', + content: '' + } } }; type DotNestedKeys = T extends object From dc194822c43eee694fa4c2c2a15e1cef997f5f47 Mon Sep 17 00:00:00 2001 From: dathaquoc Date: Thu, 18 Sep 2025 17:37:36 +0700 Subject: [PATCH 3/3] task-63787: upload file --- .../ChannelListComponents/index.tsx | 3 +- .../ModalCreate/eventInfoModal.tsx | 4 +- .../EventChannelModal/ModalCreate/index.tsx | 3 +- .../StartEvent/StartEvent.tsx | 3 +- .../ChannelSetting/channelSettingItem.tsx | 10 +++- .../ClanWebhookItemModal/index.tsx | 5 +- .../Integrations/ClanWebhooks/index.tsx | 5 +- .../MainClanIntegration/index.tsx | 8 +-- .../Integrations/MainIntegrations/index.tsx | 2 + .../Webhooks/WebhookItemModal/index.tsx | 5 +- .../Integrations/Webhooks/index.tsx | 6 +- .../Mission/ClanGuideSetting.tsx | 3 +- .../Mission/ModalAddRule.tsx | 3 +- .../ClanSettings/SettingOnBoarding/index.tsx | 2 + .../SettingSoundEffect/ModalUploadSound.tsx | 4 +- .../ClanSettings/SettingSoundEffect/index.tsx | 6 +- .../components/DragAndDrop/TooManyUpload.tsx | 6 +- .../components/EnableComunityClan/index.tsx | 2 + .../lib/components/EnableOnboarding/index.tsx | 2 + .../lib/components/PanelChannel/ItemPanel.tsx | 2 + .../lib/components/SettingComunity/index.tsx | 4 +- libs/utils/src/lib/e2e-testing/constants.ts | 56 ++++++++++++++++++- 22 files changed, 113 insertions(+), 31 deletions(-) diff --git a/libs/components/src/lib/components/ChannelList/ChannelListComponents/index.tsx b/libs/components/src/lib/components/ChannelList/ChannelListComponents/index.tsx index 61b0ff6dd0..1db92e93b0 100644 --- a/libs/components/src/lib/components/ChannelList/ChannelListComponents/index.tsx +++ b/libs/components/src/lib/components/ChannelList/ChannelListComponents/index.tsx @@ -19,7 +19,7 @@ import { useAppDispatch } from '@mezon/store'; import { Icons } from '@mezon/ui'; -import { DONE_ONBOARDING_STATUS, EPermission } from '@mezon/utils'; +import { DONE_ONBOARDING_STATUS, EPermission, generateE2eId } from '@mezon/utils'; import { memo, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useModal } from 'react-modal-hook'; @@ -128,6 +128,7 @@ export const Events = memo(() => {
diff --git a/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/eventInfoModal.tsx b/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/eventInfoModal.tsx index 99ad345b5e..dcabc6a8b5 100644 --- a/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/eventInfoModal.tsx +++ b/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/eventInfoModal.tsx @@ -3,7 +3,7 @@ import { selectCurrentChannelId, selectCurrentClanId, selectTheme } from '@mezon import { handleUploadFile, useMezon } from '@mezon/transport'; import { TextArea, TimePicker } from '@mezon/ui'; import type { ContenSubmitEventProps } from '@mezon/utils'; -import { ERepeatType, MAX_FILE_SIZE_1MB, fileTypeImage } from '@mezon/utils'; +import { ERepeatType, MAX_FILE_SIZE_1MB, fileTypeImage, generateE2eId } from '@mezon/utils'; import { Suspense, lazy, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; @@ -296,7 +296,7 @@ const EventInfoModal = (props: EventInfoModalProps) => { > {t('actions.uploadImage')}
- handleFile(e)} className="w-full text-sm text-slate-500 " /> + handleFile(e)} className="w-full text-sm text-slate-500 " data-e2e={generateE2eId('clan_page.modal.create_event.upload.image_cover_input')} /> {contentSubmit.logo && logo}
diff --git a/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/index.tsx b/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/index.tsx index 3f652905c5..b16b0b2e1d 100644 --- a/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/index.tsx +++ b/libs/components/src/lib/components/ChannelList/EventChannelModal/ModalCreate/index.tsx @@ -11,7 +11,7 @@ import { useAppDispatch, useAppSelector } from '@mezon/store'; -import { ContenSubmitEventProps, ERepeatType, OptionEvent, Tabs_Option } from '@mezon/utils'; +import { ContenSubmitEventProps, ERepeatType, generateE2eId, OptionEvent, Tabs_Option } from '@mezon/utils'; import isEqual from 'lodash.isequal'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -401,6 +401,7 @@ const ModalCreate = (props: ModalCreateProps) => { diff --git a/libs/components/src/lib/components/ChannelList/EventChannelModal/StartEvent/StartEvent.tsx b/libs/components/src/lib/components/ChannelList/EventChannelModal/StartEvent/StartEvent.tsx index 236a056d6f..540c221815 100644 --- a/libs/components/src/lib/components/ChannelList/EventChannelModal/StartEvent/StartEvent.tsx +++ b/libs/components/src/lib/components/ChannelList/EventChannelModal/StartEvent/StartEvent.tsx @@ -4,6 +4,7 @@ import { Icons } from '@mezon/ui'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; import ListEventManagement from './ListEventManagement'; +import { generateE2eId } from '@mezon/utils'; type StartEventModalProps = { onClose: () => void; @@ -31,7 +32,7 @@ export const StartEventModal = (props: StartEventModalProps) => {
-
+
{t('actions.create')}
diff --git a/libs/components/src/lib/components/ChannelSetting/channelSettingItem.tsx b/libs/components/src/lib/components/ChannelSetting/channelSettingItem.tsx index 74079a162c..ad95cee01e 100644 --- a/libs/components/src/lib/components/ChannelSetting/channelSettingItem.tsx +++ b/libs/components/src/lib/components/ChannelSetting/channelSettingItem.tsx @@ -1,7 +1,7 @@ import { useChannels, usePermissionChecker } from '@mezon/core'; import { ChannelsEntity, selectChannelById, selectWelcomeChannelByClanId, useAppSelector } from '@mezon/store'; import { Icons } from '@mezon/ui'; -import { EPermission, IChannel, checkIsThread } from '@mezon/utils'; +import { EPermission, IChannel, checkIsThread, generateE2eId } from '@mezon/utils'; import { ChannelType } from 'mezon-js'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -98,7 +98,12 @@ const ChannelSettingItem = (props: ChannelSettingItemProps) => {

- + {!isThread && ( <> {getTabTranslation ? getTabTranslation(tabName) : tabName} diff --git a/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/ClanWebhookItemModal/index.tsx b/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/ClanWebhookItemModal/index.tsx index 3ac542d953..d8bb2acfc0 100644 --- a/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/ClanWebhookItemModal/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/ClanWebhookItemModal/index.tsx @@ -1,7 +1,7 @@ import { selectCurrentClanId, selectMemberClanByUserId, settingClanStickerActions, updateClanWebhookById, useAppDispatch } from '@mezon/store'; import { handleUploadFile, useMezon } from '@mezon/transport'; import { Icons } from '@mezon/ui'; -import { MAX_FILE_SIZE_8MB, fileTypeImage } from '@mezon/utils'; +import { MAX_FILE_SIZE_8MB, fileTypeImage, generateE2eId } from '@mezon/utils'; import type { ApiClanWebhook, ApiMessageAttachment, MezonUpdateClanWebhookByIdBody } from 'mezon-js/api.gen'; import type { ChangeEvent } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react'; @@ -46,6 +46,7 @@ const ClanWebhookItemModal = ({ webhookItem }: IClanWebhookItemModalProps) => {
setIsExpand(!isExpand)} className={`cursor-pointer transition duration-100 ease-in-out ${isExpand ? '' : '-rotate-90'}`} + data-e2e={generateE2eId('clan_page.settings.integrations.navigate_webhook_button')} >
@@ -200,7 +201,7 @@ const ExpendedClanWebhookModal = ({ webhookItem }: IExpendedClanWebhookModal) =>
- +
avatarRef.current?.click()} diff --git a/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/index.tsx b/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/index.tsx index 3d2801ede5..58d1873531 100644 --- a/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/Integrations/ClanWebhooks/index.tsx @@ -1,5 +1,6 @@ import { generateClanWebhook, selectCurrentClanId, useAppDispatch } from '@mezon/store'; import { Image } from '@mezon/ui'; +import { generateE2eId } from '@mezon/utils'; import { ApiClanWebhook, ApiGenerateClanWebhookRequest } from 'mezon-js/api.gen'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; @@ -54,6 +55,7 @@ const ClanWebhooks = ({ allClanWebhooks }: IClanWebhooksProps) => {
{t('newClanWebhook')}
@@ -65,7 +67,8 @@ const ClanWebhooks = ({ allClanWebhooks }: IClanWebhooksProps) => {
{t('noWebhooks')}
{t('newClanWebhook')}
diff --git a/libs/components/src/lib/components/ClanSettings/Integrations/MainClanIntegration/index.tsx b/libs/components/src/lib/components/ClanSettings/Integrations/MainClanIntegration/index.tsx index cfe38da7c0..e8404d14d1 100644 --- a/libs/components/src/lib/components/ClanSettings/Integrations/MainClanIntegration/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/Integrations/MainClanIntegration/index.tsx @@ -1,4 +1,5 @@ import { Icons } from '@mezon/ui'; +import { generateE2eId } from '@mezon/utils'; import { ApiClanWebhook } from 'mezon-js/api.gen'; import { useTranslation } from 'react-i18next'; @@ -22,21 +23,20 @@ const MainClanIntegrations = ({ setIsOpenClanWebhooks, allClanWebhooks }: IClanI
{t('clanWebhooks')}
-
- {t('webhook', { count: allClanWebhooks?.length || 0 })} -
+
{t('webhook', { count: allClanWebhooks?.length || 0 })}
{allClanWebhooks && allClanWebhooks?.length === 0 ? (
{t('createClanWebhook')}
) : (
-
{t('viewClanWebhook')}
+
{t('viewClanWebhook')}
)} diff --git a/libs/components/src/lib/components/ClanSettings/Integrations/MainIntegrations/index.tsx b/libs/components/src/lib/components/ClanSettings/Integrations/MainIntegrations/index.tsx index 07fbe238fa..bf8f84c4f9 100644 --- a/libs/components/src/lib/components/ClanSettings/Integrations/MainIntegrations/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/Integrations/MainIntegrations/index.tsx @@ -1,4 +1,5 @@ import { Icons } from '@mezon/ui'; +import { generateE2eId } from '@mezon/utils'; import type { ApiWebhook } from 'mezon-js/api.gen'; import { useTranslation } from 'react-i18next'; @@ -37,6 +38,7 @@ const MainIntegrations = ({ setIsOpenWebhooks, allWebhooks }: IIntegrationProps)
{t('createWebhook')}
diff --git a/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/WebhookItemModal/index.tsx b/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/WebhookItemModal/index.tsx index 8a826657aa..2b1e6bf599 100644 --- a/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/WebhookItemModal/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/WebhookItemModal/index.tsx @@ -13,7 +13,7 @@ import { import { handleUploadFile, useMezon } from '@mezon/transport'; import { Icons, Menu } from '@mezon/ui'; import type { IChannel } from '@mezon/utils'; -import { ChannelIsNotThread, MAX_FILE_SIZE_8MB, fileTypeImage } from '@mezon/utils'; +import { ChannelIsNotThread, MAX_FILE_SIZE_8MB, fileTypeImage, generateE2eId } from '@mezon/utils'; import type { ApiMessageAttachment, ApiWebhook, MezonUpdateWebhookByIdBody } from 'mezon-js/api.gen'; import type { ChangeEvent, ReactElement } from 'react'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; @@ -59,6 +59,7 @@ const WebhookItemModal = ({ webhookItem, currentChannel, isClanSetting }: IWebho
setIsExpand(!isExpand)} className={`cursor-pointer transition duration-100 ease-in-out ${isExpand ? '' : '-rotate-90'}`} + data-e2e={generateE2eId('channel_setting_page.webhook.button.view_webhook')} >
@@ -204,7 +205,7 @@ const ExpendedWebhookModal = ({ webhookItem, currentChannel, isClanSetting }: IE
- +
avatarRef.current?.click()} diff --git a/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/index.tsx b/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/index.tsx index f82bc6a9f9..b273a3e518 100644 --- a/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/Integrations/Webhooks/index.tsx @@ -1,6 +1,6 @@ import { generateWebhook, selectCurrentClanId, useAppDispatch } from '@mezon/store'; import { Image } from '@mezon/ui'; -import { IChannel } from '@mezon/utils'; +import { generateE2eId, IChannel } from '@mezon/utils'; import { ApiWebhook, ApiWebhookCreateRequest } from 'mezon-js/api.gen'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; @@ -57,6 +57,7 @@ const Webhooks = ({ allWebhooks, currentChannel, isClanSetting }: IWebhooksProps
{t('newWebhook')}
@@ -71,7 +72,8 @@ const Webhooks = ({ allWebhooks, currentChannel, isClanSetting }: IWebhooksProps
{t('noWebhooks')}
{t('newWebhook')}
diff --git a/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ClanGuideSetting.tsx b/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ClanGuideSetting.tsx index 9e11159473..100133a624 100644 --- a/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ClanGuideSetting.tsx +++ b/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ClanGuideSetting.tsx @@ -8,7 +8,7 @@ import { useAppSelector } from '@mezon/store'; import { Icons } from '@mezon/ui'; -import { titleMission } from '@mezon/utils'; +import { generateE2eId, titleMission } from '@mezon/utils'; import { ApiOnboardingItem } from 'mezon-js/api.gen'; import { ReactNode, useEffect } from 'react'; import { useModal } from 'react-modal-hook'; @@ -141,6 +141,7 @@ function ClanGuideSetting({ setOpenModalSaveChanges }: ClanGuideSettingProps = { diff --git a/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ModalAddRule.tsx b/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ModalAddRule.tsx index 5e5c7d4e81..98d4511c9d 100644 --- a/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ModalAddRule.tsx +++ b/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/Mission/ModalAddRule.tsx @@ -1,6 +1,6 @@ import { editOnboarding, EGuideType, onboardingActions, useAppDispatch } from '@mezon/store'; import { handleUploadEmoticon, useMezon } from '@mezon/transport'; -import { fileTypeImage, MAX_FILE_SIZE_10MB } from '@mezon/utils'; +import { fileTypeImage, generateE2eId, MAX_FILE_SIZE_10MB } from '@mezon/utils'; import { Snowflake } from '@theinternetfolks/snowflake'; import type { ApiOnboardingItem } from 'mezon-js/api.gen'; import type { ChangeEvent } from 'react'; @@ -192,6 +192,7 @@ const ModalAddRules = ({ onClose, ruleEdit, tempId }: { onClose: () => void; rul tabIndex={0} accept=".jpg,.jpeg,.png,.gif" onChange={handleAddImage} + data-e2e={generateE2eId('clan_page.settings.upload.onboarding_resource_input')} />
diff --git a/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/index.tsx b/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/index.tsx index 2cbf5ca4a9..1fa34140a0 100644 --- a/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/SettingOnBoarding/index.tsx @@ -13,6 +13,7 @@ import ModalSaveChanges from '../ClanSettingOverview/ModalSaveChanges'; import GuideItemLayout from './GuideItemLayout'; import ClanGuideSetting from './Mission/ClanGuideSetting'; import Questions from './Questions/Questions'; +import { generateE2eId } from '@mezon/utils'; export enum EOnboardingStep { QUESTION, @@ -350,6 +351,7 @@ const MainIndex = ({ handleGoToPage, onCloseSetting, showOnboardingHighlight }:
handleGoToPage(EOnboardingStep.MISSION)} + data-e2e={generateE2eId('clan_page.settings.onboarding.button.clan_guide')} > {t('buttons.edit')}
diff --git a/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/ModalUploadSound.tsx b/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/ModalUploadSound.tsx index f1c50fd08a..8c2335ea1a 100644 --- a/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/ModalUploadSound.tsx +++ b/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/ModalUploadSound.tsx @@ -3,6 +3,7 @@ import type React from 'react'; import { MediaType, selectCurrentClanId, soundEffectActions, useAppDispatch } from '@mezon/store'; import { handleUploadEmoticon, useMezon } from '@mezon/transport'; import { Icons, Modal } from '@mezon/ui'; +import { generateE2eId } from '@mezon/utils'; import { Snowflake } from '@theinternetfolks/snowflake'; import { useEffect, useRef, useState } from 'react'; import { useSelector } from 'react-redux'; @@ -214,6 +215,7 @@ const ModalUploadSound = ({ sound, onSuccess, onClose }: ModalUploadSoundProps) accept="audio/mp3,audio/mpeg,audio/wav" className="absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10" onChange={handleFileChange} + data-e2e={generateE2eId('clan_page.settings.upload.voice_sticker_input')} />
-

{error}

+

{error}

)} diff --git a/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/index.tsx b/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/index.tsx index 7f7efc072f..cd1ca3966d 100644 --- a/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/index.tsx +++ b/libs/components/src/lib/components/ClanSettings/SettingSoundEffect/index.tsx @@ -11,6 +11,7 @@ import { useAppSelector } from '@mezon/store'; import { Icons } from '@mezon/ui'; +import { generateE2eId } from '@mezon/utils'; import type { ClanSticker } from 'mezon-js'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -94,9 +95,7 @@ const SettingSoundEffect = () => {
{t('main.uploadInstructions')}
-

- {t('main.fileRequirements')} -

+

{t('main.fileRequirements')}

@@ -111,6 +110,7 @@ const SettingSoundEffect = () => { setSelectedSound(null); setShowModal(true); }} + data-e2e={generateE2eId('clan_page.settings.voice_sticker.button_upload')} > {t('main.uploadSound')} diff --git a/libs/components/src/lib/components/DragAndDrop/TooManyUpload.tsx b/libs/components/src/lib/components/DragAndDrop/TooManyUpload.tsx index 13a8657f34..eada144f72 100644 --- a/libs/components/src/lib/components/DragAndDrop/TooManyUpload.tsx +++ b/libs/components/src/lib/components/DragAndDrop/TooManyUpload.tsx @@ -24,7 +24,7 @@ const TooManyUpload = ({ togglePopup, limitReason, limitSize }: ITooManyUploadPr }; }, [limitReason]); return ( -
+
@@ -32,10 +32,10 @@ const TooManyUpload = ({ togglePopup, limitReason, limitSize }: ITooManyUploadPr
-

{title}

+

{title}

-

{content}

+

{content}

diff --git a/libs/components/src/lib/components/EnableComunityClan/index.tsx b/libs/components/src/lib/components/EnableComunityClan/index.tsx index 5372155baa..53052678c9 100644 --- a/libs/components/src/lib/components/EnableComunityClan/index.tsx +++ b/libs/components/src/lib/components/EnableComunityClan/index.tsx @@ -1,4 +1,5 @@ import { selectIsCommunityEnabled, useAppSelector } from '@mezon/store'; +import { generateE2eId } from '@mezon/utils'; import { useTranslation } from 'react-i18next'; const EnableComunity = ({ onEnable, clanId }: { onEnable: () => void; clanId?: string }) => { @@ -32,6 +33,7 @@ const EnableComunity = ({ onEnable, clanId }: { onEnable: () => void; clanId?: s