@@ -6,9 +6,10 @@ import { Blossom } from "../upload/blossom";
66import useLogin from "../hooks/login" ;
77import usePublisher from "../hooks/publisher" ;
88import { Nip96 , Nip96FileList } from "../upload/nip96" ;
9- import { AdminSelf , Route96 } from "../upload/admin" ;
9+ import { AdminSelf , Route96 , Report } from "../upload/admin" ;
1010import { FormatBytes } from "../const" ;
11- import Report from "../report.json" ;
11+ import ReportJson from "../report.json" ;
12+ import ReportList from "./reports" ;
1213
1314export default function Upload ( ) {
1415 const [ type , setType ] = useState < "blossom" | "nip96" > ( "blossom" ) ;
@@ -21,14 +22,21 @@ export default function Upload() {
2122 const [ results , setResults ] = useState < Array < object > > ( [ ] ) ;
2223 const [ listedFiles , setListedFiles ] = useState < Nip96FileList > ( ) ;
2324 const [ adminListedFiles , setAdminListedFiles ] = useState < Nip96FileList > ( ) ;
25+ const [ adminListedReports , setAdminListedReports ] = useState < {
26+ total : number ;
27+ page : number ;
28+ count : number ;
29+ files : Array < Report > ;
30+ } > ( ) ;
2431 const [ listedPage , setListedPage ] = useState ( 0 ) ;
2532 const [ adminListedPage , setAdminListedPage ] = useState ( 0 ) ;
33+ const [ adminReportsPage , setAdminReportsPage ] = useState ( 0 ) ;
2634 const [ mimeFilter , setMimeFilter ] = useState < string > ( ) ;
2735
2836 const login = useLogin ( ) ;
2937 const pub = usePublisher ( ) ;
3038
31- const legacyFiles = Report as Record < string , Array < string > > ;
39+ const legacyFiles = ReportJson as Record < string , Array < string > > ;
3240 const myLegacyFiles = login ? ( legacyFiles [ login . pubkey ] ?? [ ] ) : [ ] ;
3341
3442 const url =
@@ -99,6 +107,43 @@ export default function Upload() {
99107 }
100108 }
101109
110+ async function listReports ( n : number ) {
111+ if ( ! pub ) return ;
112+ try {
113+ setError ( undefined ) ;
114+ const uploader = new Route96 ( url , pub ) ;
115+ const result = await uploader . listReports ( n , 50 ) ;
116+ setAdminListedReports ( result ) ;
117+ } catch ( e ) {
118+ if ( e instanceof Error ) {
119+ setError ( e . message . length > 0 ? e . message : "List reports failed" ) ;
120+ } else if ( typeof e === "string" ) {
121+ setError ( e ) ;
122+ } else {
123+ setError ( "List reports failed" ) ;
124+ }
125+ }
126+ }
127+
128+ async function acknowledgeReport ( reportId : number ) {
129+ if ( ! pub ) return ;
130+ try {
131+ setError ( undefined ) ;
132+ const uploader = new Route96 ( url , pub ) ;
133+ await uploader . acknowledgeReport ( reportId ) ;
134+ // Refresh the reports list
135+ await listReports ( adminReportsPage ) ;
136+ } catch ( e ) {
137+ if ( e instanceof Error ) {
138+ setError ( e . message . length > 0 ? e . message : "Acknowledge failed" ) ;
139+ } else if ( typeof e === "string" ) {
140+ setError ( e ) ;
141+ } else {
142+ setError ( "Acknowledge failed" ) ;
143+ }
144+ }
145+ }
146+
102147 async function deleteFile ( id : string ) {
103148 if ( ! pub ) return ;
104149 try {
@@ -138,6 +183,10 @@ export default function Upload() {
138183 listAllUploads ( adminListedPage ) ;
139184 } , [ adminListedPage , mimeFilter ] ) ;
140185
186+ useEffect ( ( ) => {
187+ listReports ( adminReportsPage ) ;
188+ } , [ adminReportsPage ] ) ;
189+
141190 useEffect ( ( ) => {
142191 if ( pub && ! self ) {
143192 const r96 = new Route96 ( url , pub ) ;
@@ -274,6 +323,23 @@ export default function Upload() {
274323 } }
275324 />
276325 ) }
326+
327+ < hr />
328+ < h3 > Admin Reports:</ h3 >
329+ < Button onClick = { ( ) => listReports ( 0 ) } > List Reports</ Button >
330+ { adminListedReports && (
331+ < ReportList
332+ reports = { adminListedReports . files }
333+ pages = { Math . ceil ( adminListedReports . total / adminListedReports . count ) }
334+ page = { adminListedReports . page }
335+ onPage = { ( x ) => setAdminReportsPage ( x ) }
336+ onAcknowledge = { acknowledgeReport }
337+ onDeleteFile = { async ( fileId ) => {
338+ await deleteFile ( fileId ) ;
339+ await listReports ( adminReportsPage ) ;
340+ } }
341+ />
342+ ) }
277343 </ >
278344 ) }
279345 { error && < b className = "text-red-500" > { error } </ b > }
0 commit comments