@@ -21,6 +21,7 @@ import { useLoaderData, useNavigate } from "react-router-dom";
21
21
import { NameExpand } from "./nameExpand" ;
22
22
import { Ticket } from "../types/ticket" ;
23
23
import { TicketModal } from "./ticketmodal" ;
24
+ import { useDebounce } from "use-debounce" ;
24
25
25
26
type ActiveLookupType = {
26
27
updateUser : ( _args : UpdateUserArguments ) => void ;
@@ -426,44 +427,94 @@ const UserTickets = (props: { ckey: string }) => {
426
427
const [ activePage , setActivePage ] = useState ( 1 ) ;
427
428
const [ errored , setErrored ] = useState ( false ) ;
428
429
429
- const glob = useContext ( GlobalContext ) ;
430
+ const [ fromDate , setFromDate ] = useState < Date > ( ) ;
431
+ const [ toDate , setToDate ] = useState < Date > ( ) ;
432
+
433
+ const [ debouncedFrom ] = useDebounce ( fromDate , 500 ) ;
434
+ const [ debouncedTo ] = useDebounce ( toDate , 500 ) ;
435
+
436
+ const glob = useContext ( GlobalContext ) ! ;
437
+
438
+ const { updateAndShowToast } = glob ;
439
+
440
+ const { ckey } = props ;
441
+
442
+ const encodeDate = ( date : Date ) => {
443
+ return date . toISOString ( ) . slice ( 0 , 19 ) . replace ( "T" , " " ) ;
444
+ } ;
430
445
431
446
useEffect ( ( ) => {
432
447
if ( page != activePage ) {
433
448
setTicketData ( undefined ) ;
434
449
}
435
- if ( ! tickets && ! errored ) {
436
- callApi ( `/Ticket/User/${ props . ckey } /?page=${ page } ` ) . then ( ( value ) => {
437
- if ( value . status != 200 ) {
438
- glob ?. updateAndShowToast ( "No more tickets." ) ;
439
- if ( page == 1 ) {
440
- setErrored ( true ) ;
441
- } else {
442
- setPage ( page - 1 ) ;
450
+
451
+ if ( ( debouncedFrom && ! debouncedTo ) || ( ! debouncedFrom && debouncedTo ) )
452
+ return ;
453
+
454
+ if ( ! errored ) {
455
+ let dateString = "" ;
456
+ if ( debouncedFrom && debouncedTo ) {
457
+ const to = new Date ( debouncedTo ) ;
458
+ to . setUTCHours ( 23 , 59 , 59 ) ;
459
+ dateString = `&from=${ encodeDate ( debouncedFrom ) } &to=${ encodeDate ( to ) } ` ;
460
+ }
461
+ callApi ( `/Ticket/User/${ ckey } /?page=${ page } ${ dateString } ` ) . then (
462
+ ( value ) => {
463
+ if ( value . status != 200 ) {
464
+ updateAndShowToast ( "No more tickets." ) ;
465
+ if ( page == 1 ) {
466
+ setErrored ( true ) ;
467
+ } else {
468
+ setPage ( page - 1 ) ;
469
+ }
470
+ return ;
443
471
}
444
- return ;
445
- }
446
472
447
- value . json ( ) . then ( ( json ) => {
448
- setTicketData ( json ) ;
449
- setActivePage ( page ) ;
450
- } ) ;
451
- } ) ;
473
+ value . json ( ) . then ( ( json ) => {
474
+ setTicketData ( json ) ;
475
+ setActivePage ( page ) ;
476
+ } ) ;
477
+ }
478
+ ) ;
452
479
}
453
480
} , [
454
- tickets ,
455
481
setTicketData ,
456
482
page ,
457
483
setPage ,
458
- props ,
484
+ ckey ,
459
485
activePage ,
460
486
setActivePage ,
461
- glob ,
487
+ updateAndShowToast ,
462
488
errored ,
489
+
490
+ debouncedFrom ,
491
+ debouncedTo ,
463
492
] ) ;
464
493
465
494
return (
466
495
< div className = "flex flex-col gap-2" >
496
+ < div className = "flex flex-row justify-center gap-3" >
497
+ < div className = "flex flex-row gap-1" >
498
+ From:
499
+ < input
500
+ type = "date"
501
+ onChange = { ( val ) => {
502
+ const date = val . target . valueAsDate ;
503
+ if ( date ) setFromDate ( date ) ;
504
+ } }
505
+ />
506
+ </ div >
507
+ < div className = "flex flex-row gap-1" >
508
+ To:
509
+ < input
510
+ type = "date"
511
+ onChange = { ( val ) => {
512
+ const date = val . target . valueAsDate ;
513
+ if ( date ) setToDate ( date ) ;
514
+ } }
515
+ />
516
+ </ div >
517
+ </ div >
467
518
< div className = "flex flex-row justify-center gap-3" >
468
519
{ page > 1 && (
469
520
< LinkColor
0 commit comments