@@ -26,25 +26,23 @@ import {
2626} from "@thunderstore/thunderstore-api" ;
2727import { ApiAction } from "@thunderstore/ts-api-react-actions" ;
2828
29- import { NotLoggedIn } from "app/commonComponents/NotLoggedIn/NotLoggedIn" ;
3029import { type OutletContextShape } from "app/root" ;
3130import { makeTeamSettingsTabLoader } from "cyberstorm/utils/dapperClientLoaders" ;
31+ import { isTeamOwner } from "cyberstorm/utils/permissions" ;
3232import { useStrongForm } from "cyberstorm/utils/StrongForm/useStrongForm" ;
3333
3434export const clientLoader = makeTeamSettingsTabLoader (
35- // TODO: add end point for checking can leave/disband status.
36- async ( dapper , teamName ) => ( { teamName } )
35+ async ( dapper , teamName ) => ( {
36+ permissions : dapper . getCurrentUserTeamPermissions ( teamName ) ,
37+ } )
3738) ;
3839
3940export default function Settings ( ) {
40- const { teamName } = useLoaderData < typeof clientLoader > ( ) ;
41+ const { permissions , teamName } = useLoaderData < typeof clientLoader > ( ) ;
4142 const outletContext = useOutletContext ( ) as OutletContextShape ;
4243 const toast = useToast ( ) ;
4344 const navigate = useNavigate ( ) ;
4445
45- const currentUser = outletContext . currentUser ?. username ;
46- if ( ! currentUser ) return < NotLoggedIn /> ;
47-
4846 async function moveToTeams ( ) {
4947 toast . addToast ( {
5048 csVariant : "info" ,
@@ -56,56 +54,51 @@ export default function Settings() {
5654
5755 return (
5856 < Suspense fallback = { < div > Loading...</ div > } >
59- < Await resolve = { teamName } >
60- { ( resolvedTeamName ) => (
57+ < Await resolve = { permissions } >
58+ { ( resolvedPermissions ) => (
6159 < div className = "settings-items" >
6260 < div className = "settings-items__item" >
6361 < div className = "settings-items__meta" >
6462 < p className = "settings-items__title" > Leave team</ p >
65- < p className = "settings-items__description" > Leave your team</ p >
63+ < p className = "settings-items__description" >
64+ Resign from the team
65+ </ p >
6666 </ div >
6767 < div className = "settings-items__content" >
68- < NewAlert csVariant = "danger" >
69- You cannot currently leave this team as you are it's last
70- owner.
71- </ NewAlert >
72- < p >
73- If you are the owner of the team, you can only leave if the
74- team has another owner assigned.
75- </ p >
76- < LeaveTeamForm
77- userName = { currentUser }
78- teamName = { resolvedTeamName }
79- toast = { toast }
80- config = { outletContext . requestConfig }
81- updateTrigger = { moveToTeams }
82- />
68+ { resolvedPermissions . can_leave_team ? (
69+ < LeaveTeamForm
70+ userName = { outletContext . currentUser ?. username ?? "" }
71+ teamName = { teamName }
72+ toast = { toast }
73+ config = { outletContext . requestConfig }
74+ updateTrigger = { moveToTeams }
75+ />
76+ ) : (
77+ < LastOwnerAlert />
78+ ) }
8379 </ div >
8480 </ div >
8581 < div className = "settings-items__separator" />
8682 < div className = "settings-items__item" >
8783 < div className = "settings-items__meta" >
8884 < p className = "settings-items__title" > Disband team</ p >
8985 < p className = "settings-items__description" >
90- Disband your team completely
86+ Remove the team completely
9187 </ p >
9288 </ div >
9389 < div className = "settings-items__content" >
94- < NewAlert csVariant = "danger" >
95- You cannot currently disband this team as it has packages.
96- </ NewAlert >
97- < p > You are about to disband the team { resolvedTeamName } .</ p >
98- < p >
99- Be aware you can currently only disband teams with no
100- packages. If you need to archive a team with existing pages,
101- contact Mythic#0001 on the Thunderstore Discord.
102- </ p >
103- < DisbandTeamForm
104- teamName = { resolvedTeamName }
105- updateTrigger = { moveToTeams }
106- config = { outletContext . requestConfig }
107- toast = { toast }
108- />
90+ { resolvedPermissions . can_disband_team ? (
91+ < DisbandTeamForm
92+ teamName = { teamName }
93+ updateTrigger = { moveToTeams }
94+ config = { outletContext . requestConfig }
95+ toast = { toast }
96+ />
97+ ) : isTeamOwner ( teamName , outletContext . currentUser ) ? (
98+ < TeamHasPackagesAlert />
99+ ) : (
100+ < NotTeamOwnerAlert />
101+ ) }
109102 </ div >
110103 </ div >
111104 </ div >
@@ -115,6 +108,28 @@ export default function Settings() {
115108 ) ;
116109}
117110
111+ const LastOwnerAlert = ( ) => (
112+ < NewAlert csVariant = "info" >
113+ You cannot currently leave this team as you are its last owner.
114+ < br />
115+ To leave the team, you need to assign another owner to it. Alternatively,
116+ you can disband the whole team.
117+ </ NewAlert >
118+ ) ;
119+
120+ const TeamHasPackagesAlert = ( ) => (
121+ < NewAlert csVariant = "info" >
122+ You cannot currently disband this team as it has packages.
123+ < br />
124+ If you need to archive this team, contact #support in the{ " " }
125+ < a href = "https://discord.thunderstore.io/" > Thunderstore Discord</ a > .
126+ </ NewAlert >
127+ ) ;
128+
129+ const NotTeamOwnerAlert = ( ) => (
130+ < NewAlert csVariant = "info" > Only team owners can disband teams.</ NewAlert >
131+ ) ;
132+
118133function LeaveTeamForm ( props : {
119134 userName : string ;
120135 teamName : string ;
@@ -147,7 +162,7 @@ function LeaveTeamForm(props: {
147162 < Modal
148163 open = { open }
149164 onOpenChange = { setOpen }
150- titleContent = "Leave team"
165+ titleContent = "Leave team? "
151166 csSize = "small"
152167 trigger = {
153168 < NewButton
@@ -170,7 +185,7 @@ function LeaveTeamForm(props: {
170185 team = { teamName }
171186 csVariant = "cyber"
172187 >
173- { teamName }
188+ { teamName } .
174189 </ NewLink >
175190 </ span >
176191 </ Modal . Body >
@@ -269,7 +284,7 @@ function DisbandTeamForm(props: {
269284 < Modal
270285 open = { open }
271286 onOpenChange = { setOpen }
272- titleContent = "Disband team"
287+ titleContent = "Disband team? "
273288 csSize = "small"
274289 trigger = {
275290 < NewButton
@@ -292,7 +307,7 @@ function DisbandTeamForm(props: {
292307 team = { teamName }
293308 csVariant = "cyber"
294309 >
295- { teamName }
310+ { teamName } .
296311 </ NewLink >
297312 </ div >
298313 < div >
0 commit comments