feat/panels #6
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
@ -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} />
|
||||
|
||||
@ -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;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user