Я не могу загрузить изображение в хранилище Appwrite React-Native ExpoAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Я не могу загрузить изображение в хранилище Appwrite React-Native Expo

Сообщение Anonymous »

Я пытаюсь загрузить и обновить аватар пользователя с экрана своего профиля, но когда я выбираю изображение из галереи или камеры, я получаю следующую ошибку:
Ошибка обновления аватара: [TypeError: Невозможно прочитать свойство «$id» неопределенного значения]
Ошибка загрузки файла: [Ошибка: TypeError: Невозможно прочитать свойство «$id» неопределенного значения]
мой файл приложения
import {
Account,
Avatars,
Client,
Databases,
ID,
Query,
Storage,
} from "react-native-appwrite";

const client = new Client();

client
.setEndpoint(appwriteConfig.endpoint)
.setProject(appwriteConfig.projectId)
.setPlatform(appwriteConfig.platform);

const account = new Account(client);
const avatars = new Avatars(client);
const databases = new Databases(client);
const storage = new Storage(client);

export async function getAccount() {
try {
const currentAccount = await account.get();

if (!currentAccount) throw Error();
return currentAccount;
} catch (error) {
throw new Error(error);
}
}

export const getCurrentUser = async () => {
try {
const currentAccount = await getAccount();
if (!currentAccount) throw new Error("Account not found");

const currentUser = await databases.listDocuments(
appwriteConfig.databaseId,
appwriteConfig.userCollectionId,
[Query.equal("accountId", currentAccount.$id)]
);

if (!currentUser.documents.length) {
throw new Error("User not found in database");
}
return currentUser.documents[0];
} catch (error) {
console.log("error fetching current user: ", error);
throw error;
}
};

export const updateAvatar = async (file) => {
if (!file) throw new Error("No file provided");

try {
const currentUser = await getCurrentUser();
console.log("current account", currentUser, currentUser.$id);
if (!currentUser || !currentUser.$id) {
throw new Error("User is not authenticated. Cannot upload file.");
}

console.log("Uploading file:", file);

const uploadedFile = await storage.createFile(
appwriteConfig.storageId,
ID.unique(),
file
);
console.log("Uploaded file response:", uploadedFile);
const fileId = uploadedFile.$id;

const fileUrl = storage.getFilePreview(
appwriteConfig.storageId,
fileId,
2000,
2000,
"top",
100
);

console.log("File URL:", fileUrl);
console.log("Current User ID:", currentUser.$id);

const updatedUser = await databases.updateDocument(
appwriteConfig.databaseId,
appwriteConfig.userCollectionId,
currentUser.$id,
{
avatar: fileUrl,
}
);
console.log("Current User ID:", currentUser.$id);

return updatedUser;
} catch (error) {
console.error("Error updating avatar:", error);
throw new Error(error);
}
};

Экран моего профиля, на котором я пытаюсь загрузить изображение профиля
import {
View,
Text,
ScrollView,
Image,
Modal,
TouchableOpacity,
} from "react-native";
import React, { useState } from "react";
import { SafeAreaView } from "react-native-safe-area-context";
import { icons } from "@/constants";
import ProfileButton from "@/components/ProfileButton";
import { useRouter } from "expo-router";
import { signOut, updateAvatar } from "@/lib/appwrite";
import { useGlobalContext } from "@/context/GlobalProvider";
import CustomButton from "@/components/CustomButton";
import * as ImagePicker from "expo-image-picker";

const Profile = () => {
const { user, setUser, setIsLoggedIn } = useGlobalContext();
const router = useRouter();

const [image, setImage] = useState();
const [modalVisible, setModalVisible] = useState(false);

const openImagePickerModal = () => {
setModalVisible(true);
};

const closeModal = () => {
setModalVisible(false);
};

const handleImagePicked = async (pickerResult) => {
if (!pickerResult.canceled) {
const pickedImage = pickerResult.assets[0].uri;
console.log("Selected image URI:", pickedImage);
try {
const response = await updateAvatar({
uri: pickedImage,
type: pickerResult.assets[0].type,
name: pickerResult.assets[0].fileName || "profile.png",
});
console.log("Uploaded file response:", response);
if (response) {
setImage(pickedImage);
} else {
console.log("File upload failed");
}
} catch (error) {
console.error("Error uploading file:", error);
}
}
closeModal();
};

const pickImageFromCamera = async () => {
const result = await ImagePicker.launchCameraAsync({
allowsEditing: true,
aspect: [1, 1],
quality: 1,
});
await handleImagePicked(result);
};

const pickImageFromGallery = async () => {
const result = await ImagePicker.launchImageLibraryAsync({
allowsEditing: true,
aspect: [1, 1],
quality: 1,
});
await handleImagePicked(result);
};

const navigateSettings = () => {
router.push("/yourprofile/settings");
};

const navigateYourProfile = () => {
router.push("/yourprofile/yourProfile");
};

const logOut = async () => {
await signOut();
setUser(null);
setIsLoggedIn(false);
router.replace("/sign-in");
};

return (






{image ? (

) : (

)}


{user?.username}















Profile Photo




Kamera





Galeri





Remove








);
};

export default Profile;

Я проверил и зарегистрировал «pickedImage», «currentUser», «currentAccount», «currentUser.$id», «file». От всех я получил необходимые ответы. Но когда я зарегистрировал «uploadedFile», я получил неопределенность. Изображение не загружалось, поэтому я думаю, что получил неопределенный '$id' от:
const fileId = uploadedFile.$id;

const fileUrl = storage.getFilePreview(
appwriteConfig.storageId,
fileId,
2000,
2000,
"top",
100
);


Подробнее здесь: https://stackoverflow.com/questions/791 ... ative-expo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»