2019-06-19 14:40:52 +00:00
import DialogContentText from "@material-ui/core/DialogContentText" ;
import IconButton from "@material-ui/core/IconButton" ;
import DeleteIcon from "@material-ui/icons/Delete" ;
2019-08-09 10:26:22 +00:00
import React from "react" ;
2019-08-26 21:26:36 +00:00
import { FormattedMessage , useIntl } from "react-intl" ;
2019-06-19 14:40:52 +00:00
import ActionDialog from "@saleor/components/ActionDialog" ;
2019-08-09 11:14:35 +00:00
import { configurationMenuUrl } from "@saleor/configuration" ;
2019-06-19 14:40:52 +00:00
import useBulkActions from "@saleor/hooks/useBulkActions" ;
2019-08-09 11:14:35 +00:00
import useListSettings from "@saleor/hooks/useListSettings" ;
2019-06-19 14:40:52 +00:00
import useNavigator from "@saleor/hooks/useNavigator" ;
import useNotifier from "@saleor/hooks/useNotifier" ;
import usePaginator , {
createPaginationState
} from "@saleor/hooks/usePaginator" ;
import useShop from "@saleor/hooks/useShop" ;
2019-10-09 12:13:54 +00:00
import useUser from "@saleor/hooks/useUser" ;
2019-08-26 21:26:36 +00:00
import { commonMessages } from "@saleor/intl" ;
2020-02-10 12:50:08 +00:00
import { maybe , getStringOrPlaceholder } from "@saleor/misc" ;
2019-08-09 11:14:35 +00:00
import { ListViews } from "@saleor/types" ;
2020-02-10 12:50:08 +00:00
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers" ;
2019-06-19 14:40:52 +00:00
import ShippingZonesListPage from "../components/ShippingZonesListPage" ;
import {
2020-02-10 12:50:08 +00:00
useShippingZoneBulkDelete ,
useShippingZoneDelete ,
useDefaultWeightUnitUpdate
2019-06-19 14:40:52 +00:00
} from "../mutations" ;
2020-02-10 12:50:08 +00:00
import { useShippingZoneList } from "../queries" ;
2019-06-19 14:40:52 +00:00
import {
shippingZoneAddUrl ,
shippingZonesListUrl ,
ShippingZonesListUrlQueryParams ,
2020-02-10 12:50:08 +00:00
shippingZoneUrl ,
ShippingZonesListUrlDialog
2019-06-19 14:40:52 +00:00
} from "../urls" ;
interface ShippingZonesListProps {
params : ShippingZonesListUrlQueryParams ;
}
2019-11-07 11:34:54 +00:00
export const ShippingZonesList : React.FC < ShippingZonesListProps > = ( {
params
} ) = > {
2019-06-19 14:40:52 +00:00
const navigate = useNavigator ( ) ;
const notify = useNotifier ( ) ;
const paginate = usePaginator ( ) ;
const shop = useShop ( ) ;
2019-10-09 12:13:54 +00:00
const { user } = useUser ( ) ;
2019-06-19 14:40:52 +00:00
const { isSelected , listElements , reset , toggle , toggleAll } = useBulkActions (
params . ids
) ;
2019-08-09 11:14:35 +00:00
const { updateListSettings , settings } = useListSettings (
ListViews . SHIPPING_METHODS_LIST
) ;
2019-08-26 21:26:36 +00:00
const intl = useIntl ( ) ;
2019-06-19 14:40:52 +00:00
2019-08-09 11:14:35 +00:00
const paginationState = createPaginationState ( settings . rowNumber , params ) ;
2019-06-19 14:40:52 +00:00
2020-02-10 12:50:08 +00:00
const [ openModal , closeModal ] = createDialogActionHandlers <
ShippingZonesListUrlDialog ,
ShippingZonesListUrlQueryParams
> ( navigate , shippingZonesListUrl , params ) ;
const { data , loading , refetch } = useShippingZoneList ( {
displayLoader : true ,
variables : paginationState
} ) ;
2019-06-19 14:40:52 +00:00
2020-02-10 12:50:08 +00:00
const [ deleteShippingZone , deleteShippingZoneOpts ] = useShippingZoneDelete ( {
onCompleted : data = > {
if ( data . shippingZoneDelete . errors . length === 0 ) {
notify ( {
text : intl.formatMessage ( commonMessages . savedChanges )
} ) ;
closeModal ( ) ;
refetch ( ) ;
}
}
} ) ;
2019-06-19 14:40:52 +00:00
2020-02-10 12:50:08 +00:00
const [
updateDefaultWeightUnit ,
updateDefaultWeightUnitOpts
] = useDefaultWeightUnitUpdate ( {
onCompleted : data = > {
if ( data . shopSettingsUpdate . errors . length === 0 ) {
notify ( {
text : intl.formatMessage ( commonMessages . savedChanges )
} ) ;
}
}
} ) ;
2019-06-19 14:40:52 +00:00
2020-02-10 12:50:08 +00:00
const [
bulkDeleteShippingZone ,
bulkDeleteShippingZoneOpts
] = useShippingZoneBulkDelete ( {
onCompleted : data = > {
if ( data . shippingZoneBulkDelete . errors . length === 0 ) {
notify ( {
text : intl.formatMessage ( commonMessages . savedChanges )
} ) ;
closeModal ( ) ;
reset ( ) ;
refetch ( ) ;
}
}
} ) ;
2019-06-19 14:40:52 +00:00
2020-02-10 12:50:08 +00:00
const { loadNextPage , loadPreviousPage , pageInfo } = paginate (
maybe ( ( ) = > data . shippingZones . pageInfo ) ,
paginationState ,
params
) ;
return (
< >
< ShippingZonesListPage
defaultWeightUnit = { maybe ( ( ) = > shop . defaultWeightUnit ) }
settings = { settings }
disabled = {
loading ||
deleteShippingZoneOpts . loading ||
updateDefaultWeightUnitOpts . loading
}
shippingZones = { maybe ( ( ) = >
data . shippingZones . edges . map ( edge = > edge . node )
) }
pageInfo = { pageInfo }
onAdd = { ( ) = > navigate ( shippingZoneAddUrl ) }
onBack = { ( ) = > navigate ( configurationMenuUrl ) }
onUpdateListSettings = { updateListSettings }
onNextPage = { loadNextPage }
onPreviousPage = { loadPreviousPage }
onRemove = { id = >
openModal ( "remove" , {
id
} )
}
onRowClick = { id = > ( ) = > navigate ( shippingZoneUrl ( id ) ) }
onSubmit = { unit = >
updateDefaultWeightUnit ( {
variables : { unit }
} )
}
isChecked = { isSelected }
selected = { listElements . length }
toggle = { toggle }
toggleAll = { toggleAll }
toolbar = {
< IconButton
color = "primary"
onClick = { ( ) = >
openModal ( "remove-many" , {
ids : listElements
} )
}
>
< DeleteIcon / >
< / IconButton >
}
userPermissions = { user ? . userPermissions || [ ] }
/ >
2019-06-19 14:40:52 +00:00
2020-02-10 12:50:08 +00:00
< ActionDialog
open = { params . action === "remove" }
confirmButtonState = { deleteShippingZoneOpts . status }
variant = "delete"
title = { intl . formatMessage ( {
defaultMessage : "Delete Shipping Zone" ,
description : "dialog header"
} ) }
onClose = { closeModal }
onConfirm = { ( ) = >
deleteShippingZone ( {
variables : { id : params.id }
} )
}
>
< DialogContentText >
< FormattedMessage
defaultMessage = "Are you sure you want to delete {shippingZoneName} shipping zone?"
values = { {
shippingZoneName : (
< strong >
{ maybe (
( ) = >
data . shippingZones . edges . find (
edge = > edge . node . id === params . id
) . node . name ,
"..."
) }
< / strong >
)
} }
/ >
< / DialogContentText >
< / ActionDialog >
< ActionDialog
open = { params . action === "remove-many" }
confirmButtonState = { bulkDeleteShippingZoneOpts . status }
variant = "delete"
title = { intl . formatMessage ( {
defaultMessage : "Delete Shipping Zones" ,
description : "dialog header"
} ) }
onClose = { closeModal }
onConfirm = { ( ) = >
bulkDeleteShippingZone ( {
variables : { ids : params.ids }
} )
}
>
< DialogContentText >
< FormattedMessage
defaultMessage = "{counter,plural,one{Are you sure you want to delete this shipping zone?} other{Are you sure you want to delete {displayQuantity} shipping zones?}}"
description = "dialog content"
values = { {
counter : params.ids?.length ,
displayQuantity : (
< strong >
{ getStringOrPlaceholder ( params . ids ? . length . toString ( ) ) }
< / strong >
)
} }
/ >
< / DialogContentText >
< / ActionDialog >
< / >
2019-06-19 14:40:52 +00:00
) ;
} ;
ShippingZonesList . displayName = "ShippingZonesList" ;
export default ShippingZonesList ;