[FIX] Opening a new DM from user card (#24623)
* Change `useRoomIcon` signature * Fix `IRoom[t]` and `ISubscription[t]` * Ensure `IRoom['uids']` is not mandatory * Fix some typingspull/24752/head^2
parent
d3b1b162fa
commit
c04d544ff8
@ -1,15 +0,0 @@ |
||||
import React from 'react'; |
||||
|
||||
import { useUserId } from '../../../contexts/UserContext'; |
||||
import { usePresence } from '../../../hooks/usePresence'; |
||||
import RoomHeader from './RoomHeader'; |
||||
|
||||
const DirectRoomHeader = ({ room, slots }) => { |
||||
const userId = useUserId(); |
||||
const directUserId = room.uids.filter((uid) => uid !== userId).shift(); |
||||
const directUserData = usePresence(directUserId); |
||||
|
||||
return <RoomHeader slots={slots} room={room} topic={directUserData?.statusText} />; |
||||
}; |
||||
|
||||
export default DirectRoomHeader; |
||||
@ -0,0 +1,32 @@ |
||||
import React, { ReactElement } from 'react'; |
||||
|
||||
import { IRoom } from '../../../../definition/IRoom'; |
||||
import { useUserId } from '../../../contexts/UserContext'; |
||||
import { usePresence } from '../../../hooks/usePresence'; |
||||
import RoomHeader from './RoomHeader'; |
||||
|
||||
type DirectRoomHeaderProps = { |
||||
room: IRoom; |
||||
slots: { |
||||
start?: unknown; |
||||
preContent?: unknown; |
||||
insideContent?: unknown; |
||||
posContent?: unknown; |
||||
end?: unknown; |
||||
toolbox?: { |
||||
pre?: unknown; |
||||
content?: unknown; |
||||
pos?: unknown; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
const DirectRoomHeader = ({ room, slots }: DirectRoomHeaderProps): ReactElement => { |
||||
const userId = useUserId(); |
||||
const directUserId = room.uids?.filter((uid) => uid !== userId).shift(); |
||||
const directUserData = usePresence(directUserId); |
||||
|
||||
return <RoomHeader slots={slots} room={room} topic={directUserData?.statusText} />; |
||||
}; |
||||
|
||||
export default DirectRoomHeader; |
||||
@ -1,15 +1,20 @@ |
||||
import React from 'react'; |
||||
import React, { ReactElement } from 'react'; |
||||
|
||||
import { isOmnichannelRoom } from '../../../../definition/IRoom'; |
||||
import { IRoom, isOmnichannelRoom } from '../../../../definition/IRoom'; |
||||
import Header from '../../../components/Header'; |
||||
import { OmnichannelRoomIcon } from '../../../components/RoomIcon/OmnichannelRoomIcon'; |
||||
import { useRoomIcon } from '../../../hooks/useRoomIcon'; |
||||
|
||||
const HeaderIconWithRoom = ({ room }) => { |
||||
type HeaderIconWithRoomProps = { |
||||
room: IRoom; |
||||
}; |
||||
|
||||
const HeaderIconWithRoom = ({ room }: HeaderIconWithRoomProps): ReactElement => { |
||||
const icon = useRoomIcon(room); |
||||
if (isOmnichannelRoom(room)) { |
||||
return <OmnichannelRoomIcon room={room} size='x20' placement='default' />; |
||||
} |
||||
|
||||
return <Header.Icon icon={icon} />; |
||||
}; |
||||
export default HeaderIconWithRoom; |
||||
@ -1,11 +1,16 @@ |
||||
import React from 'react'; |
||||
import React, { ReactElement } from 'react'; |
||||
|
||||
import { IRoom } from '../../../../definition/IRoom'; |
||||
import Header from '../../../components/Header'; |
||||
import { useRoomIcon } from '../../../hooks/useRoomIcon'; |
||||
import { roomCoordinator } from '../../../lib/rooms/roomCoordinator'; |
||||
|
||||
const ParentRoom = ({ room }) => { |
||||
const href = roomCoordinator.getRouteLink(room.t, room); |
||||
type ParentRoomProps = { |
||||
room: Pick<IRoom, '_id' | 't' | 'name' | 'fname' | 'prid' | 'u'>; |
||||
}; |
||||
|
||||
const ParentRoom = ({ room }: ParentRoomProps): ReactElement => { |
||||
const href = roomCoordinator.getRouteLink(room.t, room) || undefined; |
||||
const icon = useRoomIcon(room); |
||||
|
||||
return ( |
||||
@ -1,17 +0,0 @@ |
||||
import React from 'react'; |
||||
|
||||
import { useUserSubscription } from '../../../contexts/UserContext'; |
||||
import ParentRoom from './ParentRoom'; |
||||
import ParentRoomWithEndpointData from './ParentRoomWithEndpointData'; |
||||
|
||||
const ParentRoomWithData = ({ room }) => { |
||||
const subscription = useUserSubscription(room.prid); |
||||
|
||||
if (subscription) { |
||||
return <ParentRoom room={subscription} />; |
||||
} |
||||
|
||||
return <ParentRoomWithEndpointData rid={room.prid} />; |
||||
}; |
||||
|
||||
export default ParentRoomWithData; |
||||
@ -0,0 +1,28 @@ |
||||
import React, { ReactElement } from 'react'; |
||||
|
||||
import { IRoom } from '../../../../definition/IRoom'; |
||||
import { useUserSubscription } from '../../../contexts/UserContext'; |
||||
import ParentRoom from './ParentRoom'; |
||||
import ParentRoomWithEndpointData from './ParentRoomWithEndpointData'; |
||||
|
||||
type ParentRoomWithDataProps = { |
||||
room: IRoom; |
||||
}; |
||||
|
||||
const ParentRoomWithData = ({ room }: ParentRoomWithDataProps): ReactElement => { |
||||
const { prid } = room; |
||||
|
||||
if (!prid) { |
||||
throw new Error('Parent room ID is missing'); |
||||
} |
||||
|
||||
const subscription = useUserSubscription(prid); |
||||
|
||||
if (subscription) { |
||||
return <ParentRoom room={subscription} />; |
||||
} |
||||
|
||||
return <ParentRoomWithEndpointData rid={prid} />; |
||||
}; |
||||
|
||||
export default ParentRoomWithData; |
||||
@ -1,34 +0,0 @@ |
||||
import React, { useEffect } from 'react'; |
||||
|
||||
import Header from '../../../components/Header'; |
||||
import { useEndpoint } from '../../../contexts/ServerContext'; |
||||
import { AsyncStatePhase, useAsyncState } from '../../../hooks/useAsyncState'; |
||||
import ParentRoom from './ParentRoom'; |
||||
|
||||
const ParentRoomWithEndpointData = ({ rid }) => { |
||||
const { resolve, reject, reset, phase, value } = useAsyncState(); |
||||
const getData = useEndpoint('GET', 'rooms.info'); |
||||
|
||||
useEffect(() => { |
||||
(async () => { |
||||
reset(); |
||||
getData({ roomId: rid }) |
||||
.then(resolve) |
||||
.catch((error) => { |
||||
reject(error); |
||||
}); |
||||
})(); |
||||
}, [reset, getData, rid, resolve, reject]); |
||||
|
||||
if (AsyncStatePhase.LOADING === phase) { |
||||
return <Header.Tag.Skeleton />; |
||||
} |
||||
|
||||
if (AsyncStatePhase.ERROR === phase || !value?.room) { |
||||
return null; |
||||
} |
||||
|
||||
return <ParentRoom room={value.room} />; |
||||
}; |
||||
|
||||
export default ParentRoomWithEndpointData; |
||||
@ -0,0 +1,27 @@ |
||||
import React, { ReactElement } from 'react'; |
||||
|
||||
import { IRoom } from '../../../../definition/IRoom'; |
||||
import Header from '../../../components/Header'; |
||||
import { AsyncStatePhase } from '../../../hooks/useAsyncState'; |
||||
import { useEndpointData } from '../../../hooks/useEndpointData'; |
||||
import ParentRoom from './ParentRoom'; |
||||
|
||||
type ParentRoomWithEndpointDataProps = { |
||||
rid: IRoom['_id']; |
||||
}; |
||||
|
||||
const ParentRoomWithEndpointData = ({ rid }: ParentRoomWithEndpointDataProps): ReactElement | null => { |
||||
const { phase, value } = useEndpointData('rooms.info', { roomId: rid }); |
||||
|
||||
if (AsyncStatePhase.LOADING === phase) { |
||||
return <Header.Tag.Skeleton />; |
||||
} |
||||
|
||||
if (AsyncStatePhase.REJECTED === phase || !value?.room) { |
||||
return null; |
||||
} |
||||
|
||||
return <ParentRoom room={value.room} />; |
||||
}; |
||||
|
||||
export default ParentRoomWithEndpointData; |
||||
@ -0,0 +1 @@ |
||||
export type RoomType = 'c' | 'd' | 'p' | 'l' | 'v'; |
||||
Loading…
Reference in new issue