import React, { PropsWithChildren, useCallback, useMemo, useState } from 'react'; import { StyleSheet } from 'react-native'; import type { SharedValue } from 'react-native-reanimated'; import type { Channel } from 'stream-chat'; import { useIsChannelMuted } from './hooks/useIsChannelMuted'; import { useComponentsContext } from '../../contexts/componentsContext/ComponentsContext'; import { useSwipeRegistryContext } from '../../contexts/swipeableContext/SwipeRegistryContext'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; import { MenuPointHorizontal, Mute, Sound } from '../../icons'; import type { GetChannelActionItems } from '../ChannelList/hooks/useChannelActionItems'; import { useChannelActionItems } from '../ChannelList/hooks/useChannelActionItems'; import { useChannelActions } from '../ChannelList/hooks/useChannelActions'; import { BottomSheetModal } from '../UIComponents/BottomSheetModal'; import { RightActions, SwipableActionItem, SwipableWrapper, SwipableWrapperProps, } from '../UIComponents/SwipableWrapper'; export const OpenChannelDetailsButton = () => { const { theme: { semantics }, } = useTheme(); return ; }; export const ChannelSwipableWrapper = ({ channel, getChannelActionItems, swipableProps: _swipableProps, children, }: PropsWithChildren<{ channel: Channel; getChannelActionItems?: GetChannelActionItems; swipableProps?: SwipableWrapperProps['swipableProps']; }>) => { const { ChannelDetailsBottomSheet: ChannelDetailsBottomSheetComponent } = useComponentsContext(); const [channelDetailSheetOpen, setChannelDetailSheetOpen] = useState(false); const { muteChannel, unmuteChannel } = useChannelActions(channel); const channelActionItems = useChannelActionItems({ channel, getChannelActionItems }); const sheetItems = useMemo( () => channelActionItems.filter((item) => item.placement !== 'swipe'), [channelActionItems], ); const swipableRegistry = useSwipeRegistryContext(); const { theme: { semantics }, } = useTheme(); const styles = useStyles(); const channelMuteState = useIsChannelMuted(channel); const channelMuteActive = channelMuteState.muted; const Icon = useCallback( () => channelMuteActive ? ( ) : ( ), [channelMuteActive, semantics.textOnAccent], ); const swipableActions = useMemo(() => { const items: SwipableActionItem[] = [ { id: 'openSheet', action: () => setChannelDetailSheetOpen(true), contentContainerStyle: [styles.contentContainerStyle, styles.elipsis], Content: OpenChannelDetailsButton, }, ]; items.push({ id: 'mute', action: () => { const action = channelMuteActive ? unmuteChannel : muteChannel; action(); swipableRegistry?.closeAll(); }, Content: Icon, contentContainerStyle: [styles.contentContainerStyle, styles.standard], }); return items; }, [ styles.contentContainerStyle, styles.elipsis, styles.standard, channelMuteActive, muteChannel, unmuteChannel, Icon, swipableRegistry, ]); const renderRightActions = useCallback( (_progress: SharedValue, translation: SharedValue) => ( ), [swipableActions], ); const swipableProps = useMemo( () => ({ renderRightActions, ..._swipableProps }), [_swipableProps, renderRightActions], ); return ( <> {children} setChannelDetailSheetOpen(false)} visible={channelDetailSheetOpen} height={424} > ); }; const useStyles = () => { const { theme: { semantics }, } = useTheme(); return useMemo( () => StyleSheet.create({ contentContainerStyle: { alignItems: 'center', flex: 1, justifyContent: 'center', }, elipsis: { backgroundColor: semantics.backgroundCoreSurfaceDefault, }, standard: { backgroundColor: semantics.accentPrimary, }, }), [semantics.accentPrimary, semantics.backgroundCoreSurfaceDefault], ); };