import React, { useContext } from 'react';
import { View } from 'react-native';
import { PushTriggerOption } from '@sendbird/chat';
import type { MenuBarProps } from '@sendbird/uikit-react-native-foundation';
import { Icon, MenuBar, Switch, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
import { Logger, conditionChaining, useIIFE } from '@sendbird/uikit-utils';
import { useLocalization, useSendbirdChat } from '../../../hooks/useContext';
import { GroupChannelSettingsContexts } from '../module/moduleContext';
import type { GroupChannelSettingsProps } from '../types';
let WARN_onPressMenuNotification = false;
let WARN_onPressMenuSearchInChannel = false;
const GroupChannelSettingsMenu = ({
onPressMenuModeration,
onPressMenuMembers,
onPressMenuSearchInChannel,
onPressMenuLeaveChannel,
onPressMenuNotification,
menuItemsCreator = (menu) => menu,
}: GroupChannelSettingsProps['Menu']) => {
const { sdk, sbOptions } = useSendbirdChat();
const { channel } = useContext(GroupChannelSettingsContexts.Fragment);
const { STRINGS } = useLocalization();
const { colors } = useUIKitTheme();
if (
__DEV__ &&
!WARN_onPressMenuNotification &&
!onPressMenuNotification &&
sbOptions.uikit.groupChannel.channel.enableMention
) {
Logger.warn('If you are using mention, make sure to pass the `onPressMenuNotification` prop');
WARN_onPressMenuNotification = true;
}
if (
__DEV__ &&
!WARN_onPressMenuSearchInChannel &&
!onPressMenuSearchInChannel &&
sbOptions.uikitWithAppInfo.groupChannel.setting.enableMessageSearch
) {
Logger.warn('If you are using message search, make sure to pass the `onPressMenuSearchInChannel` prop');
WARN_onPressMenuSearchInChannel = true;
}
const toggleNotification = async () => {
try {
if (channel.myPushTriggerOption === 'off') {
await channel.setMyPushTriggerOption(PushTriggerOption.DEFAULT);
} else {
await channel.setMyPushTriggerOption(PushTriggerOption.OFF);
}
} catch (error) {
Logger.warn('Failed to toggle notification', error);
}
};
const { onPressNotificationMenu, actionLabelNotificationMenu, actionItemNotificationMenu } = useIIFE(() => {
const getNotificationsLabel = () => {
switch (channel.myPushTriggerOption) {
case PushTriggerOption.ALL:
case PushTriggerOption.DEFAULT:
return STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION_LABEL_ON;
case PushTriggerOption.OFF:
return STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION_LABEL_OFF;
case PushTriggerOption.MENTION_ONLY:
return STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION_LABEL_MENTION_ONLY;
}
};
return {
actionLabelNotificationMenu: getNotificationsLabel(),
actionItemNotificationMenu: conditionChaining(
[sbOptions.uikit.groupChannel.channel.enableMention],
[
,
,
],
),
onPressNotificationMenu: () => {
if (sbOptions.uikit.groupChannel.channel.enableMention) onPressMenuNotification?.();
else toggleNotification();
},
};
});
const defaultMenuItems: MenuBarProps[] = [
{
icon: 'moderation',
visible: channel.myRole === 'operator',
name: STRINGS.GROUP_CHANNEL_SETTINGS.MENU_MODERATION,
onPress: () => onPressMenuModeration(),
actionItem: ,
},
{
icon: 'notifications',
name: STRINGS.GROUP_CHANNEL_SETTINGS.MENU_NOTIFICATION,
onPress: onPressNotificationMenu,
actionLabel: actionLabelNotificationMenu,
actionItem: actionItemNotificationMenu,
},
{
icon: 'members',
name: STRINGS.GROUP_CHANNEL_SETTINGS.MENU_MEMBERS,
onPress: () => onPressMenuMembers(),
actionLabel: String(channel.memberCount),
actionItem: ,
},
];
if (sbOptions.uikitWithAppInfo.groupChannel.setting.enableMessageSearch && !channel.isEphemeral) {
defaultMenuItems.push({
icon: 'search',
name: STRINGS.GROUP_CHANNEL_SETTINGS.MENU_SEARCH,
onPress: () => onPressMenuSearchInChannel?.(),
});
}
defaultMenuItems.push({
icon: 'leave',
iconColor: colors.error,
name: STRINGS.GROUP_CHANNEL_SETTINGS.MENU_LEAVE_CHANNEL,
onPress: () => {
channel.leave().then(() => {
onPressMenuLeaveChannel();
sdk.clearCachedMessages([channel.url]).catch();
});
},
});
const menuItems = menuItemsCreator(defaultMenuItems);
return (
{menuItems.map((menu) => {
return (
);
})}
);
};
export default GroupChannelSettingsMenu;