105 lines
3.1 KiB
TypeScript
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
|
|
};
|
|
});
|