feat: role system

This commit is contained in:
2026-03-18 20:11:07 +03:00
parent 73070fe233
commit c3127b8d47
47 changed files with 2425 additions and 768 deletions

View File

@@ -14,6 +14,7 @@ import {
BackButton,
TabPanel,
languageStore,
authStore,
Language,
cityStore,
isMediaIdEmpty,
@@ -40,7 +41,7 @@ import { SaveWithoutCityAgree } from "@widgets";
export const CreateInformationTab = observer(
({ value, index }: { value: number; index: number }) => {
const { cities } = cityStore;
const canReadCities = authStore.canRead("cities");
const [mediaId, setMediaId] = useState<string>("");
const [isPreviewMediaOpen, setIsPreviewMediaOpen] = useState(false);
const [isUploadMediaOpen, setIsUploadMediaOpen] = useState(false);
@@ -64,6 +65,30 @@ export const CreateInformationTab = observer(
// НОВОЕ СОСТОЯНИЕ ДЛЯ ПРЕДУПРЕЖДАЮЩЕГО ОКНА
const [isSaveWarningOpen, setIsSaveWarningOpen] = useState(false);
const baseCities = canReadCities
? cityStore.cities["ru"]?.data ?? []
: authStore.meCities["ru"].map((city) => ({
id: city.city_id,
name: city.name,
country: "",
country_code: "",
arms: "",
}));
const availableCities =
sight.city_id && !baseCities.some((city) => city.id === sight.city_id)
? [
{
id: sight.city_id,
name: sight.city || `Город ${sight.city_id}`,
country: "",
country_code: "",
arms: "",
},
...baseCities,
]
: baseCities;
useEffect(() => {}, [hardcodeType]);
useEffect(() => {
@@ -208,17 +233,16 @@ export const CreateInformationTab = observer(
/>
<Autocomplete
options={cities["ru"]?.data ?? []}
options={availableCities}
value={
cities["ru"]?.data?.find(
(city) => city.id === sight.city_id
) ?? null
availableCities.find((city) => city.id === sight.city_id) ?? null
}
getOptionLabel={(option) => option.name}
onChange={(_, value) => {
setCity(value?.id ?? 0);
handleChange({
city_id: value?.id ?? 0,
city: value?.name ?? "",
});
}}
renderInput={(params) => (

View File

@@ -14,6 +14,7 @@ import {
BackButton,
TabPanel,
languageStore,
authStore,
Language,
cityStore,
editSightStore,
@@ -62,10 +63,35 @@ export const InformationTab = observer(
const [hardcodeType, setHardcodeType] = useState<
"thumbnail" | "watermark_lu" | "watermark_rd" | "video_preview" | null
>(null);
const { cities } = cityStore;
const canReadCities = authStore.canRead("cities");
const [isSaveWarningOpen, setIsSaveWarningOpen] = useState(false);
const baseCities = canReadCities
? cityStore.cities["ru"]?.data ?? []
: authStore.meCities["ru"].map((city) => ({
id: city.city_id,
name: city.name,
country: "",
country_code: "",
arms: "",
}));
const availableCities =
sight.common.city_id &&
!baseCities.some((city) => city.id === sight.common.city_id)
? [
{
id: sight.common.city_id,
name: sight.common.city || `Город ${sight.common.city_id}`,
country: "",
country_code: "",
arms: "",
},
...baseCities,
]
: baseCities;
useEffect(() => {}, [hardcodeType]);
useEffect(() => {
@@ -208,11 +234,9 @@ export const InformationTab = observer(
/>
<Autocomplete
options={cities["ru"]?.data ?? []}
options={availableCities}
value={
cities["ru"]?.data?.find(
(city) => city.id === sight.common.city_id
) ?? null
availableCities.find((city) => city.id === sight.common.city_id) ?? null
}
getOptionLabel={(option) => option.name}
onChange={(_, value) => {
@@ -221,6 +245,7 @@ export const InformationTab = observer(
language as Language,
{
city_id: value?.id ?? 0,
city: value?.name ?? "",
},
true
);