fix: Fix Map page

This commit is contained in:
2025-06-12 22:50:43 +03:00
parent 27cb644242
commit 300ff262ce
41 changed files with 2216 additions and 1055 deletions

View File

@ -1,4 +1,10 @@
import { authInstance, editSightStore, Language, languageStore } from "@shared";
import {
authInstance,
editSightStore,
Language,
languageStore,
languageInstance,
} from "@shared";
import { computed, makeAutoObservable, runInAction } from "mobx";
export type Article = {
@ -6,6 +12,18 @@ export type Article = {
heading: string;
body: string;
service_name: string;
ru?: {
heading: string;
body: string;
};
en?: {
heading: string;
body: string;
};
zh?: {
heading: string;
body: string;
};
};
type Media = {
@ -99,13 +117,25 @@ class ArticlesStore {
this.articleLoading = false;
};
getArticle = async (id: number) => {
getArticle = async (id: number, language?: Language) => {
this.articleLoading = true;
const response = await authInstance.get(`/article/${id}`);
runInAction(() => {
this.articleData = response.data;
});
if (language) {
const response = await languageInstance(language).get(`/article/${id}`);
runInAction(() => {
if (!this.articleData) {
this.articleData = { id, heading: "", body: "", service_name: "" };
}
this.articleData[language] = {
heading: response.data.heading,
body: response.data.body,
};
});
} else {
const response = await authInstance.get(`/article/${id}`);
runInAction(() => {
this.articleData = response.data;
});
}
this.articleLoading = false;
};
@ -137,6 +167,20 @@ class ArticlesStore {
}
return null;
});
deleteArticles = async (ids: number[]) => {
for (const id of ids) {
await authInstance.delete(`/article/${id}`);
}
for (const id of ["ru", "en", "zh"] as Language[]) {
runInAction(() => {
this.articleList[id].data = this.articleList[id].data.filter(
(article) => !ids.includes(article.id)
);
});
}
};
}
export const articlesStore = new ArticlesStore();

View File

@ -1,4 +1,4 @@
import { authInstance } from "@shared";
import { authInstance, cityStore, languageStore } from "@shared";
import { makeAutoObservable, runInAction } from "mobx";
export type Carrier = {
@ -9,9 +9,9 @@ export type Carrier = {
city: string;
city_id: number;
logo: string;
main_color: string;
left_color: string;
right_color: string;
// main_color: string;
// left_color: string;
// right_color: string;
};
type Carriers = {
@ -68,9 +68,9 @@ class CarrierStore {
city: "",
city_id: 0,
logo: "",
main_color: "",
left_color: "",
right_color: "",
// main_color: "",
// left_color: "",
// right_color: "",
};
}
this.carrier[id] = response.data;
@ -81,22 +81,22 @@ class CarrierStore {
createCarrier = async (
fullName: string,
shortName: string,
city: string,
cityId: number,
main_color: string,
left_color: string,
right_color: string,
// main_color: string,
// left_color: string,
// right_color: string,
slogan: string,
logoId: string
) => {
const response = await authInstance.post("/carrier", {
full_name: fullName,
short_name: shortName,
city,
city: "",
city_id: cityId,
main_color,
left_color,
right_color,
// main_color,
// left_color,
// right_color,
slogan,
logo: logoId,
});
@ -108,11 +108,11 @@ class CarrierStore {
editCarrierData = {
full_name: "",
short_name: "",
city: "",
city_id: 0,
main_color: "",
left_color: "",
right_color: "",
// main_color: "",
// left_color: "",
// right_color: "",
slogan: "",
logo: "",
};
@ -120,32 +120,35 @@ class CarrierStore {
setEditCarrierData = (
fullName: string,
shortName: string,
city: string,
cityId: number,
main_color: string,
left_color: string,
right_color: string,
// main_color: string,
// left_color: string,
// right_color: string,
slogan: string,
logoId: string
) => {
this.editCarrierData = {
full_name: fullName,
short_name: shortName,
city,
city_id: cityId,
main_color: main_color,
left_color: left_color,
right_color: right_color,
// main_color: main_color,
// left_color: left_color,
// right_color: right_color,
slogan: slogan,
logo: logoId,
};
};
editCarrier = async (id: number) => {
const response = await authInstance.patch(
`/carrier/${id}`,
this.editCarrierData
);
const { language } = languageStore;
const response = await authInstance.patch(`/carrier/${id}`, {
...this.editCarrierData,
city: cityStore.cities[language].data.find(
(city) => city.id === this.editCarrierData.city_id
)?.name,
});
runInAction(() => {
this.carriers.data = this.carriers.data.map((carrier) =>

View File

@ -4,6 +4,7 @@ import {
Language,
languageStore,
countryStore,
CashedCountries,
} from "@shared";
import { makeAutoObservable, runInAction } from "mobx";
@ -16,9 +17,18 @@ export type City = {
};
export type CashedCities = {
ru: City[];
en: City[];
zh: City[];
ru: {
data: City[];
loaded: boolean;
};
en: {
data: City[];
loaded: boolean;
};
zh: {
data: City[];
loaded: boolean;
};
};
export type CashedCity = {
@ -29,9 +39,18 @@ export type CashedCity = {
class CityStore {
cities: CashedCities = {
ru: [],
en: [],
zh: [],
ru: {
data: [],
loaded: false,
},
en: {
data: [],
loaded: false,
},
zh: {
data: [],
loaded: false,
},
};
city: Record<string, CashedCity> = {};
@ -40,25 +59,37 @@ class CityStore {
makeAutoObservable(this);
}
ruCities: City[] = [];
ruCities: {
data: City[];
loaded: boolean;
} = {
data: [],
loaded: false,
};
getRuCities = async () => {
if (this.ruCities.loaded) {
return;
}
const response = await languageInstance("ru").get(`/city`);
runInAction(() => {
this.ruCities = response.data;
this.ruCities.data = response.data;
this.ruCities.loaded = true;
});
};
getCities = async (language: keyof CashedCities) => {
if (this.cities[language] && this.cities[language].length > 0) {
if (this.cities[language].loaded) {
return;
}
const response = await authInstance.get(`/city`);
runInAction(() => {
this.cities[language] = response.data;
this.cities[language].data = response.data;
this.cities[language].loaded = true;
});
};
@ -83,19 +114,22 @@ class CityStore {
return response.data;
};
deleteCity = async (code: string, language: keyof CashedCities) => {
deleteCity = async (code: string) => {
await authInstance.delete(`/city/${code}`);
runInAction(() => {
this.cities[language] = this.cities[language].filter(
(city) => city.country_code !== code
);
this.city[code][language] = null;
for (const secondaryLanguage of ["ru", "en", "zh"] as Language[]) {
this.cities[secondaryLanguage].data = this.cities[
secondaryLanguage
].data.filter((city) => city.id !== Number(code));
if (this.city[code]) {
this.city[code][secondaryLanguage] = null;
}
}
});
};
createCityData = {
country: "",
country_code: "",
arms: "",
ru: {
@ -111,14 +145,12 @@ class CityStore {
setCreateCityData = (
name: string,
country: string,
country_code: string,
arms: string,
language: keyof CashedCities
) => {
this.createCityData = {
...this.createCityData,
country: country,
country_code: country_code,
arms: arms,
[language]: {
@ -127,73 +159,84 @@ class CityStore {
};
};
createCity = async () => {
const { language } = languageStore;
const { country, country_code, arms } = this.createCityData;
const { name } = this.createCityData[language as keyof CashedCities];
async createCity() {
const language = languageStore.language as Language;
const { country_code, arms } = this.createCityData;
const { name } = this.createCityData[language];
if (name && country && country_code && arms) {
const cityResponse = await languageInstance(language as Language).post(
"/city",
{
name: name,
country: country,
country_code: country_code,
arms: arms,
}
);
if (!name || !country_code) {
return;
}
runInAction(() => {
this.cities[language as keyof CashedCities] = [
...this.cities[language as keyof CashedCities],
cityResponse.data,
];
try {
// Create city in primary language
const cityResponse = await languageInstance(language).post("/city", {
name,
country:
countryStore.countries[language as keyof CashedCountries]?.data.find(
(c) => c.code === country_code
)?.name || "",
country_code,
arms: arms || "",
});
for (const secondaryLanguage of ["ru", "en", "zh"].filter(
const cityId = cityResponse.data.id;
// Create/update other language versions
for (const secondaryLanguage of (["ru", "en", "zh"] as Language[]).filter(
(l) => l !== language
)) {
const { name } =
this.createCityData[secondaryLanguage as keyof CashedCities];
const { name: secondaryName } = this.createCityData[secondaryLanguage];
const patchResponse = await languageInstance(
secondaryLanguage as Language
).patch(`/city/${cityResponse.data.id}`, {
name: name,
country: country,
country_code: country_code,
arms: arms,
});
// Get country name in secondary language
const countryName =
countryStore.countries[secondaryLanguage]?.data.find(
(c) => c.code === country_code
)?.name || "";
const patchResponse = await languageInstance(secondaryLanguage).patch(
`/city/${cityId}`,
{
name: secondaryName || "",
country: countryName,
country_code: country_code || "",
arms: arms || "",
}
);
runInAction(() => {
this.cities[secondaryLanguage as keyof CashedCities] = [
...this.cities[secondaryLanguage as keyof CashedCities],
this.cities[secondaryLanguage].data = [
...this.cities[secondaryLanguage].data,
patchResponse.data,
];
});
}
}
runInAction(() => {
this.createCityData = {
country: "",
country_code: "",
arms: "",
ru: {
name: "",
},
en: {
name: "",
},
zh: {
name: "",
},
};
});
};
// Update primary language data
runInAction(() => {
this.cities[language].data = [
...this.cities[language].data,
cityResponse.data,
];
});
// Reset form data
runInAction(() => {
this.createCityData = {
country_code: "",
arms: "",
ru: { name: "" },
en: { name: "" },
zh: { name: "" },
};
});
} catch (error) {
console.error("Error creating city:", error);
throw error;
}
}
editCityData = {
country: "",
country_code: "",
arms: "",
ru: {
@ -209,14 +252,12 @@ class CityStore {
setEditCityData = (
name: string,
country: string,
country_code: string,
arms: string,
language: keyof CashedCities
) => {
this.editCityData = {
...this.editCityData,
country: country,
country_code: country_code,
arms: arms,
@ -232,7 +273,7 @@ class CityStore {
const { name } = this.editCityData[language as keyof CashedCities];
const { countries } = countryStore;
const country = countries[language as keyof CashedCities].find(
const country = countries[language as keyof CashedCities].data.find(
(country) => country.code === country_code
);
@ -255,9 +296,9 @@ class CityStore {
}
if (this.cities[language as keyof CashedCities]) {
this.cities[language as keyof CashedCities] = this.cities[
this.cities[language as keyof CashedCities].data = this.cities[
language as keyof CashedCities
].map((city) =>
].data.map((city) =>
city.id === Number(code)
? {
id: city.id,

View File

@ -12,9 +12,18 @@ export type Country = {
};
export type CashedCountries = {
ru: Country[];
en: Country[];
zh: Country[];
ru: {
data: Country[];
loaded: boolean;
};
en: {
data: Country[];
loaded: boolean;
};
zh: {
data: Country[];
loaded: boolean;
};
};
export type CashedCountry = {
@ -25,9 +34,18 @@ export type CashedCountry = {
class CountryStore {
countries: CashedCountries = {
ru: [],
en: [],
zh: [],
ru: {
data: [],
loaded: false,
},
en: {
data: [],
loaded: false,
},
zh: {
data: [],
loaded: false,
},
};
country: Record<string, CashedCountry> = {};
@ -37,14 +55,15 @@ class CountryStore {
}
getCountries = async (language: keyof CashedCountries) => {
if (this.countries[language] && this.countries[language].length > 0) {
if (this.countries[language].loaded) {
return;
}
const response = await authInstance.get(`/country`);
const response = await languageInstance(language).get(`/country`);
runInAction(() => {
this.countries[language] = response.data;
this.countries[language].data = response.data;
this.countries[language].loaded = true;
});
};
@ -76,10 +95,15 @@ class CountryStore {
await authInstance.delete(`/country/${code}`);
runInAction(() => {
this.countries[language] = this.countries[language].filter(
this.countries[language].data = this.countries[language].data.filter(
(country) => country.code !== code
);
this.country[code][language] = null;
this.countries[language].loaded = true;
this.country[code] = {
ru: null,
en: null,
zh: null,
};
});
};
@ -121,8 +145,8 @@ class CountryStore {
});
runInAction(() => {
this.countries[language as keyof CashedCountries] = [
...this.countries[language as keyof CashedCountries],
this.countries[language as keyof CashedCountries].data = [
...this.countries[language as keyof CashedCountries].data,
{ code: code, name: name },
];
});
@ -142,8 +166,8 @@ class CountryStore {
);
}
runInAction(() => {
this.countries[secondaryLanguage as keyof CashedCountries] = [
...this.countries[secondaryLanguage as keyof CashedCountries],
this.countries[secondaryLanguage as keyof CashedCountries].data = [
...this.countries[secondaryLanguage as keyof CashedCountries].data,
{ code: code, name: name },
];
});
@ -204,11 +228,10 @@ class CountryStore {
};
}
if (this.countries[language as keyof CashedCountries]) {
this.countries[language as keyof CashedCountries] = this.countries[
language as keyof CashedCountries
].map((country) =>
country.code === code ? { code, name } : country
);
this.countries[language as keyof CashedCountries].data =
this.countries[language as keyof CashedCountries].data.map(
(country) => (country.code === code ? { code, name } : country)
);
}
});
}