@@ -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 {
@@ -379,6 +385,7 @@ function LocalRoomCreateLoader(props: ILocalRoomCreateLoaderProps): ReactElement
379385}
380386
381387export class RoomView extends React . Component < IRoomProps , IRoomState > {
388+ private readonly askToJoinEnabled : boolean ;
382389 private readonly dispatcherRef : string ;
383390 private settingWatchers : string [ ] ;
384391
@@ -396,6 +403,8 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
396403 public constructor ( props : IRoomProps , context : React . ContextType < typeof SDKContext > ) {
397404 super ( props , context ) ;
398405
406+ this . askToJoinEnabled = SettingsStore . getValue ( "feature_ask_to_join" ) ;
407+
399408 if ( ! context . client ) {
400409 throw new Error ( "Unable to create RoomView without MatrixClient" ) ;
401410 }
@@ -440,6 +449,9 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
440449 liveTimeline : undefined ,
441450 narrow : false ,
442451 msc3946ProcessDynamicPredecessor : SettingsStore . getValue ( "feature_dynamic_room_predecessors" ) ,
452+ canAskToJoin : this . askToJoinEnabled ,
453+ askToJoin : false ,
454+ knocked : false ,
443455 } ;
444456
445457 this . dispatcherRef = dis . register ( this . onAction ) ;
@@ -644,6 +656,8 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
644656 )
645657 : false ,
646658 activeCall : roomId ? CallStore . instance . getActiveCall ( roomId ) : null ,
659+ askToJoin : this . context . roomViewStore . askToJoin ( ) ,
660+ knocked : this . context . roomViewStore . knocked ( ) ,
647661 } ;
648662
649663 if (
@@ -886,6 +900,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
886900 this . setState ( {
887901 room : room ,
888902 peekLoading : false ,
903+ canAskToJoin : this . askToJoinEnabled && room . getJoinRule ( ) === JoinRule . Knock ,
889904 } ) ;
890905 this . onRoomLoaded ( room ) ;
891906 } )
@@ -914,7 +929,10 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
914929 } else if ( room ) {
915930 // Stop peeking because we have joined this room previously
916931 this . context . client ?. stopPeeking ( ) ;
917- this . setState ( { isPeeking : false } ) ;
932+ this . setState ( {
933+ isPeeking : false ,
934+ canAskToJoin : this . askToJoinEnabled && room . getJoinRule ( ) === JoinRule . Knock ,
935+ } ) ;
918936 }
919937 }
920938 }
@@ -1588,6 +1606,7 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
15881606 roomId,
15891607 opts : { inviteSignUrl : signUrl } ,
15901608 metricsTrigger : this . state . room ?. getMyMembership ( ) === "invite" ? "Invite" : "RoomPreview" ,
1609+ canAskToJoin : this . state . canAskToJoin ,
15911610 } ) ;
15921611 }
15931612
@@ -1992,6 +2011,29 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
19922011 ) ;
19932012 }
19942013
2014+ private onSubmitAskToJoin = ( reason ?: string ) : void => {
2015+ const roomId = this . getRoomId ( ) ;
2016+
2017+ if ( isNotUndefined ( roomId ) ) {
2018+ dis . dispatch < SubmitAskToJoinPayload > ( {
2019+ action : Action . SubmitAskToJoin ,
2020+ roomId,
2021+ opts : { reason } ,
2022+ } ) ;
2023+ }
2024+ } ;
2025+
2026+ private onCancelAskToJoin = ( ) : void => {
2027+ const roomId = this . getRoomId ( ) ;
2028+
2029+ if ( isNotUndefined ( roomId ) ) {
2030+ dis . dispatch < CancelAskToJoinPayload > ( {
2031+ action : Action . CancelAskToJoin ,
2032+ roomId,
2033+ } ) ;
2034+ }
2035+ } ;
2036+
19952037 public render ( ) : ReactNode {
19962038 if ( ! this . context . client ) return null ;
19972039
@@ -2057,6 +2099,10 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
20572099 oobData = { this . props . oobData }
20582100 signUrl = { this . props . threepidInvite ?. signUrl }
20592101 roomId = { this . state . roomId }
2102+ askToJoin = { this . state . askToJoin }
2103+ knocked = { this . state . knocked }
2104+ onSubmitAskToJoin = { this . onSubmitAskToJoin }
2105+ onCancelAskToJoin = { this . onCancelAskToJoin }
20602106 />
20612107 </ ErrorBoundary >
20622108 </ div >
@@ -2131,6 +2177,22 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
21312177 }
21322178 }
21332179
2180+ if ( this . state . canAskToJoin ) {
2181+ return (
2182+ < div className = "mx_RoomView" >
2183+ < ErrorBoundary >
2184+ < RoomPreviewBar
2185+ room = { this . state . room }
2186+ askToJoin = { myMembership === "leave" || this . state . askToJoin }
2187+ knocked = { myMembership === "knock" || this . state . knocked }
2188+ onSubmitAskToJoin = { this . onSubmitAskToJoin }
2189+ onCancelAskToJoin = { this . onCancelAskToJoin }
2190+ />
2191+ </ ErrorBoundary >
2192+ </ div >
2193+ ) ;
2194+ }
2195+
21342196 // We have successfully loaded this room, and are not previewing.
21352197 // Display the "normal" room view.
21362198
0 commit comments