Files
nullcart/cms/src/stores/orders.ts
T
2026-08-28 17:31:02 +02:00

105 lines
3.1 KiB
TypeScript

import { defineStore } from 'pinia';
import { computed, ref } from 'vue';
import { useRoute } from 'vue-router';
import { ROUTE_NAMES } from '@/consts/routeNames';
import { api } from '@/plugins/axios';
import type { PaginatedResponse } from '@/types/PaginatedResponse';
import type { OrderExtended } from '@/types/order/OrderExtended';
import type { OrderListItem } from '@/types/order/OrderListItem';
import type { OrderMessage } from '@/types/order/OrderMessage';
import type { SetDeliveryCostPayload } from '@/types/order/SetDeliveryCostPayload';
export const useOrdersStore = defineStore('orders', () => {
const route = useRoute();
const orderList = ref<OrderListItem[]>([]);
const currentOrder = ref<OrderExtended | null>(null);
const currentOrderId = computed<string | null>(() => {
if (route.name !== ROUTE_NAMES.OrderDetail) {
return null;
}
const id = route.params.id;
return typeof id === 'string' && id ? id : null;
});
const fetchList = async ({
page,
limit
}: {
page: number;
limit: number;
}): Promise<PaginatedResponse<OrderListItem>> => {
const { data } = await api.get<PaginatedResponse<OrderListItem>>('/orders', {
params: { page, limit }
});
orderList.value = data.items;
return data;
};
const fetchById = async (id: string): Promise<OrderExtended> => {
const { data } = await api.get<OrderExtended>(`/orders/${id}`);
currentOrder.value = data;
return data;
};
const markChatRead = async (id: string): Promise<void> => {
await api.post(`/orders/${id}/messages/mark-read`);
};
const sendMessage = async (id: string, body: string): Promise<OrderMessage[]> => {
const { data } = await api.post<OrderMessage[]>(`/orders/${id}/messages`, { body });
if (currentOrder.value?.id === id) {
currentOrder.value = { ...currentOrder.value, messages: data };
}
return data;
};
const deleteMessage = async (orderId: string, messageId: string): Promise<OrderMessage[]> => {
const { data } = await api.delete<OrderMessage[]>(`/orders/${orderId}/messages/${messageId}`);
if (currentOrder.value?.id === orderId) {
currentOrder.value = { ...currentOrder.value, messages: data };
}
return data;
};
const setDeliveryCost = async (id: string, payload: SetDeliveryCostPayload): Promise<OrderExtended> => {
const { data } = await api.post<OrderExtended>(`/orders/${id}/delivery-cost`, payload);
currentOrder.value = data;
return data;
};
const fulfillManualLine = async (orderId: string, lineId: string): Promise<OrderExtended> => {
const { data } = await api.post<OrderExtended>(`/orders/${orderId}/lines/${lineId}/fulfill`);
currentOrder.value = data;
return data;
};
return {
orderList,
currentOrder,
currentOrderId,
fetchList,
fetchById,
markChatRead,
sendMessage,
deleteMessage,
setDeliveryCost,
fulfillManualLine
};
});