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