@@ -142,7 +162,8 @@ const ToursSetting: React.FC = () => {
transportError ||
typeError ||
featureError ||
- featureTypeError
+ featureTypeError ||
+ amenitiesError
) {
return (
@@ -158,6 +179,7 @@ const ToursSetting: React.FC = () => {
typeRef();
featureRef();
featureTypeRef();
+ amenitiesRef();
}}
className="bg-gradient-to-r from-blue-600 to-cyan-600 text-white rounded-lg px-5 py-2 hover:opacity-90"
>
@@ -187,7 +209,7 @@ const ToursSetting: React.FC = () => {
{t("Belgilar (Badge)")}
{t("Tariflar")}
{t("Transport")}
- {/*
{t("Ovqatlanish")} */}
+
{t("Qulayliklar")}
{t("Otel turlari")}
{t("Otel sharoitlari")}
@@ -211,6 +233,13 @@ const ToursSetting: React.FC = () => {
pageSize={pageSizeTransport}
/>
+
+
+
= ({ name }) => {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- const IconComp: LazyExoticComponent> = React.lazy(
- async () => {
- const icons = await import("lucide-react");
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- return { default: (icons as any)[name] || HelpCircle };
- },
- );
-
- return (
- }>
-
-
- );
-};
-
-interface IconSelectProps {
+type IconSelectProps = {
selectedIcon?: string;
- defaultIcon?: string;
setSelectedIcon: (value: string) => void;
-}
-
-const IconSelect: React.FC = ({
- selectedIcon,
- defaultIcon = "HelpCircle",
- setSelectedIcon,
-}) => {
- const [icons, setIcons] = useState([]);
- const { t } = useTranslation();
- const [visibleIcons, setVisibleIcons] = useState([]);
- const [chunkSize] = useState(100);
- const [index, setIndex] = useState(1);
- const [containerEl, setContainerEl] = useState(null);
- const [isOpen, setIsOpen] = useState(false);
- const [searchTerm, setSearchTerm] = useState("");
-
- const loaderRef = useRef(null);
- const deferredSearch = useDeferredValue(searchTerm);
-
- useEffect(() => {
- if (!isOpen) return;
- const loadIcons = async () => {
- const mod = await import("lucide-react");
- const allIcons = Object.keys(mod).filter((k) => /^[A-Z]/.test(k));
- setIcons(allIcons);
- setVisibleIcons(allIcons.slice(0, chunkSize));
- setIndex(1);
- };
- loadIcons();
- }, [isOpen, chunkSize]);
-
- useEffect(() => {
- if (!containerEl || !loaderRef.current || !isOpen) return;
-
- const observer = new IntersectionObserver(
- (entries) => {
- if (entries[0].isIntersecting) {
- const start = index * chunkSize;
- const end = start + chunkSize;
- const next = icons.slice(start, end);
- if (next.length > 0) {
- setVisibleIcons((p) => [...p, ...next]);
- setIndex((p) => p + 1);
- }
- }
- },
- { root: containerEl, threshold: 1.0 },
- );
-
- observer.observe(loaderRef.current);
- return () => observer.disconnect();
- }, [containerEl, icons, index, chunkSize, isOpen]);
-
- const filteredIcons = useMemo(() => {
- const term = deferredSearch.trim().toLowerCase();
- if (!term) return visibleIcons;
- return icons.filter((n) => n.toLowerCase().includes(term));
- }, [icons, visibleIcons, deferredSearch]);
-
- const handleOpenChange = (open: boolean) => {
- setIsOpen(open);
- if (!open) {
- setVisibleIcons([]);
- setIcons([]);
- setIndex(1);
- setSearchTerm("");
- }
- };
-
- return (
-
- );
};
-export default IconSelect;
+export default function IconSelect({
+ selectedIcon,
+ setSelectedIcon,
+}: IconSelectProps) {
+ const [search, setSearch] = useState("");
+
+ const filteredIcons = hotelIcons.filter(
+ (icon) =>
+ icon.uz.toLowerCase().includes(search.toLowerCase()) ||
+ icon.ru.toLowerCase().includes(search.toLowerCase()) ||
+ icon.name.toLowerCase().includes(search.toLowerCase()),
+ );
+
+ return (
+
+
+
+ );
+}
diff --git a/src/widgets/sidebar/ui/Sidebar.tsx b/src/widgets/sidebar/ui/Sidebar.tsx
index 541856e..34c0a1d 100644
--- a/src/widgets/sidebar/ui/Sidebar.tsx
+++ b/src/widgets/sidebar/ui/Sidebar.tsx
@@ -268,7 +268,7 @@ export function Sidebar({ role }: SidebarProps) {
);
return (
-