@ -1,11 +1,14 @@
import * as React from "react" ;
import { useCallback , useState } from "react" ;
import { Box , Container , FormControl , Grid , ListItemText , SelectChangeEvent } from "@mui/material" ;
import { Box , Button , Container , FormControl , Grid , ListItemText , SelectChangeEvent , Stack } from "@mui/material" ;
import { useSnackbar } from "notistack" ;
import { useTranslation } from "react-i18next" ;
import PageHeader from "../PageHeader.tsx" ;
import { getShares } from "../../../api/api.ts" ;
import { getShares , sendDeleteShares } from "../../../api/api.ts" ;
import { useAppDispatch } from "../../../redux/hooks.ts" ;
import { confirmOperation } from "../../../redux/thunks/dialog.ts" ;
import Nothing from "../../Common/Nothing.tsx" ;
import { DefaultCloseAction } from "../../Common/Snackbar/snackbar.tsx" ;
import { setSelected } from "../../../redux/fileManagerSlice.ts" ;
import ShareCard from "./ShareCard.tsx" ;
import { Share } from "../../../api/explorer.ts" ;
@ -18,10 +21,13 @@ const defaultPageSize = 50;
const ShareList = ( ) = > {
const { t } = useTranslation ( ) ;
const dispatch = useAppDispatch ( ) ;
const { enqueueSnackbar } = useSnackbar ( ) ;
const [ nextPageToken , setNextPageToken ] = useState < string | undefined > ( "" ) ;
const [ shares , setShares ] = useState < Share [ ] > ( [ ] ) ;
const [ loading , setLoading ] = useState ( false ) ;
const [ orderDirection , setOrderDirection ] = useState ( "desc" ) ;
const [ selecting , setSelecting ] = useState ( false ) ;
const [ selected , setSelectedIds ] = useState < Set < string > > ( new Set ( ) ) ;
const loadNextPage = useCallback (
( originShares : Share [ ] , token? : string , direction? : string ) = > ( ) = > {
@ -62,6 +68,40 @@ const ShareList = () => {
[ setShares ] ,
) ;
const onToggleSelect = useCallback (
( id : string ) = > {
setSelectedIds ( ( prev ) = > {
const next = new Set ( prev ) ;
if ( next . has ( id ) ) {
next . delete ( id ) ;
} else {
next . add ( id ) ;
}
return next ;
} ) ;
} ,
[ setSelectedIds ] ,
) ;
const exitSelecting = useCallback ( ( ) = > {
setSelecting ( false ) ;
setSelectedIds ( new Set ( ) ) ;
} , [ ] ) ;
const deleteSelected = useCallback ( ( ) = > {
dispatch ( confirmOperation ( t ( "fileManager.deleteShareWarning" ) ) ) . then ( ( ) = > {
dispatch ( sendDeleteShares ( [ . . . selected ] ) ) . then ( ( ) = > {
enqueueSnackbar ( {
message : t ( "application:share.shareCanceled" ) ,
variant : "success" ,
action : DefaultCloseAction ,
} ) ;
setShares ( ( shares ) = > shares . filter ( ( share ) = > ! selected . has ( share . id ) ) ) ;
exitSelecting ( ) ;
} ) ;
} ) ;
} , [ dispatch , selected , t , enqueueSnackbar , exitSelecting ] ) ;
const onSelectChange = useCallback (
( e : SelectChangeEvent < unknown > ) = > {
setOrderDirection ( e . target . value as string ) ;
@ -75,6 +115,30 @@ const ShareList = () => {
< Container maxWidth = "lg" >
< PageHeader
secondaryAction = {
< Stack direction = "row" spacing = { 1 } alignItems = "center" >
{ selecting && (
< >
< Button
size = "small"
variant = "text"
onClick = { ( ) = > setSelectedIds ( new Set ( shares . map ( ( s ) = > s . id ) ) ) }
>
{ t ( "application:fileManager.selectAll" ) }
< / Button >
< Button
size = "small"
variant = "text"
color = "error"
disabled = { selected . size == 0 }
onClick = { deleteSelected }
>
{ t ( "fileManager.delete" ) } ( { selected . size } )
< / Button >
< / >
) }
< Button size = "small" variant = "text" onClick = { selecting ? exitSelecting : ( ) = > setSelecting ( true ) } >
{ selecting ? t ( "common:cancel" ) : t ( "common:select" ) }
< / Button >
< FormControl variant = "outlined" >
< DenseSelect variant = "outlined" value = { orderDirection } onChange = { onSelectChange } >
< SquareMenuItem value = { "desc" } >
@ -97,6 +161,7 @@ const ShareList = () => {
< / SquareMenuItem >
< / DenseSelect >
< / FormControl >
< / Stack >
}
onRefresh = { ( ) = > refresh ( ) }
loading = { loading }
@ -105,7 +170,14 @@ const ShareList = () => {
< Grid container spacing = { 1 } >
{ shares . map ( ( share ) = > (
< ShareCard share = { share } key = { share . id } onShareDeleted = { onShareDeleted } / >
< ShareCard
share = { share }
key = { share . id }
onShareDeleted = { onShareDeleted }
selecting = { selecting }
selected = { selected . has ( share . id ) }
onToggleSelect = { onToggleSelect }
/ >
) ) }
{ nextPageToken != undefined && (
< >