Compare commits

...

2 Commits

Author SHA1 Message Date
Atash03 c7c5f4c158 bui;d 2026-04-06 19:27:08 +05:00
Atash03 ecfaff6bbd refactor: centralize Accept-Language header via axios interceptor
Add a request interceptor to the axios instance that automatically sets
the Accept-Language header from the Zustand language store, ensuring all
requests (including POST) send the locale. Remove redundant lang params
from service functions and hooks, and refactor B2B form to use the
shared service layer instead of raw axios with a hardcoded URL.
2026-04-06 19:25:53 +05:00
20 changed files with 68 additions and 112 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
dist/index.html vendored
View File

@ -66,9 +66,9 @@
})(window, document, "script", "dataLayer", "GTM-NK394LVK");
</script>
<title>Turkmen Textile</title>
<script type="module" crossorigin src="/assets/index-C9G0Csqa.js"></script>
<script type="module" crossorigin src="/assets/index-MPr5X3aY.js"></script>
<link rel="modulepreload" crossorigin href="/assets/react-vendor-B--yIoPF.js">
<link rel="modulepreload" crossorigin href="/assets/ui-library-CuSScUdV.js">
<link rel="modulepreload" crossorigin href="/assets/ui-library-BuCxlbiR.js">
<link rel="stylesheet" crossorigin href="/assets/index-BOfvbFOj.css">
</head>
<body>

View File

@ -2,12 +2,12 @@ import { AnimatePresence } from "motion/react";
import { FC, useMemo } from "react";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import axios from "axios";
import {
defaultValuesOfB2b,
createFormSchema,
FormType,
} from "@/lib/get-b2b-form-details";
import { postB2b } from "@/services/service";
import { Form } from "@/components/ui/form";
import { FormSuccesStatus } from "../form-succes-status";
import { Stage1, Stage2, Stage3 } from "../b2b";
@ -96,17 +96,9 @@ export const B2bForm: FC<Props> = ({
}
});
const res = await axios.post(
"https://turkmentextile.turkmenexpo.com/app/api/v1/form",
formData,
{
headers: {
"Content-Type": "multipart/form-data",
},
}
);
const success = await postB2b(formData);
if (res.status === 201) {
if (success) {
setSuccess(true);
}
} catch (error) {

View File

@ -9,7 +9,7 @@ import { Container } from "@/components/layout";
export const HomeNews: FC = () => {
const lang = useLangStore((state) => state.lang);
const { data, isPending } = useNews(lang);
const { data, isPending } = useNews();
if (isPending) return <Loader />;

View File

@ -7,7 +7,7 @@ export const useContacts = () => {
const { data, isPending } = useQuery({
queryKey: ["contacts", lang],
queryFn: () => getContacts(lang),
queryFn: () => getContacts(),
select: ({ data }) => data.data,
});

View File

@ -7,7 +7,7 @@ export const useDesigners = (id: number) => {
const { data, isPending } = useQuery({
queryKey: ["designers", lang],
queryFn: () => getDesigners(lang, id),
queryFn: () => getDesigners(id),
select: ({ data }) => data.data,
});

View File

@ -20,7 +20,7 @@ export const useExhibitionTime = () => {
const { data, isPending } = useQuery({
queryKey: ["exhibiton-time", lang],
queryFn: () => getExhibitionTime(lang),
queryFn: () => getExhibitionTime(),
select: ({ data }) => data.data,
});

View File

@ -7,7 +7,7 @@ export const useHomeContacts = () => {
const { data, isPending } = useQuery({
queryKey: ["home-contacts", lang],
queryFn: () => getHomeContacts(lang),
queryFn: () => getHomeContacts(),
select: ({ data }) => data.data,
});

View File

@ -24,7 +24,7 @@ export const useIndustries = () => {
const { data, isPending } = useQuery({
queryKey: ["industries", lang],
queryFn: () => getIndustries(lang),
queryFn: () => getIndustries(),
select: ({ data }) => data.data,
});

View File

@ -1,10 +1,13 @@
import { getNewsInner } from "@/services/service";
import { useLangStore } from "@/store/lang";
import { useQuery } from "@tanstack/react-query";
export const useNewsInner = (id: number, lang: string) => {
export const useNewsInner = (id: number) => {
const lang = useLangStore((state) => state.lang);
const { data, isPending } = useQuery({
queryKey: ["news-inner", id, lang],
queryFn: () => getNewsInner(id, lang),
queryFn: () => getNewsInner(id),
select: ({ data }) => data.data,
});

View File

@ -1,10 +1,13 @@
import { getNews } from "@/services/service";
import { useLangStore } from "@/store/lang";
import { useQuery } from "@tanstack/react-query";
export const useNews = (lang: "ru" | "en" | "tm") => {
export const useNews = () => {
const lang = useLangStore((state) => state.lang);
const { data, isPending } = useQuery({
queryKey: ["news", lang],
queryFn: () => getNews(lang),
queryFn: () => getNews(),
select: ({ data }) => data.data,
});

View File

@ -7,7 +7,7 @@ export const useParticipants = () => {
const { data, isPending } = useQuery({
queryKey: ["participants", lang],
queryFn: () => getParticipants(lang),
queryFn: () => getParticipants(),
select: ({ data }) => data.data,
});

View File

@ -23,7 +23,7 @@ export const usePartners = () => {
const { data, isPending } = useQuery({
queryKey: ["partners", lang],
queryFn: () => getPartners(lang),
queryFn: () => getPartners(),
select: ({ data }) => data.data,
});

View File

@ -7,7 +7,7 @@ export const useSponsors = () => {
const { data, isPending } = useQuery({
queryKey: ["sponsors", lang],
queryFn: () => getSponsors(lang),
queryFn: () => getSponsors(),
select: ({ data }) => data.data,
});

View File

@ -37,7 +37,7 @@ export const useStaticWords = (id: string) => {
const { data, isPending } = useQuery({
queryKey: ["static-words", lang, id],
queryFn: () => getStaticWords(lang, id),
queryFn: () => getStaticWords(id),
select: ({ data }) => data.data,
});

View File

@ -20,7 +20,7 @@ export const useStats = () => {
const { data, isPending } = useQuery({
queryKey: ["stats", lang],
queryFn: () => getStats(lang),
queryFn: () => getStats(),
select: ({ data }) => data.data,
});

View File

@ -15,8 +15,8 @@ export default function NewsInner() {
const pageId = Number(id);
useScrollTop(pageId);
const { data, isPending } = useNewsInner(pageId, lang);
const { data: news } = useNews(lang);
const { data, isPending } = useNewsInner(pageId);
const { data: news } = useNews();
if (isPending) return <Loader />;

View File

@ -11,7 +11,7 @@ export default function News() {
const lang = useLangStore((state) => state.lang);
const { data, isPending } = useNews(lang);
const { data, isPending } = useNews();
if (isPending) return <Loader />;

View File

@ -3,7 +3,6 @@ import { SponsorFormType } from "@/lib/get-sponsor-form-details";
import { StandFormType } from "@/lib/get-stend-form-details";
import axios from "axios";
import { ContactsPageType } from "./types/contacts.type";
import { LangState } from "@/store/lang";
import { StatsType } from "@/hooks/tanstack/use-stats";
import { HomeContactsType } from "./types/home-contacts.type";
import { StaticType } from "@/hooks/tanstack/use-static-words";
@ -15,11 +14,18 @@ import { ParticipantsType } from "./types/participants.type";
import { PhotoTypes } from "./types/photo.type";
import { DesignersType } from "./types/designers.type";
import { VideoTypes } from "./types/videos.type";
import { useLangStore } from "@/store/lang";
const axios_url = axios.create({
baseURL: "https://turkmentextile.turkmenexpo.com/app/api/v1/",
});
axios_url.interceptors.request.use((config) => {
const lang = useLangStore.getState().lang;
config.headers["Accept-Language"] = lang;
return config;
});
export const postStend = async (data: StandFormType): Promise<boolean> => {
const res = axios_url.post(`book_stand_form`, data);
@ -50,102 +56,62 @@ export const postSubscribe = async (data: { email: string }) => {
return (await res).status === 201;
};
export const getStaticWords = async (lang: LangState["lang"], id: string) => {
const data = axios_url.get<StaticType>(`pages/${id}`, {
headers: {
"Accept-Language": lang,
},
});
export const getStaticWords = async (id: string) => {
const data = axios_url.get<StaticType>(`pages/${id}`);
return data;
};
export const getPartners = async (lang: LangState["lang"]) => {
const data = axios_url.get<PartnersType>("partners", {
headers: {
"Accept-Language": lang,
},
});
export const getPartners = async () => {
const data = axios_url.get<PartnersType>("partners");
return data;
};
export const getStats = async (lang: LangState["lang"]) => {
const data = axios_url.get<StatsType>("stats", {
headers: {
"Accept-Language": lang,
},
});
export const getStats = async () => {
const data = axios_url.get<StatsType>("stats");
return data;
};
export const getContacts = async (lang: LangState["lang"]) => {
const data = axios_url.get<ContactsPageType>("contact_info", {
headers: {
"Accept-Language": lang,
},
});
export const getContacts = async () => {
const data = axios_url.get<ContactsPageType>("contact_info");
return data;
};
export const getHomeContacts = async (lang: LangState["lang"]) => {
const data = axios_url.get<HomeContactsType>("contact_data", {
headers: {
"Accept-Language": lang,
},
});
export const getHomeContacts = async () => {
const data = axios_url.get<HomeContactsType>("contact_data");
return data;
};
export const getIndustries = async (lang: LangState["lang"]) => {
const data = axios_url.get<IndustriesType>(`industries`, {
headers: {
"Accept-Language": lang,
},
});
export const getIndustries = async () => {
const data = axios_url.get<IndustriesType>(`industries`);
return data;
};
export const getExhibitionTime = async (lang: LangState["lang"]) => {
const data = axios_url.get<TimeType>(`exhibition_time`, {
headers: {
"Accept-Language": lang,
},
});
export const getExhibitionTime = async () => {
const data = axios_url.get<TimeType>(`exhibition_time`);
return data;
};
export const getNews = async (lang: "ru" | "en" | "tm") => {
const data = axios_url.get<NewsType>(`news?per_page=100`, {
headers: {
"Accept-Language": lang,
},
});
export const getNews = async () => {
const data = axios_url.get<NewsType>(`news?per_page=100`);
return data;
};
export const getNewsInner = async (id: number, lang: string) => {
const data = axios_url.get<NewsInnerType>(`news/${id}`, {
headers: {
"Accept-Language": lang,
},
});
export const getNewsInner = async (id: number) => {
const data = axios_url.get<NewsInnerType>(`news/${id}`);
return data;
};
export const getParticipants = async (lang: LangState["lang"]) => {
const data = axios_url<ParticipantsType>("participants", {
headers: {
"Accept-Language": lang,
},
});
export const getParticipants = async () => {
const data = axios_url<ParticipantsType>("participants");
return data;
};
@ -162,22 +128,14 @@ export const getVideos = async (id: number) => {
return data;
};
export const getSponsors = async (lang: LangState["lang"]) => {
const data = axios_url<PartnersType>("sponsors_and_partners", {
headers: {
"Accept-Language": lang,
},
});
export const getSponsors = async () => {
const data = axios_url<PartnersType>("sponsors_and_partners");
return data;
};
export const getDesigners = async (lang: LangState["lang"], id: number) => {
const data = axios_url<DesignersType>("designers/category/" + id, {
headers: {
"Accept-Language": lang,
},
});
export const getDesigners = async (id: number) => {
const data = axios_url<DesignersType>("designers/category/" + id);
return data;
};