@@ -18,8 +18,8 @@ import {
1818 StatusBadge ,
1919 Trophy ,
2020 useKeyboardShortcut ,
21- useRouterStuff ,
2221 User ,
22+ useRouterStuff ,
2323 Users ,
2424} from "@dub/ui" ;
2525import { cn , COUNTRIES , currencyFormatter , OG_AVATAR_URL } from "@dub/utils" ;
@@ -30,6 +30,24 @@ import { NetworkPartnerChangeHistory } from "./network-partner-change-history";
3030
3131type NetworkPartnerSheetTabId = "about" | "programs" | "duplicates" ;
3232
33+ function isDirectDraftToApprovedNetworkApproval (
34+ partner : AdminNetworkPartner ,
35+ ) : boolean {
36+ if ( partner . networkStatus !== "approved" ) {
37+ return false ;
38+ }
39+
40+ const networkLogs = ( partner . changeHistoryLog ?? [ ] ) . filter (
41+ ( entry ) => entry . field === "networkStatus" ,
42+ ) ;
43+
44+ return (
45+ networkLogs . length === 1 &&
46+ networkLogs [ 0 ] . from === "draft" &&
47+ networkLogs [ 0 ] . to === "approved"
48+ ) ;
49+ }
50+
3351export function NetworkPartnerApplicationSheet ( {
3452 isOpen,
3553 setIsOpen,
@@ -45,13 +63,16 @@ export function NetworkPartnerApplicationSheet({
4563 onNext ?: ( ) => void ;
4664 onReview : (
4765 partner : AdminNetworkPartner ,
48- status : "approved" | "rejected" ,
66+ status : "approved" | "rejected" | "draft" ,
4967 ) => Promise < void > ;
5068} ) {
5169 const [ currentTabId , setCurrentTabId ] =
5270 useState < NetworkPartnerSheetTabId > ( "about" ) ;
5371 const { queryParams } = useRouterStuff ( ) ;
5472
73+ const showRevertToDraftInsteadOfReject =
74+ isDirectDraftToApprovedNetworkApproval ( partner ) ;
75+
5576 const PartnerDetails = (
5677 < div className = "rounded-lg border border-neutral-200 bg-neutral-100 p-3" >
5778 < div className = "flex items-center gap-4" >
@@ -95,6 +116,21 @@ export function NetworkPartnerApplicationSheet({
95116 confirmShortcutOptions : { sheet : true , modal : true } ,
96117 } ) ;
97118
119+ const {
120+ setShowConfirmModal : setShowRevertToDraftConfirm ,
121+ confirmModal : revertToDraftModal ,
122+ } = useConfirmModal ( {
123+ title : "Revert network profile to draft" ,
124+ description : PartnerDetails ,
125+ confirmText : "Revert to draft" ,
126+ confirmVariant : "danger" ,
127+ onConfirm : async ( ) => {
128+ await onReview ( partner , "draft" ) ;
129+ } ,
130+ confirmShortcut : "r" ,
131+ confirmShortcutOptions : { sheet : true , modal : true } ,
132+ } ) ;
133+
98134 useKeyboardShortcut (
99135 "ArrowRight" ,
100136 ( ) => {
@@ -122,7 +158,14 @@ export function NetworkPartnerApplicationSheet({
122158
123159 useKeyboardShortcut ( "r" , ( ) => setShowRejectConfirm ( true ) , {
124160 sheet : true ,
125- enabled : ! [ "rejected" , "trusted" ] . includes ( partner . networkStatus ) ,
161+ enabled :
162+ ! showRevertToDraftInsteadOfReject &&
163+ ! [ "rejected" , "trusted" ] . includes ( partner . networkStatus ) ,
164+ } ) ;
165+
166+ useKeyboardShortcut ( "r" , ( ) => setShowRevertToDraftConfirm ( true ) , {
167+ sheet : true ,
168+ enabled : showRevertToDraftInsteadOfReject ,
126169 } ) ;
127170
128171 return (
@@ -136,6 +179,7 @@ export function NetworkPartnerApplicationSheet({
136179 >
137180 { approveModal }
138181 { rejectModal }
182+ { revertToDraftModal }
139183
140184 < div className = "flex size-full flex-col" >
141185 < div className = "flex h-16 shrink-0 items-center justify-between border-b border-neutral-200 px-6 py-4" >
@@ -220,19 +264,30 @@ export function NetworkPartnerApplicationSheet({
220264
221265 < div className = "shrink-0 border-t border-neutral-200 p-5" >
222266 < div className = "flex justify-end gap-2" >
223- < Button
224- type = "button"
225- variant = "secondary"
226- text = "Reject"
227- className = "w-fit shrink-0"
228- shortcut = "R"
229- onClick = { ( ) => setShowRejectConfirm ( true ) }
230- disabledTooltip = {
231- [ "rejected" , "trusted" ] . includes ( partner . networkStatus )
232- ? `Cannot reject a ${ partner . networkStatus } partner.`
233- : undefined
234- }
235- />
267+ { showRevertToDraftInsteadOfReject ? (
268+ < Button
269+ type = "button"
270+ variant = "secondary"
271+ text = "Revert to draft"
272+ className = "w-fit shrink-0"
273+ shortcut = "R"
274+ onClick = { ( ) => setShowRevertToDraftConfirm ( true ) }
275+ />
276+ ) : (
277+ < Button
278+ type = "button"
279+ variant = "secondary"
280+ text = "Reject"
281+ className = "w-fit shrink-0"
282+ shortcut = "R"
283+ onClick = { ( ) => setShowRejectConfirm ( true ) }
284+ disabledTooltip = {
285+ [ "rejected" , "trusted" ] . includes ( partner . networkStatus )
286+ ? `Cannot reject a ${ partner . networkStatus } partner.`
287+ : undefined
288+ }
289+ />
290+ ) }
236291 < Button
237292 type = "button"
238293 variant = "primary"
@@ -282,7 +337,12 @@ function NetworkPartnerSheetTabs({
282337 id : "programs" ,
283338 label : "Programs" ,
284339 icon : Trophy ,
285- badge : programsCount > 99 ? "99+" : programsCount ,
340+ badge :
341+ programsCount === 0
342+ ? undefined
343+ : programsCount > 99
344+ ? "99+"
345+ : programsCount ,
286346 } ,
287347 ...( duplicatesCount > 0
288348 ? [
0 commit comments