fitst commit

This commit is contained in:
Samandar Turgunboyev
2026-01-28 18:26:50 +05:00
parent 166a55b1e9
commit 124798419b
196 changed files with 26627 additions and 421 deletions

66
hooks/storage.native.ts Normal file
View File

@@ -0,0 +1,66 @@
import AsyncStorage from '@react-native-async-storage/async-storage';
export const saveAsyncStorage = async (name: string, value: string) => {
await AsyncStorage.setItem(name, value);
};
export const getAsyncStorage = (name: string) => {
return AsyncStorage.getItem(name);
};
export const deleteAsyncStorage = async (name: string) => {
await AsyncStorage.removeItem(name);
};
/**
* Lang qiymatini AsyncStorage ga saqlaydi
* @param lang 'uz' | 'ru' | 'en'
*/
export const saveLang = async (lang: string) => {
try {
await AsyncStorage.setItem('lang', lang);
console.log(`Language saved: ${lang}`);
} catch (error) {
console.error('Failed to save language', error);
}
};
/**
* AsyncStorage dan lang qiymatini oladi
* Agar mavjud bo'lmasa, null qaytaradi
*/
export const getLang = async (): Promise<string | null> => {
try {
const lang = await AsyncStorage.getItem('lang');
return lang;
} catch (error) {
console.error('Failed to get language', error);
return null;
}
};
/**
* AsyncStorage dan lang ni o'chiradi
*/
export const deleteLang = async () => {
try {
await AsyncStorage.removeItem('lang');
} catch (error) {
console.error('Failed to delete language', error);
}
};
const ACCESS = 'access_token';
const REFRESH = 'refresh_token';
export const setToken = (token: string) => AsyncStorage.setItem(ACCESS, token);
export const getToken = async () => AsyncStorage.getItem(ACCESS);
export const removeToken = () => AsyncStorage.removeItem(ACCESS);
export const setRefToken = (token: string) => AsyncStorage.setItem(REFRESH, token);
export const getRefToken = async () => AsyncStorage.getItem(REFRESH);
export const removeRefToken = () => AsyncStorage.removeItem(REFRESH);

View File

93
hooks/useSearch.ts Normal file
View File

@@ -0,0 +1,93 @@
import { TabKey } from '@/types';
import { companies, countries, products } from '@/types/data';
import { useEffect, useState } from 'react';
export function useDebouncedValue<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
export function useTabSearch(
activeTab: TabKey,
query: string,
selectedCategory?: string,
page: number = 1
) {
const [results, setResults] = useState<any[]>([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [totalPages, setTotalPages] = useState(1);
const itemsPerPage = 10;
useEffect(() => {
const searchData = async () => {
setIsLoading(true);
setError(null);
try {
await new Promise((resolve) => setTimeout(resolve, 300));
let filteredResults: any[] = [];
switch (activeTab) {
case 'products':
filteredResults = products.filter(
(p) =>
p.name.toLowerCase().includes(query.toLowerCase()) ||
p.description.toLowerCase().includes(query.toLowerCase())
);
if (selectedCategory) {
filteredResults = filteredResults.filter((p) => p.category === selectedCategory);
}
break;
case 'companies':
filteredResults = companies.filter(
(c) =>
c.company_name.toLowerCase().includes(query.toLowerCase()) ||
(c.description && c.description.toLowerCase().includes(query.toLowerCase()))
);
if (selectedCategory) {
filteredResults = filteredResults.filter((c) => c.industry === selectedCategory);
}
break;
case 'countries':
filteredResults = countries.filter((c) =>
c.name.toLowerCase().includes(query.toLowerCase())
);
break;
}
const total = Math.ceil(filteredResults.length / itemsPerPage);
setTotalPages(total || 1);
const startIndex = (page - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
const paginatedResults = filteredResults.slice(startIndex, endIndex);
setResults(paginatedResults);
} catch (err) {
setError('Failed to fetch data');
} finally {
setIsLoading(false);
}
};
searchData();
}, [activeTab, query, selectedCategory, page]);
return { results, isLoading, error, totalPages };
}