@@ -31,7 +31,7 @@ import { MatrixError } from "matrix-js-sdk/src/http-api";
3131import { ClientEvent } from "matrix-js-sdk/src/client" ;
3232import { CryptoEvent } from "matrix-js-sdk/src/crypto" ;
3333import { THREAD_RELATION_TYPE } from "matrix-js-sdk/src/models/thread" ;
34- import { HistoryVisibility } from "matrix-js-sdk/src/@types/partials" ;
34+ import { HistoryVisibility , JoinRule } from "matrix-js-sdk/src/@types/partials" ;
3535import { ISearchResults } from "matrix-js-sdk/src/@types/search" ;
3636import { IRoomTimelineData } from "matrix-js-sdk/src/models/event-timeline-set" ;
3737
@@ -119,6 +119,8 @@ import WidgetUtils from "../../utils/WidgetUtils";
119119import { shouldEncryptRoomWithSingle3rdPartyInvite } from "../../utils/room/shouldEncryptRoomWithSingle3rdPartyInvite" ;
120120import { WaitingForThirdPartyRoomView } from "./WaitingForThirdPartyRoomView" ;
121121import { isNotUndefined } from "../../Typeguards" ;
122+ import { CancelAskToJoinPayload } from "../../dispatcher/payloads/CancelAskToJoinPayload" ;
123+ import { SubmitAskToJoinPayload } from "../../dispatcher/payloads/SubmitAskToJoinPayload" ;
122124
123125const DEBUG = false ;
124126const PREVENT_MULTIPLE_JITSI_WITHIN = 30_000 ;
@@ -232,6 +234,10 @@ export interface IRoomState {
232234 liveTimeline ?: EventTimeline ;
233235 narrow : boolean ;
234236 msc3946ProcessDynamicPredecessor : boolean ;
237+
238+ canAskToJoin : boolean ;
239+ askToJoin : boolean ;
240+ knocked : boolean ;
235241}
236242
237243interface LocalRoomViewProps {
@@ -378,6 +384,7 @@ function LocalRoomCreateLoader(props: ILocalRoomCreateLoaderProps): ReactElement
378384}
379385
380386export class RoomView extends React . Component < IRoomProps , IRoomState > {
387+ private readonly askToJoinEnabled : boolean ;
381388 private readonly dispatcherRef : string ;
382389 private settingWatchers : string [ ] ;
383390
@@ -395,6 +402,8 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
395402 public constructor ( props : IRoomProps , context : React . ContextType < typeof SDKContext > ) {
396403 super ( props , context ) ;
397404
405+ this . askToJoinEnabled = SettingsStore . getValue ( "feature_ask_to_join" ) ;
406+
398407 if ( ! context . client ) {
399408 throw new Error ( "Unable to create RoomView without MatrixClient" ) ;
400409 }
@@ -439,6 +448,9 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
439448 liveTimeline : undefined ,
440449 narrow : false ,
441450 msc3946ProcessDynamicPredecessor : SettingsStore . getValue ( "feature_dynamic_room_predecessors" ) ,
451+ canAskToJoin : this . askToJoinEnabled ,
452+ askToJoin : false ,
453+ knocked : false ,
442454 } ;
443455
444456 this . dispatcherRef = dis . register ( this . onAction ) ;
@@ -643,6 +655,8 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
643655 )
644656 : false ,
645657 activeCall : roomId ? CallStore . instance . getActiveCall ( roomId ) : null ,
658+ askToJoin : this . context . roomViewStore . askToJoin ( ) ,
659+ knocked : this . context . roomViewStore . knocked ( ) ,
646660 } ;
647661
648662 if (
@@ -885,6 +899,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
885899 this . setState ( {
886900 room : room ,
887901 peekLoading : false ,
902+ canAskToJoin : this . askToJoinEnabled && room . getJoinRule ( ) === JoinRule . Knock ,
888903 } ) ;
889904 this . onRoomLoaded ( room ) ;
890905 } )
@@ -913,7 +928,10 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
913928 } else if ( room ) {
914929 // Stop peeking because we have joined this room previously
915930 this . context . client ?. stopPeeking ( ) ;
916- this . setState ( { isPeeking : false } ) ;
931+ this . setState ( {
932+ isPeeking : false ,
933+ canAskToJoin : this . askToJoinEnabled && room . getJoinRule ( ) === JoinRule . Knock ,
934+ } ) ;
917935 }
918936 }
919937 }
@@ -1587,6 +1605,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
15871605 roomId,
15881606 opts : { inviteSignUrl : signUrl } ,
15891607 metricsTrigger : this . state . room ?. getMyMembership ( ) === "invite" ? "Invite" : "RoomPreview" ,
1608+ canAskToJoin : this . state . canAskToJoin ,
15901609 } ) ;
15911610 }
15921611
@@ -1991,6 +2010,29 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
19912010 ) ;
19922011 }
19932012
2013+ private onSubmitAskToJoin = ( reason ?: string ) : void => {
2014+ const roomId = this . getRoomId ( ) ;
2015+
2016+ if ( isNotUndefined ( roomId ) ) {
2017+ dis . dispatch < SubmitAskToJoinPayload > ( {
2018+ action : Action . SubmitAskToJoin ,
2019+ roomId,
2020+ opts : { reason } ,
2021+ } ) ;
2022+ }
2023+ } ;
2024+
2025+ private onCancelAskToJoin = ( ) : void => {
2026+ const roomId = this . getRoomId ( ) ;
2027+
2028+ if ( isNotUndefined ( roomId ) ) {
2029+ dis . dispatch < CancelAskToJoinPayload > ( {
2030+ action : Action . CancelAskToJoin ,
2031+ roomId,
2032+ } ) ;
2033+ }
2034+ } ;
2035+
19942036 public render ( ) : ReactNode {
19952037 if ( ! this . context . client ) return null ;
19962038
@@ -2056,6 +2098,10 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
20562098 oobData = { this . props . oobData }
20572099 signUrl = { this . props . threepidInvite ?. signUrl }
20582100 roomId = { this . state . roomId }
2101+ askToJoin = { this . state . askToJoin }
2102+ knocked = { this . state . knocked }
2103+ onSubmitAskToJoin = { this . onSubmitAskToJoin }
2104+ onCancelAskToJoin = { this . onCancelAskToJoin }
20592105 />
20602106 </ ErrorBoundary >
20612107 </ div >
@@ -2130,6 +2176,22 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
21302176 }
21312177 }
21322178
2179+ if ( this . state . canAskToJoin && [ "knock" , "leave" ] . includes ( myMembership ) ) {
2180+ return (
2181+ < div className = "mx_RoomView" >
2182+ < ErrorBoundary >
2183+ < RoomPreviewBar
2184+ room = { this . state . room }
2185+ askToJoin = { myMembership === "leave" || this . state . askToJoin }
2186+ knocked = { myMembership === "knock" || this . state . knocked }
2187+ onSubmitAskToJoin = { this . onSubmitAskToJoin }
2188+ onCancelAskToJoin = { this . onCancelAskToJoin }
2189+ />
2190+ </ ErrorBoundary >
2191+ </ div >
2192+ ) ;
2193+ }
2194+
21332195 // We have successfully loaded this room, and are not previewing.
21342196 // Display the "normal" room view.
21352197
0 commit comments