import React, { useCallback, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import styled from 'styled-components'; import { joinOpenGroupV2WithUIEvents, parseOpenGroupV2, } from '../../../session/apis/open_group_api/opengroupV2/JoinOpenGroupV2'; import { sogsV3FetchPreviewBase64 } from '../../../session/apis/open_group_api/sogsv3/sogsV3FetchFile'; import { updateDefaultBase64RoomData } from '../../../state/ducks/defaultRooms'; import { StateType } from '../../../state/reducer'; import { Avatar, AvatarSize } from '../../avatar/Avatar'; import { Flex } from '../../basic/Flex'; import { PillContainerHoverable, PillTooltipWrapper } from '../../basic/PillContainer'; import { SessionSpinner } from '../../basic/SessionSpinner'; import { H3 } from '../../basic/Text'; // tslint:disable: no-void-expression export type JoinableRoomProps = { completeUrl: string; name: string; roomId: string; imageId?: string; onClick: (completeUrl: string) => void; base64Data?: string; }; const SessionJoinableRoomAvatar = (props: JoinableRoomProps) => { const dispatch = useDispatch(); useEffect(() => { let isCancelled = false; try { const parsedInfos = parseOpenGroupV2(props.completeUrl); const imageID = props.imageId; if (parsedInfos) { if (props.base64Data) { return; } if (isCancelled) { return; } sogsV3FetchPreviewBase64({ ...parsedInfos, imageID }) .then(base64 => { if (isCancelled) { return; } const payload = { roomId: props.roomId, base64Data: base64 || '', }; dispatch(updateDefaultBase64RoomData(payload)); }) .catch(e => { if (isCancelled) { return; } window?.log?.warn('sogsV3FetchPreview failed', e); const payload = { roomId: props.roomId, base64Data: '', }; dispatch(updateDefaultBase64RoomData(payload)); }); } } catch (e) { window?.log?.warn(e); } return () => { isCancelled = true; }; }, [props.imageId, props.completeUrl]); return ( props.onClick(props.completeUrl)} /> ); }; const StyledRoomName = styled(Flex)` overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 0 10px; `; const SessionJoinableRoomName = (props: JoinableRoomProps) => { return {props.name}; }; const SessionJoinableRoomRow = (props: JoinableRoomProps) => { return ( { props.onClick(props.completeUrl); }} margin="5px" padding="5px" > ); }; export const SessionJoinableRooms = (props: { onRoomClicked: () => void }) => { const joinableRooms = useSelector((state: StateType) => state.defaultRooms); const onRoomClicked = useCallback( (loading: boolean) => { if (loading) { props.onRoomClicked(); } }, [props.onRoomClicked] ); if (!joinableRooms.inProgress && !joinableRooms.rooms?.length) { window?.log?.info('no default joinable rooms yet and not in progress'); return null; } const componentToRender = joinableRooms.inProgress ? ( ) : ( joinableRooms.rooms.map(r => { return ( { void joinOpenGroupV2WithUIEvents(completeUrl, true, false, onRoomClicked); }} /> ); }) ); return (

{componentToRender} ); };