Skip to content
Extraits de code Groupes Projets
Valider 8298ed3d rédigé par salaheddine zidani's avatar salaheddine zidani
Parcourir les fichiers

Integrate ShippingRules frontend and backend

parent fe8a1fc5
Branches
1 requête de fusion!94MYD-199/ Integrate ShippingRules frontend and backend
Pipeline #1809 réussi avec l'étape
in 4 minutes et 2 secondes
......@@ -107,6 +107,18 @@ export type ShippingClass = {
};
export type ShippingRules = {
shippingDestinationType: ShippingDestinationType;
shippingCostCalculatorCartPage: boolean;
hideShippingCostsUntilAnAddressIsProvided: boolean;
};
export enum ShippingDestinationType {
SHIPPING_ADRESS_DEFAULT = 'SHIPPING_ADRESS_DEFAULT',
FACTURATION_ADRESS_DEFAULT = 'FACTURATION_ADRESS_DEFAULT',
FACTURATION_ADRESS_FORCE = 'FACTURATION_ADRESS_FORCE',
}
//Select components value
export enum RequiresFreeShipping {
Nothing = 'Aucun prérequis',
......
......@@ -46,6 +46,10 @@ export const endpoints = {
add: "/shipping/shipping-class",
edit:(shippingClassId:string)=> `/shipping/shipping-class/${shippingClassId}`,
delete:(shippingClassId:string)=> `/shipping/shipping-class/${shippingClassId}`,
},
shippingRules:{
getById:(shippingRulesId:string)=> `/shipping/shipping-rules/${shippingRulesId}`,
edit:(shippingRulesId:string)=> `/shipping/shipping-rules/${shippingRulesId}`,
}
}
};
import { ShippingClass } from "@/contexts/types/Shipping";
import { ShippingClass, ShippingRules } from "@/contexts/types/Shipping";
import { useMemo } from "react";
import useSWR from "swr";
import { _orders } from "../_mock";
......@@ -79,3 +79,32 @@ export async function useDeleteShippingClass(id: string) {
mutate(endpoints.shipping.shippingClass.getAll);
return response.status;
}
///////////////////-----------ShippingRules----------///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
export function useGetShippingRules(shippingRulesId: string) {
const { data, error } = useSWR<ShippingRules>(
shippingRulesId ? endpoints.shipping.shippingRules.getById(shippingRulesId) : null,
fetcher
);
const memoizedValue = useMemo(
() => ({
shippingRulesData: data,
shippingRulesError: error,
}),
[data, error]
);
return memoizedValue;
}
export async function useUpdateShippingRules(id: string, updatedShippingRules: ShippingRules) {
const response = await axiosInstance.put(endpoints.shipping.shippingRules.edit(id), updatedShippingRules);
const updatedData: ShippingRules = response.data;
mutate(endpoints.shipping.shippingRules.getById(id), updatedData, true);
return response.data as ShippingRules;
}
\ No newline at end of file
......@@ -20,40 +20,64 @@ import { paths } from '@/routes/paths';
import FormControl from '@mui/material/FormControl';
import FormLabel from '@mui/material/FormLabel';
import CustomBreadcrumbs from '@/components/custom-breadcrumbs/custom-breadcrumbs';
import { useGetShippingRules, useUpdateShippingRules } from '@/shared/api/shipping';
import { useEffect, useState } from 'react';
import { ShippingDestinationType, ShippingRules } from '@/contexts/types/Shipping';
export default function DeliveryRulesView() {
const mdUp = useResponsive('up', 'md');
const { enqueueSnackbar } = useSnackbar();
const existingShippingRules = useGetShippingRules('1');
const [shippingRules, setShippingRules] = useState<ShippingRules>();
const NewDeliveryRulesSchema = Yup.object().shape({
enableShippingCalculator: Yup.boolean(),
hideShippingUntilAddress: Yup.boolean(),
shippingDestination: Yup.string().oneOf(['defaultDeliveryAdress', 'defaultFacturationAdress', 'forceFacturationAdress']).required('Shipping destination is required')
shippingDestination: Yup.string().oneOf([
ShippingDestinationType.SHIPPING_ADRESS_DEFAULT,
ShippingDestinationType.FACTURATION_ADRESS_DEFAULT,
ShippingDestinationType.FACTURATION_ADRESS_FORCE,
]).required('Shipping destination is required'),
});
const methods = useForm({
resolver: yupResolver(NewDeliveryRulesSchema),
});
const {
handleSubmit,
reset,
formState: { isSubmitting },
} = methods;
useEffect(() => {
if (existingShippingRules && existingShippingRules.shippingRulesData) {
setShippingRules(existingShippingRules.shippingRulesData);
reset({
enableShippingCalculator: existingShippingRules.shippingRulesData.shippingCostCalculatorCartPage,
hideShippingUntilAddress: existingShippingRules.shippingRulesData.hideShippingCostsUntilAnAddressIsProvided,
shippingDestination: existingShippingRules.shippingRulesData.shippingDestinationType,
});
}
}, [existingShippingRules, reset]);
const onSubmit = handleSubmit(async (data) => {
const onSubmit = handleSubmit(() => {
try {
await new Promise((resolve) => setTimeout(resolve, 500));
enqueueSnackbar('Success config!', { variant: 'success' });
console.info('Form Data:', data);
if (shippingRules?.shippingDestinationType !== undefined) {
console.log('data enable: ' + shippingRules?.shippingCostCalculatorCartPage)
console.log('data hide: ' + shippingRules?.hideShippingCostsUntilAnAddressIsProvided)
console.log('data destType: ' + shippingRules?.shippingDestinationType)
useUpdateShippingRules('1', {
shippingCostCalculatorCartPage: shippingRules?.shippingCostCalculatorCartPage || false,
hideShippingCostsUntilAnAddressIsProvided: shippingRules?.hideShippingCostsUntilAnAddressIsProvided || false,
shippingDestinationType: shippingRules?.shippingDestinationType,
});
enqueueSnackbar('Configuration réussie!', { variant: 'success' });
}
} catch (error) {
console.error(error);
enqueueSnackbar('Failed config.', { variant: 'error' });
enqueueSnackbar('Échec de la configuration.', { variant: 'error' });
}
});
......@@ -89,21 +113,64 @@ export default function DeliveryRulesView() {
<Stack spacing={3} sx={{ p: 3 }}>
<FormLabel id="demo-radio-buttons-group-label">Calculs</FormLabel>
<div style={{ display: 'flex', alignItems: 'center' }}>
<Switch name='active' inputProps={{ 'aria-label': 'controlled' }} /> <label>Activer le calculateur de frais d’expédition sur la page panier</label>
<Switch
name="active"
inputProps={{ 'aria-label': 'controlled' }}
checked={shippingRules?.shippingCostCalculatorCartPage || false}
onChange={(e) => {
const newValue = e.target.checked;
setShippingRules((prevRules) => ({
...prevRules,
shippingCostCalculatorCartPage: newValue,
}) as ShippingRules);
}}
/>
<label>Activer le calculateur de frais d’expédition sur la page panier</label>
</div>
<div style={{ display: 'flex', alignItems: 'center' }}>
<Switch name='active' inputProps={{ 'aria-label': 'controlled' }} /> <label>Masquer les frais d’expédition jusqu’à ce qu’une adresse soit renseignée</label>
<Switch
name="active"
inputProps={{ 'aria-label': 'controlled' }}
checked={shippingRules?.hideShippingCostsUntilAnAddressIsProvided || false}
onChange={(e) => {
const newValue = e.target.checked;
setShippingRules((prevRules) => ({
...prevRules,
hideShippingCostsUntilAnAddressIsProvided: newValue,
}) as ShippingRules);
}}
/>
<label>Masquer les frais d’expédition jusqu’à ce qu’une adresse soit renseignée</label>
</div>
<FormControl>
<FormLabel id="demo-radio-buttons-group-label">Destination de l'expédition</FormLabel>
<FormLabel id="shipping-destination-label">Destination de l'expédition</FormLabel>
<RadioGroup
aria-labelledby="demo-radio-buttons-group-label"
defaultValue="defaultDeliveryAdress"
name="radio-buttons-group"
aria-labelledby="shipping-destination-label"
name="shipping-destination"
value={shippingRules?.shippingDestinationType || ''}
onChange={(event) => {
const selectedValue = event.target.value;
setShippingRules((prevRules) => ({
...prevRules,
shippingDestinationType: selectedValue,
}) as ShippingRules);
}}
>
<FormControlLabel value="defaultDeliveryAdress" control={<Radio />} label="Par défaut à l’adresse de livraison client" />
<FormControlLabel value="defaultFacturationAdress" control={<Radio />} label="Par défaut à l’adresse de facturation client" />
<FormControlLabel value="forceFacturationAdress" control={<Radio />} label="Forcer la livraison à l’adresse de facturation client" />
<FormControlLabel
value={ShippingDestinationType.SHIPPING_ADRESS_DEFAULT}
control={<Radio />}
label="Par défaut à l’adresse de livraison client"
/>
<FormControlLabel
value={ShippingDestinationType.FACTURATION_ADRESS_DEFAULT}
control={<Radio />}
label="Par défaut à l’adresse de facturation client"
/>
<FormControlLabel
value={ShippingDestinationType.FACTURATION_ADRESS_FORCE}
control={<Radio />}
label="Forcer la livraison à l’adresse de facturation client"
/>
</RadioGroup>
</FormControl>
</Stack>
......@@ -122,8 +189,9 @@ export default function DeliveryRulesView() {
size="large"
loading={isSubmitting}
sx={{ ml: 2 }}
>Enregistrer</LoadingButton>
>
Enregistrer
</LoadingButton>
</Grid>
</>
);
......
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter