front-hub/src/utils/hooks/usePipeSubscriber.ts

66 lines
2.1 KiB
TypeScript

import { Ticket, UserAccount, UserName, getAuthToken, useSSESubscription } from "@frontend/kitui"
import { setCart, setNewNames, setUserStatus, setWallet, useUserStore } from "@root/stores/user";
import { useSSETab } from "./useSSETab";
import { cancelPayCartProcess } from "@root/stores/notEnoughMoneyAmount";
type Ping = [{ event: "ping" }]
type SomeChange = [{
"id": UserAccount["_id"],
"userId": UserAccount["userId"],
"cart": UserAccount["cart"],
"wallet": {
"cash": UserAccount["wallet"]["cash"],
"currency": UserAccount["wallet"]["currency"],
"spent": UserAccount["wallet"]["spent"],
"purchasesAmount": UserAccount["wallet"]["purchasesAmount"],
"money": UserAccount["wallet"]["money"],
"lastPaymentId": string;
},
"name": UserName,
"status": UserAccount["status"],
"isDeleted": UserAccount["isDeleted"],
"createdAt": UserAccount["createdAt"];
"updatedAt": UserAccount["updatedAt"];
"from": string;
"partner": string;
}]
type PipeMessage = Ping | SomeChange
export const usePipeSubscriber = () => {
const token = getAuthToken();
const userId = useUserStore((state) => state.userId);
const { isActiveSSETab, updateSSEValue } = useSSETab<Ticket[]>("pipe");
useSSESubscription({
enabled: Boolean(token) && Boolean(userId) && isActiveSSETab,
url:
process.env.REACT_APP_DOMAIN +
`/customer/v1.0.1/account/pipe?Authorization=${token}`,
onNewData: (data) => {
let message = data[0] as PipeMessage
updateSSEValue(message)
//Пропускаем пингование
if ('event' in message && message.event === "ping") return
if ('cart' in message) {
setCart(message.cart as string[])
cancelPayCartProcess()
}
else if ('wallet' in message) {
setWallet(message.wallet as UserAccount["wallet"])
cancelPayCartProcess()
}
else if ('name' in message) {
setNewNames(message.name as UserName)
}
else if ('status' in message) {
setUserStatus(message.status as UserAccount["status"])
}
},
marker: "pipe",
});
}