Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
df1ebe4
add e2e
kientrinh-dev Nov 27, 2025
d5fd44e
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Nov 28, 2025
add40d9
e2e kick user from clan
trinhtruongthiphuong Nov 28, 2025
dd0f98b
Merge pull request #79 from kientrinh-dev/feat/e2e-kick-user-from-clan
trinhtruongthiphuong Nov 28, 2025
7569feb
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 1, 2025
6dd6858
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 1, 2025
0557842
feat: add e2e for case verify username in short profile
thang-thieuquang Dec 1, 2025
754dfe6
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 2, 2025
be38a80
Merge pull request #80 from kientrinh-dev/feat/64877/short-profile
thang-thieuquang Dec 2, 2025
3acdf11
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 3, 2025
4a1fff5
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 4, 2025
85edda5
mark e2e to flow custom user status
trinhtruongthiphuong Dec 4, 2025
2da67a0
Merge pull request #81 from kientrinh-dev/feat/e2e-custom-status
trinhtruongthiphuong Dec 4, 2025
5ebc788
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 5, 2025
72b57b4
Merge branch 'develop' of https://github.com/mezonai/mezon into develop
trinhtruongthiphuong Dec 5, 2025
a2ffec2
e2e for custom status on friend list
trinhtruongthiphuong Dec 5, 2025
d205936
Merge pull request #82 from kientrinh-dev/feat/e2e-custom-status-frie…
trinhtruongthiphuong Dec 5, 2025
7a2ec50
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 8, 2025
83329c7
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 9, 2025
9db641a
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 9, 2025
bede668
mark e2e to send gif on voice channel chat box
trinhtruongthiphuong Dec 9, 2025
8a36c37
Merge pull request #84 from kientrinh-dev/feat/e2e-voice-channel-gif-…
trinhtruongthiphuong Dec 9, 2025
98c2e0c
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 10, 2025
638119c
Merge branch 'develop' of github.com:kientrinh-dev/mezon into develop
trinhtruongthiphuong Dec 10, 2025
bb81a7f
add e2e to gif gallery modal
trinhtruongthiphuong Dec 10, 2025
c8c687f
Merge pull request #86 from kientrinh-dev/feat/e2e-gif-gallery-modal
trinhtruongthiphuong Dec 10, 2025
7073b6f
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 11, 2025
9535389
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 11, 2025
ea6917f
add e2e to add role from short profile
trinhtruongthiphuong Dec 11, 2025
14aaa1a
Merge pull request #87 from kientrinh-dev/feat/e2e-add-role-short-pro…
trinhtruongthiphuong Dec 11, 2025
d7c8917
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 12, 2025
3386279
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 12, 2025
db4af22
add e2e to verify topic on inbox popover
trinhtruongthiphuong Dec 12, 2025
c81f2e3
Merge pull request #88 from kientrinh-dev/feat/e2e-topic-inbox-popover
trinhtruongthiphuong Dec 12, 2025
bf8dd9a
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 15, 2025
7a5fe2a
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 16, 2025
7ecdb4e
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 16, 2025
0f261f7
add e2e for role color for user in clan
trinhtruongthiphuong Dec 16, 2025
619af6c
Merge pull request #89 from kientrinh-dev/feat/e2e-role-color-for-user
trinhtruongthiphuong Dec 16, 2025
5e728b6
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 17, 2025
56540d0
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 18, 2025
d2c73ed
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 19, 2025
2abf6a0
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 22, 2025
7b4dc3c
e2e for mark as read on clan
trinhtruongthiphuong Dec 22, 2025
30f5137
Merge pull request #90 from kientrinh-dev/feat/mark-as-read-clan
trinhtruongthiphuong Dec 22, 2025
c99d312
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 23, 2025
e22f710
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 23, 2025
50a5e08
e2e mark as read direct message
trinhtruongthiphuong Dec 23, 2025
0a07e7a
Merge pull request #91 from kientrinh-dev/feat/mark-as-read-dm
trinhtruongthiphuong Dec 23, 2025
84512a6
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 24, 2025
df1f449
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 25, 2025
8f93f54
e2e for clan template
trinhtruongthiphuong Dec 25, 2025
5e4a0da
Merge pull request #92 from kientrinh-dev/feat/e2e-clan-template
trinhtruongthiphuong Dec 25, 2025
66ba677
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 26, 2025
5ffd1a2
e2e for list role on settings clan
trinhtruongthiphuong Dec 26, 2025
5a805d0
Merge pull request #93 from kientrinh-dev/feat/e2e-list-roles
trinhtruongthiphuong Dec 26, 2025
5cb8950
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 26, 2025
3d0f52d
Merge remote-tracking branch 'mezon/develop' into develop
trinhtruongthiphuong Dec 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions apps/chat/src/app/pages/channel/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,10 @@ export const BanCountDown = ({ banTime, clanId, channelId, userId }: { banTime:
}, [time]);

return (
<div className="flex h-12 gap-3 items-center opacity-80 bg-theme-contexify text-theme-primary-active ml-4 mb-4 p-2 w-widthInputViewChannelPermission rounded">
<div
className="flex h-12 gap-3 items-center opacity-80 bg-theme-contexify text-theme-primary-active ml-4 mb-4 p-2 w-widthInputViewChannelPermission rounded"
data-e2e={generateE2eId('mention.banned')}
>
<svg width="28" height="28" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
<path
fill="#e03c47"
Expand All @@ -598,7 +601,7 @@ export const BanCountDown = ({ banTime, clanId, channelId, userId }: { banTime:
<span className="leading-3 text-xs">{t('timeoutDesc')}</span>
</div>

<span>{time ? `${time}s` : banTime !== Infinity && countdown}</span>
<span data-e2e={generateE2eId('mention.banned.time')}>{time ? `${time}s` : banTime !== Infinity && countdown}</span>
</div>
);
};
5 changes: 4 additions & 1 deletion apps/chat/src/app/pages/directMessage/FriendsPage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,10 @@ const FriendsPage = () => {
{tab.title}
</button>
{tab.value === 'pending' && quantityPendingRequest !== 0 && (
<div className="absolute grid place-items-center w-[20px] h-[20px] rounded-full bg-colorDanger text-[10px] font-medium top-[2px] right-3">
<div
className="absolute grid place-items-center w-[20px] h-[20px] rounded-full bg-colorDanger text-[10px] font-medium top-[2px] right-3"
data-e2e={generateE2eId('badge.friend_pending')}
>
{quantityPendingRequest}
</div>
)}
Expand Down
4 changes: 2 additions & 2 deletions apps/chat/src/app/pages/main/directUnreads.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { AvatarImage } from '@mezon/components';
import { useCustomNavigate } from '@mezon/core';
import type { DMMetaEntity } from '@mezon/store';
import { directActions, selectDirectById, useAppDispatch, useAppSelector } from '@mezon/store';
import { createImgproxyUrl } from '@mezon/utils';
import { createImgproxyUrl, generateE2eId } from '@mezon/utils';
import { ChannelType } from 'mezon-js';
import { memo, useCallback, useMemo } from 'react';
import { NavLink } from 'react-router-dom';
Expand Down Expand Up @@ -77,7 +77,7 @@ const DirectUnreadComponent = ({ directMessage, shouldAnimateOut = false, onMemb

return (
<NavLink to="#" onClick={handleClick} draggable="false" className={linkClassName}>
<div className={innerDivClassName}>
<div className={innerDivClassName} data-e2e={generateE2eId('chat.direct_message.side_bar.item', direct.id)}>
<AvatarImage draggable="false" {...avatarProps} />
{badgeContent && <div className={badgeClassName}>{badgeContent}</div>}
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { BottomSheetModal } from '@gorhom/bottom-sheet';
import type { BottomSheetModal } from '@gorhom/bottom-sheet';
import { useAuth, useCheckOwnerForUser } from '@mezon/core';
import { ActionEmitEvent } from '@mezon/mobile-components';
import { baseColor, useTheme } from '@mezon/mobile-ui';
import type { IUpdateChannelRequest } from '@mezon/store-mobile';
import {
IUpdateChannelRequest,
appActions,
channelsActions,
fetchUserChannels,
Expand All @@ -16,7 +16,7 @@ import {
} from '@mezon/store-mobile';
import { isPublicChannel } from '@mezon/utils';
import { FlashList } from '@shopify/flash-list';
import { ApiChangeChannelPrivateRequest } from 'mezon-js/api.gen';
import type { ApiChangeChannelPrivateRequest } from 'mezon-js/api.gen';
import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { DeviceEventEmitter, Text, TouchableOpacity, View } from 'react-native';
Expand All @@ -29,7 +29,7 @@ import { AddMemberOrRoleBS } from '../components/AddMemberOrRoleBS';
import { MemberItem } from '../components/MemberItem';
import { RoleItem } from '../components/RoleItem';
import { EOverridePermissionType, ERequestStatus } from '../types/channelPermission.enum';
import { IBasicViewProps } from '../types/channelPermission.type';
import type { IBasicViewProps } from '../types/channelPermission.type';
import { style } from './styles';

export const BasicView = memo(({ channel }: IBasicViewProps) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import MezonClanAvatar from '../../../../../../componentUI/MezonClanAvatar';
import MezonMenu, { IMezonMenuItemProps, IMezonMenuSectionProps } from '../../../../../../componentUI/MezonMenu';
import MezonSwitch from '../../../../../../componentUI/MezonSwitch';
import DeleteClanModal from '../../../../../../components/DeleteClanModal';
import type { AppStackScreenProps } from '../../../../../../navigation/ScreenTypes';
import { APP_SCREEN, AppStackScreenProps } from '../../../../../../navigation/ScreenTypes';
import { EProfileTab } from '../../../../../settings/ProfileSetting';
import InviteToChannel from '../../InviteToChannel';
import ClanMenuInfo from '../ClanMenuInfo';
import { style } from './styles';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { generateE2eId } from '@mezon/utils';
import React, { useCallback, useEffect, useMemo, useState } from 'react';

export interface ButtonSwitchProps {
Expand Down Expand Up @@ -44,6 +45,7 @@ export const ButtonSwitch: React.FC<ButtonSwitchProps> = ({ title, duration = 10
className={`flex items-center p-1 rounded-sm bg-bgSecondary bg-item-theme-hover ${className ?? ''} `}
onClick={handleOnClickButton}
disabled={disabled}
data-e2e={generateE2eId('button.copy')}
>
{displayedIcon} {title && <p>{title}</p>}
</button>
Expand Down
5 changes: 3 additions & 2 deletions libs/components/src/lib/components/Canvas/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
selectTheme,
selectTitle
} from '@mezon/store';
import { EEventAction } from '@mezon/utils';
import { EEventAction, generateE2eId } from '@mezon/utils';
import { lazy, Suspense, useCallback, useEffect, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector } from 'react-redux';
Expand Down Expand Up @@ -201,8 +201,9 @@ const Canvas = () => {
rows={1}
disabled={!isEditAndDelCanvas}
className="w-full px-4 py-2 mt-[25px] text-theme-message bg-inherit focus:outline-none text-[28px] resize-none leading-[34px] font-bold "
data-e2e={generateE2eId('clan_page.screen.canvas_editor.input.title')}
/>
<div className="w-full">
<div className="w-full" data-e2e={generateE2eId('clan_page.screen.canvas_editor.input.content')}>
<Suspense fallback={<CanvasContentPlaceholder />}>
<CanvasContent
key={idCanvas}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ const ChannelLinkComponent = ({
/>
<div
className={`absolute ml-auto w-5 h-5 text-white right-3 group-hover:hidden bg-red-600 rounded-full text-[12px] flex items-center justify-center top-2`}
data-e2e={generateE2eId('clan_page.channel_list.item.badge')}
>
{countNumberNotification}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
} from '@mezon/store';
import { ButtonLoading, Icons, InputField } from '@mezon/ui';
import type { IChannel, UsersClanEntity } from '@mezon/utils';
import { ChannelStatusEnum } from '@mezon/utils';
import { ChannelStatusEnum, generateE2eId } from '@mezon/utils';
import { ChannelType } from 'mezon-js';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
Expand Down Expand Up @@ -197,7 +197,10 @@ export const AddMemRole: React.FC<AddMemRoleProps> = ({
return (
<div ref={modalRef} tabIndex={-1} className="fixed inset-0 flex items-center justify-center z-50 ">
<div className="fixed inset-0 bg-black opacity-80"></div>
<div className="relative z-10 p-6 bg-theme-setting-primary text-theme-primary rounded-[5px] w-[440px] text-[15px]">
<div
className="relative z-10 p-6 bg-theme-setting-primary text-theme-primary rounded-[5px] w-[440px] text-[15px]"
data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal')}
>
<h2 className="text-[24px] font-semibold text-center text-theme-primary-active">{t('addMembersRoles.title')}</h2>
<div className="flex justify-center">
{isPrivate === ChannelStatusEnum.isPrivate && channel.type === ChannelType.CHANNEL_TYPE_MEZON_VOICE && (
Expand Down Expand Up @@ -225,7 +228,7 @@ export const AddMemRole: React.FC<AddMemRoleProps> = ({
{filterItem.listRolesNotAddChannel.length !== 0 && (
<div>
<p className="uppercase font-bold text-xs pb-4">{t('addMembersRoles.roles')}</p>
<div>
<div data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal.role_list')}>
<ListRole
listItem={filterItem.listRolesNotAddChannel}
selectedRoleIds={selectedRoleIds}
Expand All @@ -237,7 +240,7 @@ export const AddMemRole: React.FC<AddMemRoleProps> = ({
{userChannelIds.length !== 0 && (
<div className="mt-2">
<p className="uppercase font-bold text-xs pb-4">{t('addMembersRoles.members')}</p>
<div>
<div data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal.member_list')}>
<ListMembers
listItem={filterItem.listMembersNotInChannel}
selectedUserIds={selectedUserIds}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Icons } from '@mezon/ui';
import type { UsersClanEntity } from '@mezon/utils';
import { createImgproxyUrl, getAvatarForPrioritize, getNameForPrioritize } from '@mezon/utils';
import { createImgproxyUrl, generateE2eId, getAvatarForPrioritize, getNameForPrioritize } from '@mezon/utils';
import { AvatarImage } from '../../../AvatarImage/AvatarImage';

type ListMembersProps = {
Expand Down Expand Up @@ -42,7 +42,10 @@ const ItemMember = (props: ItemMemberProps) => {
const namePrioritize = getNameForPrioritize(clanName, displayName, username);
const avatarPrioritize = getAvatarForPrioritize(clanAvatar, avatar);
return (
<div className={`flex justify-between py-2 rounded bg-item-hover px-[6px]`}>
<div
className={`flex justify-between py-2 rounded bg-item-hover px-[6px]`}
data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal.member_list.member_item')}
>
<label className="flex gap-x-2 items-center w-full">
<div className="relative flex flex-row justify-center">
<input
Expand All @@ -51,6 +54,9 @@ const ItemMember = (props: ItemMemberProps) => {
checked={checked}
onChange={onChange}
className="peer appearance-none forced-colors:appearance-auto relative w-4 h-4 border-theme-primary rounded-lg focus:outline-none"
data-e2e={generateE2eId(
'channel_setting_page.permissions.section.member_role_management.modal.member_list.member_item.input'
)}
/>
<Icons.Check className="absolute invisible peer-checked:visible forced-colors:hidden w-4 h-4" />
</div>
Expand All @@ -62,8 +68,20 @@ const ItemMember = (props: ItemMemberProps) => {
src={avatarPrioritize}
classNameText="text-[9px] pt-[3px]"
/>
<p className="text-sm one-line text-theme-primary-active">{namePrioritize}</p>
<p className=" font-light">{username}</p>
<p
className="text-sm one-line text-theme-primary-active"
data-e2e={generateE2eId(
'channel_setting_page.permissions.section.member_role_management.modal.member_list.member_item.name_prioritize'
)}
>
{namePrioritize}
</p>
<p
className=" font-light"
data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal.member_list.member_item.username')}
>
{username}
</p>
</label>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { RolesClanEntity } from '@mezon/store';
import { Icons } from '@mezon/ui';
import { generateE2eId } from '@mezon/utils';

type ListRoleProps = {
listItem: RolesClanEntity[];
Expand All @@ -10,7 +11,11 @@ type ListRoleProps = {
const ListRole = (props: ListRoleProps) => {
const { listItem, selectedRoleIds, handleCheckboxRoleChange } = props;
return listItem.map((role, index) => (
<div className={'flex justify-between py-2 bg-item-hover px-[6px] rounded'} key={role.id}>
<div
className={'flex justify-between py-2 bg-item-hover px-[6px] rounded'}
key={role.id}
data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal.role_list.role_item')}
>
<label className="flex gap-x-2 items-center w-full">
<div className="relative flex flex-row justify-center">
<input
Expand All @@ -20,11 +25,17 @@ const ListRole = (props: ListRoleProps) => {
checked={selectedRoleIds.includes(role.id)}
onChange={(event) => handleCheckboxRoleChange(event, role?.id || '')}
className="peer appearance-none forced-colors:appearance-auto relative w-4 h-4 border-theme-primary rounded-lg focus:outline-none"
data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal.role_list.role_item.input')}
/>
<Icons.Check className="absolute invisible peer-checked:visible forced-colors:hidden w-4 h-4" />
</div>
{role.role_icon ? <img src={role.role_icon} alt="" className={'size-5'} /> : <Icons.RoleIcon defaultSize="w-5 h-5 min-w-5" />}
<p className="text-sm one-line">{role.title}</p>
<p
className="text-sm one-line"
data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.modal.role_list.role_item.title')}
>
{role.title}
</p>
</label>
</div>
));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { RolesClanEntity } from '@mezon/store';
import { channelUsersActions, selectChannelById, selectCurrentClanId, useAppDispatch, useAppSelector } from '@mezon/store';
import { Icons } from '@mezon/ui';
import type { UsersClanEntity } from '@mezon/utils';
import { createImgproxyUrl, getAvatarForPrioritize, getNameForPrioritize, searchNormalizeText } from '@mezon/utils';
import { createImgproxyUrl, generateE2eId, getAvatarForPrioritize, getNameForPrioritize, searchNormalizeText } from '@mezon/utils';
import { memo, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSelector } from 'react-redux';
Expand Down Expand Up @@ -38,14 +38,15 @@ const ListRoleMember = memo((props: ListRoleMemberProps) => {
return (
<div className="basis-1/3">
<HeaderAddRoleMember listManageNotInChannel={listManageNotInChannel} usersClan={usersClan} channelId={channelId} />
<div className="mt-2">
<div className="mt-2" data-e2e={generateE2eId('channel_setting_page.permissions.section.list_roles_members')}>
{listManageInChannel.map((item) => (
<div
key={item.id}
onClick={() => handleItemClick(item)}
className={`w-full py-1.5 px-[10px] text-[15px] text-theme-primary bg-item-hover font-medium inline-flex gap-x-2 items-center rounded ${
selectedItemId === item.id ? 'bg-item-theme' : ''
}`}
data-e2e={generateE2eId('channel_setting_page.permissions.section.list_roles_members.role_member_item')}
>
{item.title}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,11 @@ const PermissionsChannel = (props: PermissionsChannelProps) => {
>
<div className="flex justify-between items-center pb-4">
<p className="uppercase font-bold text-xs text-theme-primary">{t('channelPermission.whoCanAccess')}</p>
<button className="btn-primary btn-primary-hover px-4 py-1 rounded-lg " onClick={openAddMemRoleModal}>
<button
className="btn-primary btn-primary-hover px-4 py-1 rounded-lg "
onClick={openAddMemRoleModal}
data-e2e={generateE2eId('channel_setting_page.permissions.section.member_role_management.button.add')}
>
{t('channelPermission.addMemberAndRoles')}
</button>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ const ChannelSettingItem = (props: ChannelSettingItemProps) => {
onClick={() => {
setShowModal(true);
}}
data-e2e={generateE2eId('button.base')}
>
{isThread ? t('fields.threadDelete.delete') : t('fields.channelDelete.delete')}
</button>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,15 @@ import {
} from '@mezon/store';
import { Icons } from '@mezon/ui';
import type { IImageWindowProps } from '@mezon/utils';
import { EMimeTypes, ETypeLinkMedia, LoadMoreDirection, convertDateStringI18n, createImgproxyUrl, getAttachmentDataForWindow } from '@mezon/utils';
import {
EMimeTypes,
ETypeLinkMedia,
LoadMoreDirection,
convertDateStringI18n,
createImgproxyUrl,
generateE2eId,
getAttachmentDataForWindow
} from '@mezon/utils';
import { endOfDay, format, getUnixTime, isSameDay, startOfDay } from 'date-fns';
import isElectron from 'is-electron';
import type { RefObject } from 'react';
Expand Down Expand Up @@ -635,6 +643,7 @@ export function GalleryModal({ onClose, rootRef }: GalleryModalProps) {
ref={modalRef}
tabIndex={-1}
className="absolute top-8 right-0 rounded-md dark:shadow-shadowBorder shadow-shadowInbox z-[9999] origin-top-right"
data-e2e={generateE2eId('clan_page.modal.gallery')}
>
<div className="flex bg-theme-setting-primary flex-col rounded-md min-h-[400px] md:w-[480px] max-h-[80vh] lg:w-[540px] shadow-sm overflow-hidden">
<div className="bg-theme-setting-nav flex flex-col p-[16px]">
Expand All @@ -656,6 +665,7 @@ export function GalleryModal({ onClose, rootRef }: GalleryModalProps) {
? 'bg-theme-primary text-white'
: 'bg-theme-surface text-theme-primary hover:bg-theme-surface-hover'
}`}
data-e2e={generateE2eId('clan_page.modal.gallery.tab.all')}
>
{t('gallery.filters.all')}
</button>
Expand All @@ -666,6 +676,7 @@ export function GalleryModal({ onClose, rootRef }: GalleryModalProps) {
? 'bg-theme-primary text-white'
: 'bg-theme-surface text-theme-primary hover:bg-theme-surface-hover'
}`}
data-e2e={generateE2eId('clan_page.modal.gallery.tab.image')}
>
{t('gallery.filters.images')}
</button>
Expand All @@ -676,6 +687,7 @@ export function GalleryModal({ onClose, rootRef }: GalleryModalProps) {
? 'bg-theme-primary text-white'
: 'bg-theme-surface text-theme-primary hover:bg-theme-surface-hover'
}`}
data-e2e={generateE2eId('clan_page.modal.gallery.tab.video')}
>
{t('gallery.filters.videos')}
</button>
Expand Down Expand Up @@ -931,6 +943,7 @@ const ImageWithLoading = React.memo<ImageWithLoadingProps>(
preload="metadata"
muted
playsInline
data-e2e={generateE2eId('clan_page.modal.gallery.video')}
/>
) : (
<div className="w-full h-full bg-gray-800" />
Expand All @@ -950,6 +963,7 @@ const ImageWithLoading = React.memo<ImageWithLoadingProps>(
className={`w-full h-full object-cover ${isLoading ? 'opacity-0' : 'opacity-100'} ${className}`}
onLoad={handleLoad}
onError={handleError}
data-e2e={generateE2eId('clan_page.modal.gallery.image')}
/>
)}
</div>
Expand Down
Loading