From 7c4d1529d4527a5de27d6bc239f88dac001471ee Mon Sep 17 00:00:00 2001 From: jinyaqiu Date: Wed, 6 Aug 2025 15:45:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/png/icon/doneIP.png | Bin 0 -> 28669 bytes components/ui/button/stepButton.tsx | 49 ++++ components/user-message.tsx/done.tsx | 279 +++++++++++++++++------ components/user-message.tsx/look.tsx | 120 ++++++---- components/user-message.tsx/userName.tsx | 114 ++++++--- 5 files changed, 419 insertions(+), 143 deletions(-) create mode 100644 assets/images/png/icon/doneIP.png create mode 100644 components/ui/button/stepButton.tsx diff --git a/assets/images/png/icon/doneIP.png b/assets/images/png/icon/doneIP.png new file mode 100644 index 0000000000000000000000000000000000000000..641fecd9dbe9b0fe7175ec9a25d5cab9479b1d7d GIT binary patch literal 28669 zcmeEt^;cWn^EDK=LITCzt$5J@End86a4#(sFGT|sch_RY-3b&3(Be*UhfprH|v{`Wyg`<6qAI*IO~qb!G3J3)JZ`hjWxM&k_{T0;WCy%iQ3noIIq zg*STM=*OLo)h`D<_pVPNCo$K_85u6o#Y07{WG3XVCKmIk!0lAMq9lZ@?60lGqcoo9 z5D#algn-yJ-@m3FjulQuAI>7awIt;93#P>Tle7b~qYSQv{xWzWg zH?dJA33mNiL-xzHIn=kN@({A__Z0Y3X3fk@-)wC!2XP8D@N@|xk;7#Q{omLB=HP!g z_+J?O|3d{A<*#v>l-0ejhRsZ6FMhp8JjA{5eXfsaI2?caH5rnl%E=m<$ijAi_H@H3 zck`jimu-0pAHR}=le3H%ACGB!2siMCAi?q-1f+W$b@)>DN|&(=`@cU__Ir%{?DN_m z534#RABOG!{T0g_G`j``MXX;wuafNFCVRug6iSP?nGmpPvryN4weRwH$G;g?7wE~` z?R{Yf+rxQsGIdCg4lDwsl)cde5s=6YF_Fq#Pu7XzA(Uk=#!eNOr_aw@yP`Jk5rJRf zb)A*j($C$wzbBH&#Rm_X{JL4Sm$f@Nx`MoKJayoBz1=7O-vhbT1b^I71YVU5`v!iB zQvb=q$dM<^7@FA28anu`o?K>wby2supeBQQl6534v_6J~*%W!OW}17rCVNXeg!!Lo zzxUretd-L{$r~Q?*3j-vl79koo+C&coFJI3ev$YV_2ovzK}8f{D#auMhw z???U-j`F=H$-7OYT_w;MCU|i0t~HsT^C&;0$hOm6ulCAsnHZhaKMnYc^@)=VC^xj} z2HA6v61xm@@qcB4_{73&&mpIy5$kd)anvmLPkAYU@dhuRl~u-?sq3Gpq}h!*3`9~ToHt_xQm=3g!wm+`c^||KYvkez672*L0Bk>yNceaOW+q`YEi4oh0c>M zP4SbCQ*_hz&j4GeFWH>yℜ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 K=og4> void; + text: string + bg?: string + color?: string +} +const StepButton = (props: Props) => { + const { isLoading, onPress, text, bg, color } = props + + return ( + + {isLoading ? ( + + ) : ( + + {text} + + )} + + ) +} + +const styles = StyleSheet.create({ + button: { + width: '100%', + backgroundColor: '#E2793F', + borderRadius: 32, + padding: 18, + alignItems: 'center' + }, + disabledButton: { + opacity: 0.7, + }, + buttonText: { + color: '#FFFFFF', + fontWeight: '600', + fontSize: 18, + }, +}); + +export default StepButton diff --git a/components/user-message.tsx/done.tsx b/components/user-message.tsx/done.tsx index 9eba9d7..3005afd 100644 --- a/components/user-message.tsx/done.tsx +++ b/components/user-message.tsx/done.tsx @@ -1,89 +1,216 @@ -import DoneSvg from '@/assets/icons/svg/done.svg'; import { router } from 'expo-router'; +import React, { useEffect } from 'react'; import { useTranslation } from 'react-i18next'; -import { Platform, TouchableOpacity, View } from 'react-native'; +import { Dimensions, Image, PixelRatio, Platform, StyleSheet, View } from 'react-native'; +import Animated, { + Easing, + useAnimatedStyle, + useSharedValue, + withTiming +} from 'react-native-reanimated'; import { ThemedText } from '../ThemedText'; import { Fireworks } from '../firework'; -import Lottie from '../lottie/lottie'; +import StepButton from '../ui/button/stepButton'; export default function Done() { const { t } = useTranslation(); + const height = Dimensions.get('window').height; + const fontSize = (size: number) => { + const scale = PixelRatio.getFontScale(); + return size / scale; + }; + // Animation values + const translateX = useSharedValue(300); + const translateY = useSharedValue(300); + const opacity = useSharedValue(0); + + // Animation style + const animatedStyle = useAnimatedStyle(() => ({ + transform: [ + { translateX: translateX.value }, + { translateY: translateY.value } + ], + opacity: opacity.value + })); + + // Start animation when component mounts + useEffect(() => { + translateX.value = withTiming(0, { + duration: 800, + easing: Easing.out(Easing.cubic) + }); + translateY.value = withTiming(0, { + duration: 800, + easing: Easing.out(Easing.cubic) + }); + opacity.value = withTiming(1, { + duration: 1000, + easing: Easing.out(Easing.cubic) + }); + }, []); + const handleContinue = () => { router.replace('/ask') }; - return ( - - { - Platform.OS === 'web' - ? - - - - {t('auth.userMessage.allDone', { ns: 'login' })} - - - - - - - {/* Next Button */} - - - - {t('auth.userMessage.next', { ns: 'login' })} - - - - - : - - {/* 文字 */} - - - - {t('auth.userMessage.allDone', { ns: 'login' })} - - - {/* Next Button */} - - - - {t('auth.userMessage.next', { ns: 'login' })} - - - - - {/* 背景动画 - 烟花 */} - - - - - {/* 前景动画 - Lottie */} - - - - - } + const renderWebView = () => ( + + + + {t('auth.userMessage.allDone', { ns: 'login' })} + + + + + + + + + + + - ) + ); + + const renderMobileView = () => ( + + + + + {t('auth.userMessage.allDone', { ns: 'login' })} + + + + + + + + + + + + + + + + ); + + return ( + + {Platform.OS === 'web' ? renderWebView() : renderMobileView()} + + ); } + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + flex1: { + flex: 1, + }, + webContainer: { + flex: 1, + backgroundColor: '#FFB645', + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + height: '100%', + }, + webContent: { + position: 'absolute', + top: 32, + left: 0, + right: 0, + bottom: 160, + justifyContent: 'center', + alignItems: 'center', + }, + doneSvgContainer: { + flexDirection: 'row', + justifyContent: 'flex-end', + }, + webButtonContainer: { + position: 'absolute', + bottom: 16, + left: 0, + right: 0, + padding: 16, + zIndex: 99, + }, + mobileContainer: { + flex: 1, + backgroundColor: 'transparent', + }, + mobileContent: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + zIndex: 30, + }, + mobileTextContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + mobileButtonContainer: { + position: 'absolute', + bottom: 16, + left: 0, + right: 0, + padding: 16, + zIndex: 99, + }, + title: { + fontSize: 36, + lineHeight: 40, + color: '#FFFFFF', + textAlign: 'center', + fontWeight: 'bold', + }, + nextButton: { + width: '100%', + backgroundColor: '#3B82F6', + borderRadius: 999, + padding: 16, + alignItems: 'center', + }, + buttonText: { + color: '#FFFFFF', + fontSize: 18, + fontWeight: '600', + }, + fireworksContainer: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + zIndex: 10, + }, + lottieContainer: { + position: 'absolute', + right: 0, + bottom: 0, + zIndex: 20 + }, +}); diff --git a/components/user-message.tsx/look.tsx b/components/user-message.tsx/look.tsx index 90eb9fe..6084730 100644 --- a/components/user-message.tsx/look.tsx +++ b/components/user-message.tsx/look.tsx @@ -4,8 +4,10 @@ import LookSvg from '@/assets/icons/svg/look.svg'; import { ThemedText } from '@/components/ThemedText'; import { FileUploadItem } from '@/lib/background-uploader/types'; import { useTranslation } from 'react-i18next'; -import { ActivityIndicator, Alert, Image, TouchableOpacity, View } from 'react-native'; +import { Alert, Image, StyleSheet, View } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import FilesUploader from '../file-upload/files-uploader'; +import StepButton from '../ui/button/stepButton'; interface Props { setSteps?: (steps: Steps) => void; @@ -19,57 +21,51 @@ interface Props { export default function Look(props: Props) { const { fileData, setFileData, isLoading, handleUser, avatar } = props; const { t } = useTranslation(); - + const insets = useSafeAreaInsets(); return ( - - - + + + {t('auth.userMessage.look', { ns: 'login' })} - + {t('auth.userMessage.avatarText', { ns: 'login' })} {"\n"} {t('auth.userMessage.avatorText2', { ns: 'login' })} - { - fileData[0]?.preview || fileData[0]?.previewUrl - ? - - : - avatar - ? - - : - - } + {fileData[0]?.preview || fileData[0]?.previewUrl ? ( + + ) : avatar ? ( + + ) : ( + + )} { setFileData(fileData as FileUploadItem[]); }} showPreview={false} children={ - + - + {t('auth.userMessage.choosePhoto', { ns: 'login' })} } /> - {/* */} - {/* */} - - + { if (fileData[0]?.preview || fileData[0]?.previewUrl || avatar) { handleUser() @@ -77,17 +73,61 @@ export default function Look(props: Props) { Alert.alert(t('auth.userMessage.avatarRequired', { ns: 'login' })) } }} - disabled={isLoading} - > - {isLoading ? ( - - ) : ( - - {t('auth.userMessage.next', { ns: 'login' })} - - )} - + isLoading={isLoading} + bg="#FFFFFF" + color="#4C320C" + /> ); } + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#AC7E35', + paddingHorizontal: 24, + justifyContent: 'space-between', + }, + contentContainer: { + flex: 1, + alignItems: 'center', + gap: 28 + }, + title: { + fontSize: 32, + lineHeight: 36, + fontWeight: 'bold', + color: '#FFFFFF', + }, + subtitle: { + fontSize: 14, + color: "#fff", + textAlign: 'center', + marginBottom: 16, + }, + avatarImage: { + borderRadius: 150, + width: 215, + height: 215, + marginBottom: 16, + }, + uploadButton: { + width: '100%', + borderRadius: 999, + paddingHorizontal: 16, + paddingVertical: 13, + alignItems: 'center', + backgroundColor: '#FFF8DE', + flexDirection: 'row', + gap: 8, + }, + uploadButtonText: { + color: '#4C320C', + fontSize: 14, + fontWeight: '600', + }, + footer: { + width: '100%', + } +}); diff --git a/components/user-message.tsx/userName.tsx b/components/user-message.tsx/userName.tsx index 5db025b..9054563 100644 --- a/components/user-message.tsx/userName.tsx +++ b/components/user-message.tsx/userName.tsx @@ -2,7 +2,9 @@ import { Steps } from '@/app/(tabs)/user-message'; import { ThemedText } from '@/components/ThemedText'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { ActivityIndicator, KeyboardAvoidingView, Platform, TextInput, TouchableOpacity, View } from 'react-native'; +import { Dimensions, KeyboardAvoidingView, Platform, StyleSheet, TextInput, View } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import StepButton from '../ui/button/stepButton'; interface Props { setSteps: (steps: Steps) => void; @@ -14,6 +16,8 @@ export default function UserName(props: Props) { const { setSteps, username, setUsername } = props const { t } = useTranslation(); const [isLoading, setIsLoading] = useState(false) + const height = Dimensions.get('window').height; + const insets = useSafeAreaInsets(); const [error, setError] = useState('') const handleUserName = () => { if (!username) { @@ -28,45 +32,101 @@ export default function UserName(props: Props) { return ( - - - {/* Input container fixed at bottom */} - - - - {t('auth.userMessage.title', { ns: 'login' })} + + + + + + {t('auth.userMessage.title', { ns: 'login' })} - - - {t('auth.userMessage.username', { ns: 'login' })} - {error} + + + {t('auth.userMessage.username', { ns: 'login' })} + {error} - - {isLoading ? ( - - ) : ( - - {t('auth.userMessage.next', { ns: 'login' })} - - )} - + ) } + +const styles = StyleSheet.create({ + keyboardAvoidingView: { + flex: 1, + }, + container: { + flex: 1, + backgroundColor: '#FFB645', + height: '100%', + }, + flex1: { + flex: 1, + }, + inputContainer: { + width: '100%', + backgroundColor: '#FFFFFF', + padding: 16, + borderTopWidth: 1, + borderTopColor: '#E5E7EB', + borderTopLeftRadius: 50, + borderTopRightRadius: 50, + }, + contentContainer: { + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + width: '100%', + gap: 16, + }, + titleContainer: { + width: '100%', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + fontSize: 20, + }, + titleText: { + color: '#4C320C', + fontWeight: '600', + fontSize: 20, + marginBottom: 16, + }, + inputWrapper: { + width: '100%', + marginBottom: 16, + }, + labelContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: 10, + }, + labelText: { + color: '#AC7E35', + marginLeft: 8, + fontSize: 14, + fontWeight: '600', + }, + errorText: { + color: '#E2793F', + fontSize: 14, + }, + textInput: { + backgroundColor: '#FFF8DE', + borderRadius: 16, + padding: 20, + width: '100%', + } +});