chore: build
This commit is contained in:
@@ -1440,6 +1440,55 @@ export const cancelCommand = async (
|
||||
}
|
||||
};
|
||||
|
||||
// Le client corrige lui-même l'adresse de sa commande (refusé si déjà en
|
||||
// livraison ou terminée, cf. UpdateOwnCommandAddress côté backend).
|
||||
export const updateOwnCommandAddress = async (
|
||||
commandId: number,
|
||||
deliveryAddress: string,
|
||||
): Promise<{ success: boolean; message: string }> => {
|
||||
const token = sessionStorage.getItem("token");
|
||||
|
||||
if (!token) {
|
||||
return { success: false, message: "Session invalide" };
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${API_URL}/commands/${commandId}/address`,
|
||||
{
|
||||
method: "PUT",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
body: JSON.stringify({ delivery_address: deliveryAddress }),
|
||||
},
|
||||
);
|
||||
|
||||
const data = await safeJson(response);
|
||||
|
||||
if (!response.ok) {
|
||||
return {
|
||||
success: false,
|
||||
message: data.error || "Erreur lors de la mise à jour",
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: data.message || "Adresse mise à jour",
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
message:
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Erreur lors de la mise à jour de l'adresse",
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* ✅ GET MY CANCELLATION HISTORY - Historique des annulations
|
||||
* GET /api/v1/my-cancellation-history
|
||||
|
||||
@@ -489,6 +489,40 @@
|
||||
font-weight: 600;
|
||||
color: var(--text);
|
||||
}
|
||||
.address-edit-toggle {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.4rem;
|
||||
margin-top: 0.4rem;
|
||||
background: none;
|
||||
border: none;
|
||||
color: var(--primary);
|
||||
font-size: 0.8rem;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
padding: 0;
|
||||
}
|
||||
.address-edit-toggle:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.address-edit {
|
||||
margin-top: 0.5rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
.address-edit-input {
|
||||
padding: 0.5rem 0.75rem;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
font-size: 0.85rem;
|
||||
background: var(--bg-secondary, #fff);
|
||||
color: var(--text);
|
||||
}
|
||||
.address-edit-actions {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
.contact {
|
||||
color: var(--text-muted);
|
||||
font-size: 0.85rem;
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
getOrderETA,
|
||||
confirmReception,
|
||||
cancelCommand,
|
||||
updateOwnCommandAddress,
|
||||
isUserAuthenticated,
|
||||
getPublicSettings,
|
||||
} from "../../api/api";
|
||||
@@ -51,6 +52,7 @@ import {
|
||||
faWind,
|
||||
faChevronUp,
|
||||
faChevronDown,
|
||||
faPen,
|
||||
} from "@fortawesome/free-solid-svg-icons";
|
||||
|
||||
interface OrderWithTracking extends OrderDetail {
|
||||
@@ -282,6 +284,11 @@ function SuiviLivraison() {
|
||||
const [showCancelDialog, setShowCancelDialog] = useState(false);
|
||||
const [orderToCancel, setOrderToCancel] = useState<number | null>(null);
|
||||
const [cancelReason, setCancelReason] = useState("");
|
||||
const [editingAddressOrder, setEditingAddressOrder] = useState<
|
||||
number | null
|
||||
>(null);
|
||||
const [newAddressValue, setNewAddressValue] = useState("");
|
||||
const [savingAddress, setSavingAddress] = useState(false);
|
||||
const [showPenaltyWarning, setShowPenaltyWarning] = useState(false);
|
||||
const [penaltyWarningData, setPenaltyWarningData] =
|
||||
useState<CancelCommandResponse | null>(null);
|
||||
@@ -383,6 +390,28 @@ function SuiviLivraison() {
|
||||
}
|
||||
};
|
||||
|
||||
const handleUpdateAddress = async (orderId: number) => {
|
||||
setSavingAddress(true);
|
||||
try {
|
||||
const res = await updateOwnCommandAddress(
|
||||
orderId,
|
||||
newAddressValue,
|
||||
);
|
||||
if (res.success) {
|
||||
showToast(res.message || "Adresse mise à jour", "success");
|
||||
setEditingAddressOrder(null);
|
||||
setNewAddressValue("");
|
||||
loadOrders();
|
||||
} else {
|
||||
showToast(res.message || "Erreur", "error");
|
||||
}
|
||||
} catch {
|
||||
showToast("Erreur mise à jour adresse", "error");
|
||||
} finally {
|
||||
setSavingAddress(false);
|
||||
}
|
||||
};
|
||||
|
||||
const showToast = (
|
||||
message: string,
|
||||
type: "success" | "error" | "warning" | "info",
|
||||
@@ -889,6 +918,88 @@ function SuiviLivraison() {
|
||||
order,
|
||||
)}
|
||||
</p>
|
||||
{(statusLow ===
|
||||
"pending" ||
|
||||
statusLow ===
|
||||
"assigned") &&
|
||||
(editingAddressOrder ===
|
||||
order.id ? (
|
||||
<div className="address-edit">
|
||||
<input
|
||||
type="text"
|
||||
className="address-edit-input"
|
||||
value={
|
||||
newAddressValue
|
||||
}
|
||||
onChange={(
|
||||
e,
|
||||
) =>
|
||||
setNewAddressValue(
|
||||
e
|
||||
.target
|
||||
.value,
|
||||
)
|
||||
}
|
||||
placeholder="Ex: 24 Rue Docteur Brindeau, 44000 Nantes"
|
||||
/>
|
||||
<div className="address-edit-actions">
|
||||
<button
|
||||
type="button"
|
||||
className="btn-secondary"
|
||||
onClick={() => {
|
||||
setEditingAddressOrder(
|
||||
null,
|
||||
);
|
||||
setNewAddressValue(
|
||||
"",
|
||||
);
|
||||
}}
|
||||
>
|
||||
Annuler
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className="btn-primary"
|
||||
disabled={
|
||||
savingAddress ||
|
||||
!newAddressValue.trim()
|
||||
}
|
||||
onClick={() =>
|
||||
handleUpdateAddress(
|
||||
order.id,
|
||||
)
|
||||
}
|
||||
>
|
||||
{savingAddress
|
||||
? "Enregistrement..."
|
||||
: "Enregistrer"}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<button
|
||||
type="button"
|
||||
className="address-edit-toggle"
|
||||
onClick={() => {
|
||||
setNewAddressValue(
|
||||
getDeliveryAddress(
|
||||
order,
|
||||
),
|
||||
);
|
||||
setEditingAddressOrder(
|
||||
order.id,
|
||||
);
|
||||
}}
|
||||
>
|
||||
<FontAwesomeIcon
|
||||
icon={
|
||||
faPen
|
||||
}
|
||||
/>{" "}
|
||||
Modifier
|
||||
l'adresse
|
||||
</button>
|
||||
))}
|
||||
{(() => {
|
||||
const info =
|
||||
getClientInfo(
|
||||
|
||||
Reference in New Issue
Block a user