@@ -31,6 +31,8 @@ interface ChangePageDiagState extends ChangePageDiagParams {
3131 store : Store
3232 isOpen : Bo
3333 atRect : Rect
34+ pullLeft ?: Bo
35+ windowWidth ?: Nr
3436}
3537
3638
@@ -69,6 +71,9 @@ const ChangePageDialog = createComponent({
6971 ...props ,
7072 isOpen : true ,
7173 atRect,
74+ pullLeft : props . pullLeft ||
75+ props . showViewAnswerButton , // (hack) then it's the icon to the left of the title
76+ windowWidth : window . innerWidth ,
7277 } satisfies Partial < ChangePageDiagState > ) ;
7378 } ,
7479
@@ -90,6 +95,10 @@ const ChangePageDialog = createComponent({
9095 const isOwnOrCore = isOwnOrStaff || user_isTrustMinNotThreat ( me , TrustLevel . CoreMember ) ;
9196 const isStaffOrTrusted = isStaff ( me ) || user_isTrustMinNotThreat ( me , TrustLevel . Trusted ) ;
9297
98+ let anyChatPurpose : RElm | U ;
99+ let anyViewMembersBtn : RElm | U ;
100+ let anyEditPurposeBtn : RElm | U ;
101+ let anyLeaveButton : RElm | U ;
93102 let anyViewAnswerButton ;
94103 let changeStatusTitle ;
95104 let setNewListItem ;
@@ -138,6 +147,59 @@ const ChangePageDialog = createComponent({
138147
139148 const origPost = page . postsByNr [ BodyNr ] ;
140149
150+ const isChat = page_isChat ( page . pageRole ) ;
151+ if ( isChat ) {
152+ anyChatPurpose = rFr ( { } ,
153+ // Maybe it's obvious that this text is the chat purpose? It'd typically start with
154+ // "Here you can ...". Could skip? Or, show the title again, with an edit button
155+ // just after? And an edit button after the purpose, too?
156+ r . div ( { className : 's_ExplDrp_Ttl n_Purp' } , t . c . Purpose ) , // [chat_purpose_header]
157+ r . div ( { className : 's_ExplDrp_DescIt' } ,
158+ debiki2 . page . PostBody ( { store, post : origPost } ) ) ) ;
159+
160+ // A list chat members button, unless it's a joinless chat (which one doesn't need
161+ // to join to post messages, doesn't have members (unless type changed to joinless,
162+ // when there already were members, hmm)). [0_joinless_chat_members]
163+ anyViewMembersBtn = page . pageRole === PageRole . JoinlessChat ? null :
164+ r . div ( { className : 's_ExplDrp_ActIt' } ,
165+ Button ( {
166+ onClick : ( ) => {
167+ // REFACTOR: Break out fn! [break_out_view_chat_membs_fn]
168+ ReactActions . setPagebarOpen ( true ) ;
169+ sidebar . contextBar . showUsers ( ) ;
170+ setTimeout ( ( ) => { // [highl_contextbar]
171+ sidebar . contextBar . highligtDuringMillis ( 700 ) ;
172+ } )
173+ this . close ( ) ;
174+ } } ,
175+ // Elsewhere, id: 'e2eWB_ViewPeopleB'
176+ r . span ( { className : 'e_ChPgD_ViewMembB' } , t . wb . ViewChatMembers ) ,
177+ ) ) ;
178+
179+ const isChatMember = me_isPageMember ( me , page ) ;
180+
181+ // UX BUG, harmles: Can leave chat page, when editor open & typing a message already.
182+ // Then, when submitting, there's this error: [leave_chat_ux_bug]
183+ // "not a member of this chat channel [EsE4UGY7]".
184+ anyLeaveButton = ! isChatMember ? null : r . div ( { className : 's_ExplDrp_ActIt' } ,
185+ Button ( {
186+ onClick : ( ) => {
187+ Server . leavePage ( ) ;
188+ this . close ( ) ;
189+ } } ,
190+ // Elsewhere, id: 'e2eWB_LeaveB'
191+ r . span ( { className : 'e_ChPgD_LeaveB' } , t . wb . LeaveThisChat ) ,
192+ ) ) ;
193+
194+ anyEditPurposeBtn = ! isOwnOrStaff ? null : r . div ( { className : 's_ExplDrp_ActIt' } ,
195+ Button ( { className : 'e_ChPgD_EdPurpB' ,
196+ onClick : ( ) => {
197+ editor . openToEditChatTitleAndPurpose ( ) ;
198+ this . close ( ) ;
199+ } } ,
200+ t . wb . EditChat ) ) ;
201+ }
202+
141203 // Ideas and Problems can be solved [tpc_typ_solv], and then
142204 // pat cannot change their doing status, unless un-selecting
143205 // the solution post.
@@ -309,11 +371,46 @@ const ChangePageDialog = createComponent({
309371 }
310372 }
311373
374+ // If ever opening, although empty, that'd be a bug. [empty_change_page_dlg]
375+ // (It's safe to forget to update this list — there'll be a debug build assertion failure.)
376+ // @ifdef DEBUG
377+ dieIf ( state . isOpen && ! (
378+ anyChatPurpose
379+ || anyViewMembersBtn
380+ || anyLeaveButton
381+ || anyEditPurposeBtn
382+ || anyViewAnswerButton
383+ || changeStatusTitle
384+ || setNewListItem
385+ || setPlannedListItem
386+ || setStartedListItem
387+ || setDoneListItem
388+ || assignBtn
389+ || changeCategoryListItem
390+ || changeTopicTypeListItem
391+ || reopenListItem
392+ || closeListItem
393+ || deletePageListItem
394+ || undeletePageListItem
395+ || changeComtOrderListItem
396+ || changeComtNestingListItem ) , 'TyEEMPYTCHAPAD' ) ;
397+ // @endif
398+
312399 return (
313400 DropdownModal ( { show : state . isOpen , onHide : this . close , atRect : state . atRect ,
314- pullLeft : state . showViewAnswerButton , // (hack) then it's the icon to the left of the title
315- showCloseButton : true , dialogClassName2 : 's_ChPgD' } ,
401+ pullLeft : state . pullLeft , windowWidth : state . windowWidth ,
402+ showCloseButton : true , dialogClassName2 : 's_ChPgD' ,
403+ allowWide : ! ! anyChatPurpose ,
404+ } ,
405+ anyChatPurpose ,
406+ anyViewMembersBtn ,
407+ anyLeaveButton ,
408+ anyEditPurposeBtn ,
316409 anyViewAnswerButton ,
410+ // If is a chat, and pat is a mod or the page owner, then, there's chat related
411+ // buttons above, and alter page buttons below — then, nice with a separator line
412+ // in between.
413+ isOwnOrStaff && anyChatPurpose ? r . hr ( ) : null ,
317414 changeStatusTitle ,
318415 setNewListItem ,
319416 setPlannedListItem ,
0 commit comments