From 7813efbb26f098f6f3a763449eb995881b855b44 Mon Sep 17 00:00:00 2001 From: Reinaldo Neto Date: Wed, 7 Dec 2022 20:17:08 -0300 Subject: [PATCH] change avatar for profile it's done, missing fix revalidate the avatar in profile and drawer --- app/i18n/locales/en.json | 6 +- app/lib/methods/helpers/info.ts | 10 ++ .../ChangeAvatarView/AvatarSuggestion.tsx | 64 +++++------ app/views/ChangeAvatarView/AvatarUrl.tsx | 2 +- app/views/ChangeAvatarView/index.tsx | 106 ++++++++++++++++-- app/views/ProfileView/index.tsx | 18 +-- 6 files changed, 146 insertions(+), 60 deletions(-) diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index 87dbf80b0..b472c1b43 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -880,5 +880,9 @@ "Upload_image": "Upload image", "Delete_image": "Delete image", "Images_uploaded": "Images uploaded", - "Avatar": "Avatar" + "Avatar": "Avatar", + "insert_Avatar_URL": "insert image URL here", + "Discard_changes":"Discard changes?", + "Discard":"Discard", + "Discard_changes_description":"All changes will be lost if you go back without saving." } \ No newline at end of file diff --git a/app/lib/methods/helpers/info.ts b/app/lib/methods/helpers/info.ts index 2fc903d04..f184a76d8 100644 --- a/app/lib/methods/helpers/info.ts +++ b/app/lib/methods/helpers/info.ts @@ -2,6 +2,16 @@ import { Alert } from 'react-native'; import I18n from '../../../i18n'; +export const handleError = (e: any, _func: string, action: string) => { + if (e.data && e.data.error.includes('[error-too-many-requests]')) { + return showErrorAlert(e.data.error); + } + if (I18n.isTranslated(e.error)) { + return showErrorAlert(I18n.t(e.error)); + } + showErrorAlert(I18n.t('There_was_an_error_while_action', { action: I18n.t(action) })); +}; + export const showErrorAlert = (message: string, title?: string, onPress = () => {}): void => Alert.alert(title || '', message, [{ text: 'OK', onPress }], { cancelable: true }); diff --git a/app/views/ChangeAvatarView/AvatarSuggestion.tsx b/app/views/ChangeAvatarView/AvatarSuggestion.tsx index 1e9f43b6f..f0047099f 100644 --- a/app/views/ChangeAvatarView/AvatarSuggestion.tsx +++ b/app/views/ChangeAvatarView/AvatarSuggestion.tsx @@ -1,47 +1,47 @@ import React from 'react'; -import { Text, View, Alert, TouchableOpacity } from 'react-native'; +import { Text, View, TouchableOpacity } from 'react-native'; -import { IAvatar } from '../../definitions'; +import { IAvatar, IUser } from '../../definitions'; import I18n from '../../i18n'; import Avatar from '../../containers/Avatar'; // import Touch from '../../containers/Touch'; import styles from './styles'; import { useTheme } from '../../theme'; -const AvatarSuggestion = ({ avatarSuggestions }: { avatarSuggestions: IAvatar[] }) => { +const Item = ({ item, onPress, text }: { item?: IAvatar; onPress: (value?: IAvatar) => void; text?: string }) => { const { colors } = useTheme(); - const test = [ - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions, - ...avatarSuggestions - ]; - const renderItem = () => - test.slice(0, 8).map(item => ( - Alert.alert('aqui')} - style={[styles.avatarButton, { backgroundColor: colors.borderColor }]} - > - - - )); return ( - - {I18n.t('Images_uploaded')} - {renderItem()} - + onPress(item)} + style={[styles.avatarButton, { backgroundColor: colors.borderColor }]} + > + + ); }; +const AvatarSuggestion = ({ + avatarSuggestions, + onPress, + user, + resetAvatar +}: { + avatarSuggestions: IAvatar[]; + onPress: (value?: IAvatar) => void; + user?: IUser; + resetAvatar?: () => void; +}) => ( + + {I18n.t('Images_uploaded')} + + {user?.username && resetAvatar ? : null} + {avatarSuggestions.slice(0, 7).map(item => ( + + ))} + + +); export default AvatarSuggestion; diff --git a/app/views/ChangeAvatarView/AvatarUrl.tsx b/app/views/ChangeAvatarView/AvatarUrl.tsx index cb0d0ef0e..51882f32f 100644 --- a/app/views/ChangeAvatarView/AvatarUrl.tsx +++ b/app/views/ChangeAvatarView/AvatarUrl.tsx @@ -17,7 +17,7 @@ const AvatarUrl = ({ submit }: { submit: (value: string) => void }) => { return ( { - const [avatarUrl, setAvatarUrl] = useState(''); + const [avatar, setAvatarState] = useState(); const [avatarSuggestions, setAvatarSuggestions] = useState([]); + const [textAvatar, setTextAvatar] = useState(''); + const [saving, setSaving] = useState(false); const { colors } = useTheme(); + const { user } = useAppSelector(state => ({ + user: getUserSelector(state), + isMasterDetail: state.app.isMasterDetail + })); + + const avatarUrl = useRef(''); const navigation = useNavigation>(); const { fromUser, titleHeader } = useRoute>().params; useLayoutEffect(() => { - titleHeader ? navigation.setOptions({ title: titleHeader }) : navigation.setOptions({ title: I18n.t('Avatar') }); + navigation.setOptions({ + title: titleHeader || I18n.t('Avatar') + }); }, [titleHeader, navigation]); + useEffect(() => { + navigation.addListener('beforeRemove', e => { + if (!avatarUrl.current) { + return; + } + + e.preventDefault(); + + showConfirmationAlert({ + title: I18n.t('Discard_changes'), + message: I18n.t('Discard_changes_description'), + confirmationText: I18n.t('Discard'), + onPress: () => { + navigation.dispatch(e.data.action); + } + }); + }); + }, [navigation]); + const getAvatarSuggestion = async () => { const result = await Services.getAvatarSuggestion(); const suggestions = Object.keys(result).map(service => { @@ -54,7 +85,45 @@ const ChangeAvatarView = () => { } }, [fromUser]); - const user = useAppSelector(state => getUserSelector(state)); + const setAvatar = (value?: IAvatar) => { + avatarUrl.current = value?.url; + setAvatarState(value); + }; + + const submit = async () => { + if (avatar?.url) { + try { + setSaving(true); + await Services.setAvatarFromService(avatar); + setSaving(false); + avatarUrl.current = ''; + return navigation.goBack(); + } catch (e) { + log(e); + setSaving(false); + return handleError(e, 'setAvatarFromService', 'changing_avatar'); + } + } + + if (textAvatar) { + try { + setSaving(true); + await Services.resetAvatar(user.id); + setSaving(false); + avatarUrl.current = ''; + return navigation.goBack(); + } catch (e) { + setSaving(false); + handleError(e, 'resetAvatar', 'changing_avatar'); + } + } + }; + + const resetAvatar = () => { + setAvatar(undefined); + setTextAvatar(`@${user.username}`); + avatarUrl.current = `@${user.username}`; + }; return ( { {...scrollPersistTaps} > - + - + setAvatar({ url: value, data: value, service: 'url' })} /> - {fromUser && avatarSuggestions.length ? : null} + {fromUser && avatarSuggestions.length ? ( + + ) : null}