Archived
1
0

feat/panels #6

Merged
mrqiz merged 5 commits from feat/panels into lord 2025-11-27 10:57:52 +03:00
4 changed files with 914 additions and 0 deletions
Showing only changes of commit c1769be91f - Show all commits

View File

@ -31,12 +31,13 @@ export default function SearchScreen() {
setLoading(true);
try {
const user = await usersApi.getUserByName(query);
// Переходим к профилю пользователя по его ID
router.push(`/user/${user.id}` as any);
setSearchQuery('');
} catch (error: any) {
}
catch (error: any) {
Alert.alert('Пользователь не найден', error.message || 'Пользователь с таким именем не существует');
} finally {
}
finally {
setLoading(false);
}
};

View File

@ -46,10 +46,12 @@ export default function SaveDetailScreen() {
setDescription(data.description || '');
setTags(data.tags.join(', ') || '');
setVisibility(data.visibility);
} catch (error: any) {
}
catch (error: any) {
Alert.alert('Ошибка', error.message || 'Не удалось загрузить сейв');
router.back();
} finally {
}
finally {
setLoading(false);
}
};
@ -71,9 +73,11 @@ export default function SaveDetailScreen() {
setSave(updated as SaveDetailResponse);
setEditing(false);
Alert.alert('Успех', 'Сейв обновлен');
} catch (error: any) {
}
catch (error: any) {
Alert.alert('Ошибка', error.message || 'Не удалось обновить сейв');
} finally {
}
finally {
setSaving(false);
}
};
@ -105,7 +109,6 @@ export default function SaveDetailScreen() {
const handleShare = async () => {
if (!save) return;
// Используем прямой URL из S3
const shareUrl = save.url;
if (shareUrl) {
@ -114,7 +117,8 @@ export default function SaveDetailScreen() {
message: shareUrl,
url: shareUrl,
});
} catch (error) {
}
catch (error) {
console.error('Ошибка при попытке поделиться:', error);
}
}
@ -123,17 +127,15 @@ export default function SaveDetailScreen() {
const handleCopyShareUrl = async () => {
if (!save || !save.shareUrl) return;
// Формируем полный URL для доступа к сейву по share token
const shareUrl = `${API_BASE_URL}/saves/${save.id}?share=${save.shareUrl}`;
try {
// Используем Share API - на некоторых платформах это позволяет скопировать
await Share.share({
message: `Ссылка для доступа к сейву: ${shareUrl}`,
url: shareUrl,
});
} catch (error) {
// Если Share не работает, показываем Alert с URL для ручного копирования
}
catch (error) {
Alert.alert(
'Ссылка для доступа',
`Скопируйте эту ссылку:\n\n${shareUrl}`,
@ -149,21 +151,19 @@ export default function SaveDetailScreen() {
router.push(`/user/${save.userId}` as any);
};
// Создаем видеоплеер (хуки должны вызываться до условных возвратов)
const videoPlayer = useVideoPlayer(
save?.type === 'video' ? save?.url ?? null : null,
(player) => {
// Автоматически не запускаем воспроизведение
player.muted = false;
}
);
// Обновляем источник видео при изменении save
useEffect(() => {
const updateVideoSource = async () => {
if (save?.type === 'video' && save?.url) {
await videoPlayer.replaceAsync(save.url);
} else if (save && save.type !== 'video') {
}
else if (save && save.type !== 'video') {
await videoPlayer.replaceAsync(null);
}
};
@ -183,10 +183,8 @@ export default function SaveDetailScreen() {
}
const isOwner = user?.id === save.userId;
// Используем прямой URL из S3 вместо /download эндпоинта
const mediaUrl = save.url;
// Компонент для отображения медиа
const renderMedia = () => {
if (save.type === 'video') {
return (
@ -198,7 +196,8 @@ export default function SaveDetailScreen() {
fullscreenOptions={{ enable: true }}
/>
);
} else if (save.type === 'image' || save.type === 'gif') {
}
else if (save.type === 'image' || save.type === 'gif') {
return (
<Image
source={{ uri: mediaUrl }}
@ -206,7 +205,8 @@ export default function SaveDetailScreen() {
resizeMode="contain"
/>
);
} else {
}
else {
return (
<View className="w-full h-[300px] rounded-xl mb-4 justify-center items-center" style={{ backgroundColor: colors.tabIconDefault }}>
<File size={64} color={colors.text} />

View File

@ -31,9 +31,11 @@ export default function UserProfileScreen() {
try {
const data = await savesApi.getPublicSavesByUser(slug);
setSaves(data);
} catch (error: any) {
}
catch (error: any) {
Alert.alert('Ошибка', error.message || 'Не удалось загрузить сейвы');
} finally {
}
finally {
setLoading(false);
setRefreshing(false);
}
@ -54,18 +56,16 @@ export default function UserProfileScreen() {
router.push(`/save/${save.id}`);
};
// Компонент для элемента списка
const SaveItem = React.memo(({ item }: { item: SaveListItem }) => {
if (!item) return null;
const itemColorScheme = useColorScheme();
const itemColors = Colors[itemColorScheme ?? 'light'];
const videoPlayer = useVideoPlayer(
item.type === 'video' ? item.url : null,
(player) => {
player.muted = true; // Без звука в списке
player.loop = true; // Зацикливание для превью
player.muted = true;
player.loop = true;
}
);