Reviewed-on: #19 Reviewed-by: Микаэл Оганесян <15lu.akari@unprism.ru> Co-authored-by: fisenko <kkzemeow@gmail.com> Co-committed-by: fisenko <kkzemeow@gmail.com>
307 lines
6.9 KiB
TypeScript
307 lines
6.9 KiB
TypeScript
import {
|
|
authInstance,
|
|
cityStore,
|
|
languageStore,
|
|
languageInstance,
|
|
Language,
|
|
} from "@shared";
|
|
import { makeAutoObservable, runInAction } from "mobx";
|
|
|
|
export type Carrier = {
|
|
id: number;
|
|
short_name: string;
|
|
full_name: string;
|
|
slogan: string;
|
|
city: string;
|
|
city_id: number;
|
|
logo: string;
|
|
// main_color: string;
|
|
// left_color: string;
|
|
// right_color: string;
|
|
};
|
|
|
|
type CarrierData = {
|
|
data: Carrier[];
|
|
loaded: boolean;
|
|
};
|
|
|
|
type Carriers = {
|
|
ru: CarrierData;
|
|
en: CarrierData;
|
|
zh: CarrierData;
|
|
};
|
|
|
|
type CashedCarrier = Record<
|
|
number,
|
|
{
|
|
ru: Carrier | null;
|
|
en: Carrier | null;
|
|
zh: Carrier | null;
|
|
}
|
|
>;
|
|
|
|
class CarrierStore {
|
|
carriers: Carriers = {
|
|
ru: {
|
|
data: [],
|
|
loaded: false,
|
|
},
|
|
en: {
|
|
data: [],
|
|
loaded: false,
|
|
},
|
|
zh: {
|
|
data: [],
|
|
loaded: false,
|
|
},
|
|
};
|
|
carrier: CashedCarrier = {};
|
|
|
|
constructor() {
|
|
makeAutoObservable(this);
|
|
}
|
|
|
|
getCarriers = async (language: Language) => {
|
|
if (this.carriers[language as keyof Carriers].loaded) return;
|
|
|
|
const response = await languageInstance(language).get("/carrier");
|
|
|
|
runInAction(() => {
|
|
this.carriers[language as keyof Carriers].data = response.data;
|
|
this.carriers[language as keyof Carriers].loaded = true;
|
|
});
|
|
};
|
|
|
|
deleteCarrier = async (id: number) => {
|
|
await authInstance.delete(`/carrier/${id}`);
|
|
|
|
runInAction(() => {
|
|
for (const language of ["ru", "en", "zh"] as const) {
|
|
this.carriers[language].data = this.carriers[language].data.filter(
|
|
(carrier: Carrier) => carrier.id !== id
|
|
);
|
|
}
|
|
delete this.carrier[id];
|
|
});
|
|
};
|
|
|
|
getCarrier = async (id: number) => {
|
|
if (this.carrier[id]?.ru && this.carrier[id]?.en && this.carrier[id]?.zh)
|
|
return;
|
|
|
|
const ruResponse = await languageInstance("ru").get(`/carrier/${id}`);
|
|
const enResponse = await languageInstance("en").get(`/carrier/${id}`);
|
|
const zhResponse = await languageInstance("zh").get(`/carrier/${id}`);
|
|
|
|
runInAction(() => {
|
|
if (!this.carrier[id]) {
|
|
this.carrier[id] = {
|
|
ru: null,
|
|
en: null,
|
|
zh: null,
|
|
};
|
|
}
|
|
this.carrier[id].ru = ruResponse.data;
|
|
this.carrier[id].en = enResponse.data;
|
|
this.carrier[id].zh = zhResponse.data;
|
|
});
|
|
return this.carrier[id];
|
|
};
|
|
|
|
createCarrierData = {
|
|
city_id: 0,
|
|
logo: "",
|
|
ru: {
|
|
full_name: "",
|
|
short_name: "",
|
|
slogan: "",
|
|
},
|
|
en: {
|
|
full_name: "",
|
|
short_name: "",
|
|
slogan: "",
|
|
},
|
|
zh: {
|
|
full_name: "",
|
|
short_name: "",
|
|
slogan: "",
|
|
},
|
|
};
|
|
|
|
setCreateCarrierData = (
|
|
fullName: string,
|
|
shortName: string,
|
|
cityId: number,
|
|
slogan: string,
|
|
logoId: string,
|
|
language: Language
|
|
) => {
|
|
this.createCarrierData.city_id = cityId;
|
|
this.createCarrierData.logo = logoId;
|
|
this.createCarrierData[language] = {
|
|
full_name: fullName,
|
|
short_name: shortName,
|
|
slogan: slogan,
|
|
};
|
|
};
|
|
|
|
createCarrier = async () => {
|
|
const { language } = languageStore;
|
|
const cityName =
|
|
cityStore.cities[language].data.find(
|
|
(city) => city.id === this.createCarrierData.city_id
|
|
)?.name || "";
|
|
|
|
const payload = {
|
|
full_name: this.createCarrierData[language].full_name,
|
|
short_name: this.createCarrierData[language].short_name,
|
|
city: cityName,
|
|
city_id: this.createCarrierData.city_id,
|
|
slogan: this.createCarrierData[language].slogan,
|
|
...(this.createCarrierData.logo
|
|
? { logo: this.createCarrierData.logo }
|
|
: {}),
|
|
};
|
|
|
|
const response = await languageInstance(language).post("/carrier", payload);
|
|
|
|
const carrierId = response.data.id;
|
|
|
|
runInAction(() => {
|
|
this.carriers[language].data.push(response.data);
|
|
});
|
|
|
|
for (const lang of ["ru", "en", "zh"].filter((l) => l !== language)) {
|
|
const patchPayload = {
|
|
// @ts-ignore
|
|
full_name: this.createCarrierData[lang as any].full_name as string,
|
|
// @ts-ignore
|
|
short_name: this.createCarrierData[lang as any].short_name as string,
|
|
city: cityName,
|
|
city_id: this.createCarrierData.city_id,
|
|
// @ts-ignore
|
|
slogan: this.createCarrierData[lang as any].slogan as string,
|
|
...(this.createCarrierData.logo
|
|
? { logo: this.createCarrierData.logo }
|
|
: {}),
|
|
};
|
|
|
|
const response = await languageInstance(lang as Language).patch(
|
|
`/carrier/${carrierId}`,
|
|
patchPayload
|
|
);
|
|
|
|
runInAction(() => {
|
|
this.carriers[lang as keyof Carriers].data.push(response.data);
|
|
});
|
|
}
|
|
|
|
this.createCarrierData = {
|
|
city_id: 0,
|
|
logo: "",
|
|
ru: {
|
|
full_name: "",
|
|
short_name: "",
|
|
slogan: "",
|
|
},
|
|
en: {
|
|
full_name: "",
|
|
short_name: "",
|
|
slogan: "",
|
|
},
|
|
zh: {
|
|
full_name: "",
|
|
short_name: "",
|
|
slogan: "",
|
|
},
|
|
};
|
|
};
|
|
|
|
editCarrierData = {
|
|
ru: {
|
|
full_name: "",
|
|
short_name: "",
|
|
|
|
// main_color: "",
|
|
// left_color: "",
|
|
// right_color: "",
|
|
slogan: "",
|
|
},
|
|
en: {
|
|
full_name: "",
|
|
short_name: "",
|
|
|
|
// main_color: "",
|
|
// left_color: "",
|
|
// right_color: "",
|
|
slogan: "",
|
|
},
|
|
city_id: 0,
|
|
logo: "",
|
|
zh: {
|
|
full_name: "",
|
|
short_name: "",
|
|
|
|
// main_color: "",
|
|
// left_color: "",
|
|
// right_color: "",
|
|
slogan: "",
|
|
},
|
|
};
|
|
|
|
setEditCarrierData = (
|
|
fullName: string,
|
|
shortName: string,
|
|
cityId: number,
|
|
// main_color: string,
|
|
// left_color: string,
|
|
// right_color: string,
|
|
slogan: string,
|
|
logoId: string,
|
|
language: Language
|
|
) => {
|
|
this.editCarrierData.city_id = cityId;
|
|
this.editCarrierData.logo = logoId;
|
|
this.editCarrierData[language] = {
|
|
full_name: fullName,
|
|
short_name: shortName,
|
|
// main_color: main_color,
|
|
// left_color: left_color,
|
|
// right_color: right_color,
|
|
slogan: slogan,
|
|
};
|
|
};
|
|
|
|
editCarrier = async (id: number) => {
|
|
const { language } = languageStore;
|
|
const cityName =
|
|
cityStore.cities[language].data.find(
|
|
(city) => city.id === this.editCarrierData.city_id
|
|
)?.name || "";
|
|
|
|
for (const lang of ["ru", "en", "zh"] as const) {
|
|
const response = await languageInstance(lang).patch(`/carrier/${id}`, {
|
|
...this.editCarrierData[lang],
|
|
city: cityName,
|
|
city_id: this.editCarrierData.city_id,
|
|
...(this.editCarrierData.logo
|
|
? { logo: this.editCarrierData.logo }
|
|
: {}),
|
|
});
|
|
|
|
runInAction(() => {
|
|
if (this.carrier[id]) {
|
|
this.carrier[id][lang] = response.data;
|
|
}
|
|
|
|
this.carriers[lang].data = this.carriers[lang].data.map(
|
|
(carrier: Carrier) =>
|
|
carrier.id === id ? { ...carrier, ...response.data } : carrier
|
|
);
|
|
});
|
|
}
|
|
};
|
|
}
|
|
|
|
export const carrierStore = new CarrierStore();
|