From f00c6aabce6688a3b3b650f8169bdf5f9af6f955 Mon Sep 17 00:00:00 2001 From: Dmytro Svyrydenko Date: Tue, 23 Jan 2024 16:15:40 +0200 Subject: [PATCH] fix: Pic loading + modals issue --- src/App.tsx | 33 +++++++------ src/components/EditPicture.tsx | 19 +++++--- src/components/ProfileBlock.tsx | 12 ++--- src/hooks/index.ts | 8 ++++ src/hooks/usePictureRecordValidation.tsx | 21 +++++++++ src/locales/en/messages.po | 40 ++++++++-------- src/locales/es/messages.po | 40 ++++++++-------- src/locales/fr/messages.po | 40 ++++++++-------- src/locales/kr/messages.po | 40 ++++++++-------- src/locales/tr/messages.po | 40 ++++++++-------- src/locales/zh-Hans/messages.po | 40 ++++++++-------- src/screens/Profile/index.tsx | 59 +++++++++++++----------- 12 files changed, 219 insertions(+), 173 deletions(-) create mode 100644 src/hooks/index.ts create mode 100644 src/hooks/usePictureRecordValidation.tsx diff --git a/src/App.tsx b/src/App.tsx index 4a28d0c..0010451 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,6 +10,7 @@ global.Buffer = global.Buffer || require("buffer").Buffer; import { registerRootComponent } from "expo"; import { RecoilRoot, useRecoilState } from "recoil"; import { ActivityIndicator, View, Text } from "react-native"; +import { GestureHandlerRootView } from "react-native-gesture-handler"; import { ReactNode, useEffect } from "react"; import { NavigationContainer } from "@react-navigation/native"; import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; @@ -195,19 +196,25 @@ function App() { return ( - - - - - - - - - - - - - + {/* + GestureHandlerRootView wrapper because of this + https://github.com/gorhom/react-native-bottom-sheet/issues/1389 + */} + + + + + + + + + + + + + + + ); } diff --git a/src/components/EditPicture.tsx b/src/components/EditPicture.tsx index cc42083..3400d3d 100644 --- a/src/components/EditPicture.tsx +++ b/src/components/EditPicture.tsx @@ -16,21 +16,25 @@ import { isTokenized } from "@bonfida/name-tokenizer"; import { t } from "@lingui/macro"; import { PublicKey, TransactionInstruction } from "@solana/web3.js"; import { useStatusModalContext } from "@src/contexts/StatusModalContext"; -import { useSolanaConnection } from "@src/hooks/xnft-hooks"; import { sendTx } from "@src/utils/send-tx"; import { WrapModal } from "./WrapModal"; import { unwrap } from "@src/utils/unwrap"; -import { useWallet } from "@src/hooks/useWallet"; +import { + useWallet, + usePictureRecordValidation, + useSolanaConnection, + useHandleError, +} from "@src/hooks"; import { uploadToIPFS } from "@src/utils/ipfs"; import { UiButton } from "@src/components/UiButton"; import { CustomTextInput } from "@src/components/CustomTextInput"; -import { useHandleError } from "@src/hooks/useHandleError"; export const EditPicture = ({ modal: { closeModal, getParam }, }: { modal: { closeModal: () => void; getParam: (a: string, b?: string) => T }; }) => { + const connection = useSolanaConnection(); const currentPic = getParam("currentPic"); const domain = getParam("domain"); const setAsFav = getParam("domain"); @@ -38,9 +42,9 @@ export const EditPicture = ({ const { setStatus } = useStatusModalContext(); const [loading, setLoading] = useState(false); const [pic, setPic] = useState(""); - const connection = useSolanaConnection(); const { handleError } = useHandleError(); const { publicKey, signTransaction, setVisible, connected } = useWallet(); + const { isValid: isCurrentPicValid } = usePictureRecordValidation(currentPic); const handle = async () => { if (!pic) return; @@ -172,14 +176,17 @@ export const EditPicture = ({ setLoading(false); } }; + return ( diff --git a/src/components/ProfileBlock.tsx b/src/components/ProfileBlock.tsx index 12c57fd..32b558d 100644 --- a/src/components/ProfileBlock.tsx +++ b/src/components/ProfileBlock.tsx @@ -16,8 +16,9 @@ interface ProfileBlockProps { children?: ReactNode; owner: string; domain: string; - picRecord: ReturnType; + picRecord: string | undefined; isPicValid: boolean; + onNewPicUploaded: () => void; } export const ProfileBlock = ({ @@ -26,6 +27,7 @@ export const ProfileBlock = ({ children, picRecord, isPicValid, + onNewPicUploaded, }: ProfileBlockProps) => { const { publicKey } = useWallet(); const { setStatus } = useStatusModalContext(); @@ -54,9 +56,7 @@ export const ProfileBlock = ({ > @@ -64,10 +64,10 @@ export const ProfileBlock = ({ openModal("EditPicture", { - currentPic: picRecord.result, + currentPic: picRecord, domain: domain, setAsFav: !favorite.result?.reverse, - refresh: picRecord.execute, + refresh: onNewPicUploaded, }) } style={tw`h-[24px] w-[24px] rounded-full flex items-center justify-center absolute bottom-0 right-0 bg-brand-accent`} diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 0000000..4b09867 --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,8 @@ +export * from "./usePictureRecordValidation"; +export * from "./useWallet"; +export * from "./xnft-hooks"; +export * from "./useHandleError"; +export * from "./useDomains"; +export * from "./useFavoriteDomain"; +export * from "./useUserProgress"; +export * from "./useSubdomains"; diff --git a/src/hooks/usePictureRecordValidation.tsx b/src/hooks/usePictureRecordValidation.tsx new file mode 100644 index 0000000..d44e3f3 --- /dev/null +++ b/src/hooks/usePictureRecordValidation.tsx @@ -0,0 +1,21 @@ +import { useEffect, useState } from "react"; +import axios from "axios"; + +export const usePictureRecordValidation = (pic: string | null | undefined) => { + const [isValid, setValidStatus] = useState(false); + const checkValidity = async () => { + try { + setValidStatus(false); + if (!pic) return; + await axios.get(pic); + setValidStatus(true); + } catch {} + }; + useEffect(() => { + checkValidity(); + }, [pic]); + + return { + isValid, + }; +}; diff --git a/src/locales/en/messages.po b/src/locales/en/messages.po index fa024a0..4d367a9 100644 --- a/src/locales/en/messages.po +++ b/src/locales/en/messages.po @@ -123,13 +123,13 @@ msgstr "" #: src/components/CreateSubdomainModal.tsx:92 #: src/components/DeleteModal.tsx:92 -#: src/components/EditPicture.tsx:210 +#: src/components/EditPicture.tsx:217 #: src/components/TransferModal.tsx:109 msgid "Cancel" msgstr "" -#: src/App.tsx:149 -#: src/App.tsx:165 +#: src/App.tsx:150 +#: src/App.tsx:166 msgid "Cart" msgstr "" @@ -137,7 +137,7 @@ msgstr "" msgid "Change language" msgstr "" -#: src/components/EditPicture.tsx:176 +#: src/components/EditPicture.tsx:181 msgid "Change profile picture" msgstr "" @@ -149,7 +149,7 @@ msgstr "" msgid "Clear all" msgstr "" -#: src/screens/Profile/index.tsx:283 +#: src/screens/Profile/index.tsx:286 msgid "Clear search" msgstr "" @@ -257,8 +257,8 @@ msgstr "" msgid "Domain name tokenization (wrapping), involves converting a domain name into an NFT. To reveal the original domain name, the token can be redeemed (unwrapped)." msgstr "" -#: src/App.tsx:139 -#: src/screens/Profile/index.tsx:225 +#: src/App.tsx:140 +#: src/screens/Profile/index.tsx:228 msgid "Domains" msgstr "" @@ -410,7 +410,7 @@ msgstr "" #~ msgid "Invalid IPFS record - Must start with ipfs://" #~ msgstr "" -#: src/components/EditPicture.tsx:57 +#: src/components/EditPicture.tsx:61 #: src/screens/DomainView.tsx:291 msgid "Invalid URL" msgstr "" @@ -428,11 +428,11 @@ msgstr "" msgid "Learn more in our docs" msgstr "" -#: src/screens/Profile/index.tsx:225 +#: src/screens/Profile/index.tsx:228 msgid "My domains" msgstr "" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "My sub domains" msgstr "" @@ -444,7 +444,7 @@ msgstr "" msgid "New {domain}.sol owner" msgstr "" -#: src/components/EditPicture.tsx:199 +#: src/components/EditPicture.tsx:206 msgid "New picture URL" msgstr "" @@ -457,7 +457,7 @@ msgid "No changes to save" msgstr "" #: src/components/SearchModal.tsx:74 -#: src/screens/Profile/index.tsx:273 +#: src/screens/Profile/index.tsx:276 msgid "No domain found" msgstr "" @@ -493,7 +493,7 @@ msgstr "" msgid "Payment" msgstr "" -#: src/components/EditPicture.tsx:134 +#: src/components/EditPicture.tsx:138 msgid "Permission to access photo album is required" msgstr "" @@ -501,7 +501,7 @@ msgstr "" msgid "Pic" msgstr "" -#: src/components/EditPicture.tsx:197 +#: src/components/EditPicture.tsx:204 msgid "Picture URL" msgstr "" @@ -517,7 +517,7 @@ msgstr "" msgid "Privacy Policy" msgstr "" -#: src/App.tsx:128 +#: src/App.tsx:129 msgid "Profile" msgstr "" @@ -525,7 +525,7 @@ msgstr "" #~ msgid "Profile completed: {percentage}%" #~ msgstr "" -#: src/screens/Profile/index.tsx:198 +#: src/screens/Profile/index.tsx:201 msgid "Profile completion: {percentage}%" msgstr "" @@ -564,7 +564,7 @@ msgstr "" msgid "Revert" msgstr "" -#: src/components/EditPicture.tsx:217 +#: src/components/EditPicture.tsx:224 #: src/screens/DomainView.tsx:689 msgid "Save" msgstr "" @@ -584,7 +584,7 @@ msgid "Search domains" msgstr "" #: src/screens/HomeScreen.tsx:95 -#: src/screens/Profile/index.tsx:232 +#: src/screens/Profile/index.tsx:235 #: src/screens/SearchResult.tsx:77 msgid "Search for a domain" msgstr "" @@ -653,7 +653,7 @@ msgstr "" msgid "Storage:" msgstr "" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "Sub domains" msgstr "" @@ -764,7 +764,7 @@ msgstr "" msgid "Unwrap your domain from NFT" msgstr "" -#: src/components/EditPicture.tsx:191 +#: src/components/EditPicture.tsx:198 msgid "Upload a picture..." msgstr "" diff --git a/src/locales/es/messages.po b/src/locales/es/messages.po index 6eec06a..ff908c5 100644 --- a/src/locales/es/messages.po +++ b/src/locales/es/messages.po @@ -89,13 +89,13 @@ msgstr "Al hacer clic en \"{actionName}\", se te pedirá una confirmación desde #: src/components/CreateSubdomainModal.tsx:92 #: src/components/DeleteModal.tsx:92 -#: src/components/EditPicture.tsx:210 +#: src/components/EditPicture.tsx:217 #: src/components/TransferModal.tsx:109 msgid "Cancel" msgstr "Cancelar" -#: src/App.tsx:149 -#: src/App.tsx:165 +#: src/App.tsx:150 +#: src/App.tsx:166 msgid "Cart" msgstr "Carrito" @@ -103,7 +103,7 @@ msgstr "Carrito" msgid "Change language" msgstr "Cambiar idioma" -#: src/components/EditPicture.tsx:176 +#: src/components/EditPicture.tsx:181 msgid "Change profile picture" msgstr "Cambiar foto de perfil" @@ -111,7 +111,7 @@ msgstr "Cambiar foto de perfil" msgid "Clear all" msgstr "Limpiar todo" -#: src/screens/Profile/index.tsx:283 +#: src/screens/Profile/index.tsx:286 msgid "Clear search" msgstr "Limpiar búsqueda" @@ -215,8 +215,8 @@ msgstr "¡Descubre el dominio que te representa!" msgid "Domain name tokenization (wrapping), involves converting a domain name into an NFT. To reveal the original domain name, the token can be redeemed (unwrapped)." msgstr "La tokenización de un nombre de dominio (envuelto) implica convertir un nombre de dominio en un NFT. Para revelar el nombre de dominio original, el token puede ser redimido (desenvuelto)." -#: src/App.tsx:139 -#: src/screens/Profile/index.tsx:225 +#: src/App.tsx:140 +#: src/screens/Profile/index.tsx:228 msgid "Domains" msgstr "Dominios" @@ -336,7 +336,7 @@ msgstr "En esto" msgid "Invalid {key} address" msgstr "Dirección {key} inválida" -#: src/components/EditPicture.tsx:57 +#: src/components/EditPicture.tsx:61 #: src/screens/DomainView.tsx:291 msgid "Invalid URL" msgstr "URL inválida" @@ -349,11 +349,11 @@ msgstr "IPFS" msgid "Learn more in our docs" msgstr "Aprende más en nuestra documentación" -#: src/screens/Profile/index.tsx:225 +#: src/screens/Profile/index.tsx:228 msgid "My domains" msgstr "Mis dominios" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "My sub domains" msgstr "" @@ -361,7 +361,7 @@ msgstr "" msgid "New {domain}.sol owner" msgstr "Nuevo propietario de {domain}.sol" -#: src/components/EditPicture.tsx:199 +#: src/components/EditPicture.tsx:206 msgid "New picture URL" msgstr "Nueva URL de imagen" @@ -374,7 +374,7 @@ msgid "No changes to save" msgstr "No hay cambios que guardar" #: src/components/SearchModal.tsx:74 -#: src/screens/Profile/index.tsx:273 +#: src/screens/Profile/index.tsx:276 msgid "No domain found" msgstr "No se encontró ningún dominio" @@ -402,7 +402,7 @@ msgstr "Pagar con" msgid "Payment" msgstr "Pago" -#: src/components/EditPicture.tsx:134 +#: src/components/EditPicture.tsx:138 msgid "Permission to access photo album is required" msgstr "Se requiere permiso para acceder al álbum de fotos" @@ -410,7 +410,7 @@ msgstr "Se requiere permiso para acceder al álbum de fotos" msgid "Pic" msgstr "Foto" -#: src/components/EditPicture.tsx:197 +#: src/components/EditPicture.tsx:204 msgid "Picture URL" msgstr "URL de la foto" @@ -426,11 +426,11 @@ msgstr "PUNTO" msgid "Privacy Policy" msgstr "" -#: src/App.tsx:128 +#: src/App.tsx:129 msgid "Profile" msgstr "Perfil" -#: src/screens/Profile/index.tsx:198 +#: src/screens/Profile/index.tsx:201 msgid "Profile completion: {percentage}%" msgstr "Finalización del perfil: {percentage}%" @@ -469,7 +469,7 @@ msgstr "Descuento de registro" msgid "Revert" msgstr "Revertir" -#: src/components/EditPicture.tsx:217 +#: src/components/EditPicture.tsx:224 #: src/screens/DomainView.tsx:689 msgid "Save" msgstr "Guardar" @@ -484,7 +484,7 @@ msgid "Search domains" msgstr "Buscar dominios" #: src/screens/HomeScreen.tsx:95 -#: src/screens/Profile/index.tsx:232 +#: src/screens/Profile/index.tsx:235 #: src/screens/SearchResult.tsx:77 msgid "Search for a domain" msgstr "Buscar un dominio" @@ -523,7 +523,7 @@ msgstr "Tamaño de Almacenamiento" msgid "Storage:" msgstr "Almacenamiento:" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "Sub domains" msgstr "" @@ -612,7 +612,7 @@ msgstr "Desenvolver NFT" msgid "Unwrap your domain from NFT" msgstr "Desenvolver tu dominio del NFT" -#: src/components/EditPicture.tsx:191 +#: src/components/EditPicture.tsx:198 msgid "Upload a picture..." msgstr "Subir una imagen..." diff --git a/src/locales/fr/messages.po b/src/locales/fr/messages.po index 98c9165..aefb7e0 100644 --- a/src/locales/fr/messages.po +++ b/src/locales/fr/messages.po @@ -91,13 +91,13 @@ msgstr "En cliquant sur \"{actionName}\", votre portefeuille vous demandera une #: src/components/CreateSubdomainModal.tsx:92 #: src/components/DeleteModal.tsx:92 -#: src/components/EditPicture.tsx:210 +#: src/components/EditPicture.tsx:217 #: src/components/TransferModal.tsx:109 msgid "Cancel" msgstr "Annuler" -#: src/App.tsx:149 -#: src/App.tsx:165 +#: src/App.tsx:150 +#: src/App.tsx:166 msgid "Cart" msgstr "Panier" @@ -105,7 +105,7 @@ msgstr "Panier" msgid "Change language" msgstr "Changez la langue" -#: src/components/EditPicture.tsx:176 +#: src/components/EditPicture.tsx:181 msgid "Change profile picture" msgstr "Changez votre photo de profil" @@ -113,7 +113,7 @@ msgstr "Changez votre photo de profil" msgid "Clear all" msgstr "Tout effacer" -#: src/screens/Profile/index.tsx:283 +#: src/screens/Profile/index.tsx:286 msgid "Clear search" msgstr "Effacez la recherche" @@ -223,8 +223,8 @@ msgstr "Découvrez le domaine qui vous représente !" msgid "Domain name tokenization (wrapping), involves converting a domain name into an NFT. To reveal the original domain name, the token can be redeemed (unwrapped)." msgstr "La tokenisation (enveloppement) de noms de domaine consiste à convertir un nom de domaine en NFT." -#: src/App.tsx:139 -#: src/screens/Profile/index.tsx:225 +#: src/App.tsx:140 +#: src/screens/Profile/index.tsx:228 msgid "Domains" msgstr "Domaines" @@ -351,7 +351,7 @@ msgstr "Dans cela" msgid "Invalid {key} address" msgstr "Adresse {key} invalide" -#: src/components/EditPicture.tsx:57 +#: src/components/EditPicture.tsx:61 #: src/screens/DomainView.tsx:291 msgid "Invalid URL" msgstr "URL invalide" @@ -364,11 +364,11 @@ msgstr "IPFS" msgid "Learn more in our docs" msgstr "En savoir plus dans nos docs" -#: src/screens/Profile/index.tsx:225 +#: src/screens/Profile/index.tsx:228 msgid "My domains" msgstr "Mes domaines" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "My sub domains" msgstr "" @@ -381,7 +381,7 @@ msgstr "" "\n" "" -#: src/components/EditPicture.tsx:199 +#: src/components/EditPicture.tsx:206 msgid "New picture URL" msgstr "Nouvelle photo de profil" @@ -394,7 +394,7 @@ msgid "No changes to save" msgstr "Aucuns changements à sauvegarder" #: src/components/SearchModal.tsx:74 -#: src/screens/Profile/index.tsx:273 +#: src/screens/Profile/index.tsx:276 msgid "No domain found" msgstr "Aucun domaine trouvé" @@ -422,7 +422,7 @@ msgstr "Payer avec" msgid "Payment" msgstr "Paiement" -#: src/components/EditPicture.tsx:134 +#: src/components/EditPicture.tsx:138 msgid "Permission to access photo album is required" msgstr "" "Une autorisation pour accéder à l'album photo est requise.\n" @@ -436,7 +436,7 @@ msgstr "" msgid "Pic" msgstr "Photo" -#: src/components/EditPicture.tsx:197 +#: src/components/EditPicture.tsx:204 msgid "Picture URL" msgstr "URL de la photo" @@ -452,11 +452,11 @@ msgstr "POINT" msgid "Privacy Policy" msgstr "" -#: src/App.tsx:128 +#: src/App.tsx:129 msgid "Profile" msgstr "Profil" -#: src/screens/Profile/index.tsx:198 +#: src/screens/Profile/index.tsx:201 msgid "Profile completion: {percentage}%" msgstr "Avancement du profil : {pourcentage} %" @@ -495,7 +495,7 @@ msgstr "Remise sur l'enregistrement" msgid "Revert" msgstr "Annuler" -#: src/components/EditPicture.tsx:217 +#: src/components/EditPicture.tsx:224 #: src/screens/DomainView.tsx:689 msgid "Save" msgstr "Sauvegarder" @@ -510,7 +510,7 @@ msgid "Search domains" msgstr "Recherchez des domains" #: src/screens/HomeScreen.tsx:95 -#: src/screens/Profile/index.tsx:232 +#: src/screens/Profile/index.tsx:235 #: src/screens/SearchResult.tsx:77 msgid "Search for a domain" msgstr "Recherchez un domaine" @@ -549,7 +549,7 @@ msgstr "Taille de stockage" msgid "Storage:" msgstr "Stockage:" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "Sub domains" msgstr "" @@ -638,7 +638,7 @@ msgstr "Désenvelopper le NFT" msgid "Unwrap your domain from NFT" msgstr "Désenveloppez votre domaine du NFT" -#: src/components/EditPicture.tsx:191 +#: src/components/EditPicture.tsx:198 msgid "Upload a picture..." msgstr "Téléchargez une photo..." diff --git a/src/locales/kr/messages.po b/src/locales/kr/messages.po index a217eb4..0fa4123 100644 --- a/src/locales/kr/messages.po +++ b/src/locales/kr/messages.po @@ -125,13 +125,13 @@ msgstr "{actionName}\"을(를) 클릭하면 지갑에서 승인 확인을 받게 #: src/components/CreateSubdomainModal.tsx:92 #: src/components/DeleteModal.tsx:92 -#: src/components/EditPicture.tsx:210 +#: src/components/EditPicture.tsx:217 #: src/components/TransferModal.tsx:109 msgid "Cancel" msgstr "취소" -#: src/App.tsx:149 -#: src/App.tsx:165 +#: src/App.tsx:150 +#: src/App.tsx:166 msgid "Cart" msgstr "장바구니" @@ -139,7 +139,7 @@ msgstr "장바구니" msgid "Change language" msgstr "언어 변경" -#: src/components/EditPicture.tsx:176 +#: src/components/EditPicture.tsx:181 msgid "Change profile picture" msgstr "프로필 사진 변경" @@ -151,7 +151,7 @@ msgstr "프로필 사진 변경" msgid "Clear all" msgstr "모두 지우기" -#: src/screens/Profile/index.tsx:283 +#: src/screens/Profile/index.tsx:286 msgid "Clear search" msgstr "검색 지우기" @@ -259,8 +259,8 @@ msgstr "당신만의 도메인을 탐색하세요!" msgid "Domain name tokenization (wrapping), involves converting a domain name into an NFT. To reveal the original domain name, the token can be redeemed (unwrapped)." msgstr "도메인 이름 토큰화(래핑)는 도메인 이름을 NFT로 변환하는 것을 뜻 합니다. 원래 도메인 이름을 드러내려면 토큰을 인출(언래핑)할 수 있습니다." -#: src/App.tsx:139 -#: src/screens/Profile/index.tsx:225 +#: src/App.tsx:140 +#: src/screens/Profile/index.tsx:228 msgid "Domains" msgstr "도메인" @@ -414,7 +414,7 @@ msgstr "유효하지 않은 {key} 주소" #~ msgid "Invalid IPFS record - Must start with ipfs://" #~ msgstr "유효하지 않은 IPFS 기록 - 반드시 ipfs://로 시작해야 합니다" -#: src/components/EditPicture.tsx:57 +#: src/components/EditPicture.tsx:61 #: src/screens/DomainView.tsx:291 msgid "Invalid URL" msgstr "유효하지 않은 URL입니다" @@ -432,11 +432,11 @@ msgstr "IPFS" msgid "Learn more in our docs" msgstr "문서로 더 알아보세요" -#: src/screens/Profile/index.tsx:225 +#: src/screens/Profile/index.tsx:228 msgid "My domains" msgstr "나의 도메인" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "My sub domains" msgstr "" @@ -448,7 +448,7 @@ msgstr "" msgid "New {domain}.sol owner" msgstr "새로운 {domain}.sol 소유자" -#: src/components/EditPicture.tsx:199 +#: src/components/EditPicture.tsx:206 msgid "New picture URL" msgstr "사진 업로드 URL" @@ -461,7 +461,7 @@ msgid "No changes to save" msgstr "저장할 변경 사항이 없습니다" #: src/components/SearchModal.tsx:74 -#: src/screens/Profile/index.tsx:273 +#: src/screens/Profile/index.tsx:276 msgid "No domain found" msgstr "도메인을 찾을 수 없습니다" @@ -501,7 +501,7 @@ msgstr "결제 방법" msgid "Payment" msgstr "결제" -#: src/components/EditPicture.tsx:134 +#: src/components/EditPicture.tsx:138 msgid "Permission to access photo album is required" msgstr "사진 앨범에 접근하기 위한 권한이 필요합니다" @@ -509,7 +509,7 @@ msgstr "사진 앨범에 접근하기 위한 권한이 필요합니다" msgid "Pic" msgstr "사진" -#: src/components/EditPicture.tsx:197 +#: src/components/EditPicture.tsx:204 msgid "Picture URL" msgstr "사진 URL" @@ -525,7 +525,7 @@ msgstr "포인트" msgid "Privacy Policy" msgstr "" -#: src/App.tsx:128 +#: src/App.tsx:129 msgid "Profile" msgstr "프로필" @@ -533,7 +533,7 @@ msgstr "프로필" #~ msgid "Profile completed: {percentage}%" #~ msgstr "프로필 완료율: {percentage}%" -#: src/screens/Profile/index.tsx:198 +#: src/screens/Profile/index.tsx:201 msgid "Profile completion: {percentage}%" msgstr "프로필 완성도: {percentage}%" @@ -572,7 +572,7 @@ msgstr "등록 할인" msgid "Revert" msgstr "취소" -#: src/components/EditPicture.tsx:217 +#: src/components/EditPicture.tsx:224 #: src/screens/DomainView.tsx:689 msgid "Save" msgstr "저장" @@ -592,7 +592,7 @@ msgid "Search domains" msgstr "도메인 검색" #: src/screens/HomeScreen.tsx:95 -#: src/screens/Profile/index.tsx:232 +#: src/screens/Profile/index.tsx:235 #: src/screens/SearchResult.tsx:77 msgid "Search for a domain" msgstr "도메인을 검색하기" @@ -661,7 +661,7 @@ msgstr "저장 용량" msgid "Storage:" msgstr "저장 용량:" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "Sub domains" msgstr "" @@ -767,7 +767,7 @@ msgstr "NFT 언랩하기" msgid "Unwrap your domain from NFT" msgstr "NFT에서 도메인을 언랩하기" -#: src/components/EditPicture.tsx:191 +#: src/components/EditPicture.tsx:198 msgid "Upload a picture..." msgstr "사진 업로드..." diff --git a/src/locales/tr/messages.po b/src/locales/tr/messages.po index e94dc4b..5c4833b 100644 --- a/src/locales/tr/messages.po +++ b/src/locales/tr/messages.po @@ -89,13 +89,13 @@ msgstr "\"{actionName}\"ya tıklayınca cüzdan onayı vermeniz istenecektir. " #: src/components/CreateSubdomainModal.tsx:92 #: src/components/DeleteModal.tsx:92 -#: src/components/EditPicture.tsx:210 +#: src/components/EditPicture.tsx:217 #: src/components/TransferModal.tsx:109 msgid "Cancel" msgstr "İptal" -#: src/App.tsx:149 -#: src/App.tsx:165 +#: src/App.tsx:150 +#: src/App.tsx:166 msgid "Cart" msgstr "Araç" @@ -103,7 +103,7 @@ msgstr "Araç" msgid "Change language" msgstr "Dili değiştir" -#: src/components/EditPicture.tsx:176 +#: src/components/EditPicture.tsx:181 msgid "Change profile picture" msgstr "Profil resmini değiştir" @@ -111,7 +111,7 @@ msgstr "Profil resmini değiştir" msgid "Clear all" msgstr "Tümünü temizle" -#: src/screens/Profile/index.tsx:283 +#: src/screens/Profile/index.tsx:286 msgid "Clear search" msgstr "Aramaları temizle" @@ -215,8 +215,8 @@ msgstr "Seni yansıtan domaini keşfet!" msgid "Domain name tokenization (wrapping), involves converting a domain name into an NFT. To reveal the original domain name, the token can be redeemed (unwrapped)." msgstr "Domain ismini tokenize edilmesi (wrapping), domain isminin NFT'ye dönüşümüdür. Asıl domain isminin tekrardan elde edilmesi için tokenin geri katlanması (unwrapping) gereklidir. " -#: src/App.tsx:139 -#: src/screens/Profile/index.tsx:225 +#: src/App.tsx:140 +#: src/screens/Profile/index.tsx:228 msgid "Domains" msgstr "Domainler" @@ -336,7 +336,7 @@ msgstr "Buna doğru" msgid "Invalid {key} address" msgstr "Geçersiz {key} adresi" -#: src/components/EditPicture.tsx:57 +#: src/components/EditPicture.tsx:61 #: src/screens/DomainView.tsx:291 msgid "Invalid URL" msgstr "Geçersiz URL " @@ -349,11 +349,11 @@ msgstr "IPFS" msgid "Learn more in our docs" msgstr "Dokümanlarımızı okuyarak daha fazla bilgi edinin" -#: src/screens/Profile/index.tsx:225 +#: src/screens/Profile/index.tsx:228 msgid "My domains" msgstr "Domainlerim" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "My sub domains" msgstr "" @@ -361,7 +361,7 @@ msgstr "" msgid "New {domain}.sol owner" msgstr "{domain}.sol'un yeni sahibi" -#: src/components/EditPicture.tsx:199 +#: src/components/EditPicture.tsx:206 msgid "New picture URL" msgstr "Yeni resim URL'si" @@ -374,7 +374,7 @@ msgid "No changes to save" msgstr "Kaydedilecek değişiklik yok" #: src/components/SearchModal.tsx:74 -#: src/screens/Profile/index.tsx:273 +#: src/screens/Profile/index.tsx:276 msgid "No domain found" msgstr "Domain bulunamadı" @@ -402,7 +402,7 @@ msgstr "ile öde" msgid "Payment" msgstr "Ödeme" -#: src/components/EditPicture.tsx:134 +#: src/components/EditPicture.tsx:138 msgid "Permission to access photo album is required" msgstr "Fotoğraf albümüne erişim izni gereklidir" @@ -410,7 +410,7 @@ msgstr "Fotoğraf albümüne erişim izni gereklidir" msgid "Pic" msgstr "Resim" -#: src/components/EditPicture.tsx:197 +#: src/components/EditPicture.tsx:204 msgid "Picture URL" msgstr "Resim URL'si" @@ -426,11 +426,11 @@ msgstr "PUAN" msgid "Privacy Policy" msgstr "" -#: src/App.tsx:128 +#: src/App.tsx:129 msgid "Profile" msgstr "Profil" -#: src/screens/Profile/index.tsx:198 +#: src/screens/Profile/index.tsx:201 msgid "Profile completion: {percentage}%" msgstr "Profil tamamlama: {percentage}%" @@ -469,7 +469,7 @@ msgstr "Kaydetme indirimi" msgid "Revert" msgstr "Eski haline getir" -#: src/components/EditPicture.tsx:217 +#: src/components/EditPicture.tsx:224 #: src/screens/DomainView.tsx:689 msgid "Save" msgstr "Kaydet" @@ -484,7 +484,7 @@ msgid "Search domains" msgstr "Domainler ara" #: src/screens/HomeScreen.tsx:95 -#: src/screens/Profile/index.tsx:232 +#: src/screens/Profile/index.tsx:235 #: src/screens/SearchResult.tsx:77 msgid "Search for a domain" msgstr "Domain için arama yap" @@ -523,7 +523,7 @@ msgstr "Depo Hacmi" msgid "Storage:" msgstr "Depo" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "Sub domains" msgstr "" @@ -612,7 +612,7 @@ msgstr "NFT'yi geri katla (unwrapping)" msgid "Unwrap your domain from NFT" msgstr "Domaini, NFT'den geri katla (unwrapping)" -#: src/components/EditPicture.tsx:191 +#: src/components/EditPicture.tsx:198 msgid "Upload a picture..." msgstr "Bir resim yükle..." diff --git a/src/locales/zh-Hans/messages.po b/src/locales/zh-Hans/messages.po index 2a75270..fae3f97 100644 --- a/src/locales/zh-Hans/messages.po +++ b/src/locales/zh-Hans/messages.po @@ -89,13 +89,13 @@ msgstr "点击\"{actionName}\",在您的钱包中完成确认" #: src/components/CreateSubdomainModal.tsx:92 #: src/components/DeleteModal.tsx:92 -#: src/components/EditPicture.tsx:210 +#: src/components/EditPicture.tsx:217 #: src/components/TransferModal.tsx:109 msgid "Cancel" msgstr "取消" -#: src/App.tsx:149 -#: src/App.tsx:165 +#: src/App.tsx:150 +#: src/App.tsx:166 msgid "Cart" msgstr "购物车" @@ -103,7 +103,7 @@ msgstr "购物车" msgid "Change language" msgstr "更换语言" -#: src/components/EditPicture.tsx:176 +#: src/components/EditPicture.tsx:181 msgid "Change profile picture" msgstr "更换个人头像" @@ -111,7 +111,7 @@ msgstr "更换个人头像" msgid "Clear all" msgstr "清除所有" -#: src/screens/Profile/index.tsx:283 +#: src/screens/Profile/index.tsx:286 msgid "Clear search" msgstr "清除搜索记录" @@ -215,8 +215,8 @@ msgstr "发现能代表你的域名!" msgid "Domain name tokenization (wrapping), involves converting a domain name into an NFT. To reveal the original domain name, the token can be redeemed (unwrapped)." msgstr "域名通证化(封装)是指将域名转换为 NFT,如果您需要将其恢复为原始域名,可通过转换(解开封装)该通证完成操作。" -#: src/App.tsx:139 -#: src/screens/Profile/index.tsx:225 +#: src/App.tsx:140 +#: src/screens/Profile/index.tsx:228 msgid "Domains" msgstr "域名" @@ -338,7 +338,7 @@ msgstr "进入" msgid "Invalid {key} address" msgstr "无效的 {key} 钱包地址" -#: src/components/EditPicture.tsx:57 +#: src/components/EditPicture.tsx:61 #: src/screens/DomainView.tsx:291 msgid "Invalid URL" msgstr "网址无效" @@ -351,11 +351,11 @@ msgstr "IPFS" msgid "Learn more in our docs" msgstr "在docs中学习更多内容" -#: src/screens/Profile/index.tsx:225 +#: src/screens/Profile/index.tsx:228 msgid "My domains" msgstr "我的域名" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "My sub domains" msgstr "" @@ -363,7 +363,7 @@ msgstr "" msgid "New {domain}.sol owner" msgstr "新的 {domain}.sol 所有者" -#: src/components/EditPicture.tsx:199 +#: src/components/EditPicture.tsx:206 msgid "New picture URL" msgstr "新的图片网址" @@ -376,7 +376,7 @@ msgid "No changes to save" msgstr "无需保存更改" #: src/components/SearchModal.tsx:74 -#: src/screens/Profile/index.tsx:273 +#: src/screens/Profile/index.tsx:276 msgid "No domain found" msgstr "未找到域名" @@ -404,7 +404,7 @@ msgstr "支付方式" msgid "Payment" msgstr "支付方式" -#: src/components/EditPicture.tsx:134 +#: src/components/EditPicture.tsx:138 msgid "Permission to access photo album is required" msgstr "请求获取相册权限" @@ -412,7 +412,7 @@ msgstr "请求获取相册权限" msgid "Pic" msgstr "图片" -#: src/components/EditPicture.tsx:197 +#: src/components/EditPicture.tsx:204 msgid "Picture URL" msgstr "图片网址" @@ -428,11 +428,11 @@ msgstr "积分" msgid "Privacy Policy" msgstr "" -#: src/App.tsx:128 +#: src/App.tsx:129 msgid "Profile" msgstr "个人账户" -#: src/screens/Profile/index.tsx:198 +#: src/screens/Profile/index.tsx:201 msgid "Profile completion: {percentage}%" msgstr "个人资料完成度: {percentage}%" @@ -471,7 +471,7 @@ msgstr "注册折扣" msgid "Revert" msgstr "返回" -#: src/components/EditPicture.tsx:217 +#: src/components/EditPicture.tsx:224 #: src/screens/DomainView.tsx:689 msgid "Save" msgstr "保存" @@ -486,7 +486,7 @@ msgid "Search domains" msgstr "搜索域名" #: src/screens/HomeScreen.tsx:95 -#: src/screens/Profile/index.tsx:232 +#: src/screens/Profile/index.tsx:235 #: src/screens/SearchResult.tsx:77 msgid "Search for a domain" msgstr "搜索域名" @@ -525,7 +525,7 @@ msgstr "存储容量" msgid "Storage:" msgstr "存储容量:" -#: src/screens/Profile/index.tsx:295 +#: src/screens/Profile/index.tsx:298 msgid "Sub domains" msgstr "" @@ -614,7 +614,7 @@ msgstr "将NFT解除封装" msgid "Unwrap your domain from NFT" msgstr "将NFT解除封装为你的域名" -#: src/components/EditPicture.tsx:191 +#: src/components/EditPicture.tsx:198 msgid "Upload a picture..." msgstr "上传一张图片..." diff --git a/src/screens/Profile/index.tsx b/src/screens/Profile/index.tsx index 874a48f..8cf76d9 100644 --- a/src/screens/Profile/index.tsx +++ b/src/screens/Profile/index.tsx @@ -8,22 +8,22 @@ import { import { useEffect, useState, useMemo } from "react"; import { useModal } from "react-native-modalfy"; import { useIsFocused } from "@react-navigation/native"; -import { useProfilePic } from "@bonfida/sns-react"; +import { useRecordsV2 } from "@bonfida/sns-react"; import { Trans, t } from "@lingui/macro"; import { Octicons, MaterialCommunityIcons } from "@expo/vector-icons"; -import axios from "axios"; import tw from "@src/utils/tailwind"; -import { useDomains } from "@src/hooks/useDomains"; -import { useFavoriteDomain } from "@src/hooks/useFavoriteDomain"; -import { useSolanaConnection } from "@src/hooks/xnft-hooks"; -import { useUserProgress } from "@src/hooks/useUserProgress"; -import { useWallet } from "@src/hooks/useWallet"; import { + usePictureRecordValidation, + useDomains, + useFavoriteDomain, + useSolanaConnection, + useUserProgress, + useWallet, useSubdomainsFromUser, SubdomainResult, -} from "@src/hooks/useSubdomains"; +} from "@src/hooks"; import { Screen } from "@src/components/Screen"; import { DomainRow } from "@src/components/DomainRow"; @@ -32,7 +32,7 @@ import { ProfileBlock } from "@src/components/ProfileBlock"; import { LoadingState } from "./LoadingState"; import { EmptyState } from "./EmptyState"; -import { getDomainKeySync } from "@bonfida/spl-name-service"; +import { Record, getDomainKeySync } from "@bonfida/spl-name-service"; export const ProfileScreen = ({ owner }: { owner?: string }) => { const connection = useSolanaConnection(); @@ -48,20 +48,23 @@ export const ProfileScreen = ({ owner }: { owner?: string }) => { const [searchQuery, setSearchQuery] = useState(""); const isFocused = useIsFocused(); const favorite = useFavoriteDomain(owner); - const picRecord = useProfilePic(connection!, favorite.result?.reverse || ""); - const progress = useUserProgress(); + const { + result: picRecordsList = [], + execute: refreshPic, + loading: picLoading, + } = useRecordsV2(connection!, favorite.result?.reverse!, [Record.Pic], true); - const [isCustomPicValid, setValidCustomPic] = useState(false); - const checkValidity = async () => { - try { - if (!picRecord.result) return; - await axios.get(picRecord.result); - setValidCustomPic(true); - } catch {} - }; - useEffect(() => { - checkValidity(); - }, [picRecord.result]); + const picRecord = useMemo(() => { + const picRecord = picRecordsList.find( + (r) => r?.record === Record.Pic, + )?.deserializedContent; + + return picRecord; + }, [picRecordsList]); + + const { isValid: isCurrentPicValid } = usePictureRecordValidation(picRecord); + + const progress = useUserProgress(); const isOwner = owner === publicKey?.toBase58(); @@ -76,16 +79,13 @@ export const ProfileScreen = ({ owner }: { owner?: string }) => { await Promise.allSettled([ favorite.execute(), progress.execute(), - picRecord.execute(), + refreshPic(), subdomains.execute(), ]); }; const loading = - domains.loading || - picRecord.loading || - progress.loading || - subdomains.loading; + domains.loading || picLoading || progress.loading || subdomains.loading; useEffect(() => { refresh().then(); @@ -189,7 +189,10 @@ export const ProfileScreen = ({ owner }: { owner?: string }) => { owner={owner!} domain={favorite.result?.reverse || domains?.result?.[0]?.domain!} picRecord={picRecord} - isPicValid={isCustomPicValid} + isPicValid={isCurrentPicValid} + onNewPicUploaded={() => { + refreshPic(); + }} > {showProgress && isOwner && (