import React, { useState, useEffect } from "react"; import { View, Text, Image, Button } from "@tarojs/components"; import { PopupPicker } from "@/components/Picker/index"; import Taro from "@tarojs/taro"; import "./index.scss"; import { UserService, PickerOption } from "@/services/userService"; import { clear_login_state } from "@/services/loginService"; import { convert_db_gender_to_display } from "@/utils/genderUtils"; import { EditModal, GeneralNavbar } from "@/components"; // import img from "@/config/images"; import CommonDialog from "@/components/CommonDialog"; import { useUserActions, useUserInfo, useNicknameChangeStatus, } from "@/store/userStore"; import { UserInfoType } from "@/services/userService"; import { useCities, useProfessions, useNtrpLevels, } from "@/store/pickerOptionsStore"; import { handleCustomerService } from "@/services/userService"; import evaluateService from "@/services/evaluateService"; const EditProfilePage: React.FC = () => { const { updateUserInfo, updateNickname } = useUserActions(); // 直接从store获取用户信息,确保响应式更新 const user_info = useUserInfo(); const nickname_change_status = useNicknameChangeStatus(); const ntrpLevels = useNtrpLevels(); // 表单状态,基于store中的用户信息初始化 const getInitialFormData = () => { const info = user_info as UserInfoType; return { nickname: info?.nickname ?? "", personal_profile: info?.personal_profile ?? "", occupation: info?.occupation ?? "", ntrp_level: info?.ntrp_level ?? "", phone: info?.phone ?? "", gender: info?.gender ?? "", birthday: info?.birthday ?? "", country: info?.country ?? "", province: info?.province ?? "", city: info?.city ?? "", district: info?.district ?? "", }; }; const [form_data, setFormData] = useState(getInitialFormData()); // 加载状态 const [loading, setLoading] = useState(false); const [showLogoutDialog, setShowLogoutDialog] = useState(false); // 编辑弹窗状态 const [edit_modal_visible, setEditModalVisible] = useState(false); const [editing_field, setEditingField] = useState(""); const [gender_picker_visible, setGenderPickerVisible] = useState(false); const [birthday_picker_visible, setBirthdayPickerVisible] = useState(false); const [location_picker_visible, setLocationPickerVisible] = useState(false); const [ntrp_picker_visible, setNtrpPickerVisible] = useState(false); const [occupation_picker_visible, setOccupationPickerVisible] = useState(false); // 职业数据 const professions = useProfessions(); // 城市数据 const cities = useCities(); const [ntrpTested, setNtrpTested] = useState(false); // 监听store中的用户信息变化,同步到表单状态 useEffect(() => { if (user_info && Object.keys(user_info).length > 0) { const info = user_info as UserInfoType; setFormData({ nickname: info?.nickname ?? "", personal_profile: info?.personal_profile ?? "", occupation: info?.occupation ?? "", ntrp_level: info?.ntrp_level ?? "", phone: info?.phone ?? "", gender: info?.gender ?? "", birthday: info?.birthday ?? "", country: info?.country ?? "", province: info?.province ?? "", city: info?.city ?? "", district: info?.district ?? "", }); } const getLastResult = async () => { // 获取测试结果 const res = await evaluateService.getLastResult(); if (res.code === 0) { setNtrpTested(res.data.has_test_in_last_month); } }; getLastResult(); }, [user_info]); // 页面加载时初始化数据 // useEffect(() => { // getCities(); // getProfessions(); // }, []); // const getProfessions = async () => { // try { // const res = await UserService.getProfessions(); // setProfessions(res); // } catch (e) { // console.log("获取职业失败:", e); // } // }; // const getCities = async () => { // try { // const res = await UserService.getCities(); // setCities(res); // } catch (e) { // console.log("获取城市列表失败:", e); // } // }; // 加载用户信息 // const load_user_info = async () => { // try { // setLoading(true); // const user_data = await UserService.get_user_info(); // setUserInfo(user_data); // setFormData({ // nickname: user_data.nickname || "", // personal_profile: user_data.personal_profile || "", // occupation: user_data.occupation || "", // ntrp_level: user_data.ntrp_level || "NTRP 4.0", // phone: user_data.phone || "", // gender: user_data.gender || "", // birthday: user_data.birthday || "", // country: user_data.country || "", // province: user_data.province || "", // city: user_data.city || "", // }); // } catch (error) { // console.warn("加载用户信息失败:", error); // Taro.showToast({ // title: "加载用户信息失败", // icon: "error", // duration: 2000, // }); // } finally { // setLoading(false); // } // }; // 处理头像上传 const handle_avatar_upload = () => { Taro.chooseImage({ count: 1, sizeType: ["compressed"], sourceType: ["album", "camera"], success: async (res) => { const tempFilePath = res.tempFilePaths[0]; try { const avatar_url = await UserService.upload_avatar(tempFilePath); await updateUserInfo({ avatar_url: avatar_url }); Taro.showToast({ title: "头像上传成功", icon: "success", }); } catch (error) { console.warn("头像上传失败:", error); Taro.showToast({ title: error.message, icon: "none", }); } }, }); }; // 处理编辑弹窗 const handle_open_edit_modal = (field: string) => { if (field === "gender") { setGenderPickerVisible(true); return; } if (field === "birthday") { setBirthdayPickerVisible(true); return; } if (field === "location") { setLocationPickerVisible(true); return; } if (field === "ntrp_level") { setNtrpPickerVisible(true); return; } if (field === "occupation") { setOccupationPickerVisible(true); return; } if (field === "nickname") { if (!nickname_change_status.can_change) { return Taro.showToast({ title: `30天内仅可修改4次昵称,${nickname_change_status.next_period_start_date}后可修改`, icon: "none", duration: 2000, }); } // 手动输入 setEditingField(field); setEditModalVisible(true); } else { setEditingField(field); setEditModalVisible(true); } }; const handle_edit_modal_save = async (value: string) => { try { // 验证值不能是 undefined 或 null if (value === undefined || value === null) { Taro.showToast({ title: "数据不完整,请重新输入", icon: "none", }); return; } // 调用更新用户信息接口,只传递修改的字段 const update_data = { [editing_field]: value }; editing_field === "nickname" ? await updateNickname(value) : await updateUserInfo(update_data); // 更新表单状态(store会自动更新) setFormData((prev) => ({ ...prev, [editing_field]: value })); // 关闭弹窗 setEditModalVisible(false); setEditingField(""); // 显示成功提示 Taro.showToast({ title: "保存成功", icon: "success", }); } catch (error) { console.warn("保存失败:", error); Taro.showToast({ title: "保存失败", icon: "error", }); } }; const handle_edit_modal_cancel = () => { setEditModalVisible(false); setEditingField(""); }; // 处理字段编辑 const handle_field_edit = async ( field: string | { [key: string]: string }, value?: string ) => { try { if ( typeof field === "object" && field !== null && !Array.isArray(field) ) { // 验证对象中的值不能是 undefined const hasUndefined = Object.values(field).some( (v) => v === undefined || v === null ); if (hasUndefined) { Taro.showToast({ title: "数据不完整,请重新选择", icon: "none", }); return; } await updateUserInfo({ ...field }); // 更新表单状态(store会自动更新) setFormData((prev) => ({ ...prev, ...field })); } else { // 验证值不能是 undefined if (value === undefined || value === null) { Taro.showToast({ title: "数据不完整,请重新选择", icon: "none", }); return; } // 调用更新用户信息接口,只传递修改的字段 const update_data = { [field as string]: value }; await updateUserInfo(update_data); // 更新表单状态(store会自动更新) setFormData((prev) => ({ ...prev, [field as string]: value })); } // 显示成功提示 Taro.showToast({ title: "保存成功", icon: "success", }); } catch (error) { console.warn("保存失败:", error); Taro.showToast({ title: "保存失败", icon: "error", }); } }; // 处理性别选择 const handle_gender_change = (e: any) => { if (!Array.isArray(e) || e.length === 0 || e[0] === undefined) { Taro.showToast({ title: "请选择性别", icon: "none", }); return; } const gender_value = e[0]; handle_field_edit("gender", String(gender_value)); }; // 处理生日选择 const handle_birthday_change = (e: any) => { if (!Array.isArray(e) || e.length < 3 || e.some((v) => v === undefined)) { Taro.showToast({ title: "请完整选择生日", icon: "none", }); return; } const [year, month, day] = e; handle_field_edit( "birthday", `${year}-${String(month).padStart(2, "0")}-${String(day).padStart( 2, "0" )}` ); }; // 处理地区选择 const handle_location_change = (e: any) => { if ( !Array.isArray(e) || e.length < 3 || e.some((v) => v === undefined || v === null) ) { Taro.showToast({ title: "请完整选择地区", icon: "none", }); return; } const [province, city, district] = e; handle_field_edit({ province: String(province ?? ""), city: String(city ?? ""), district: String(district ?? ""), }); }; // 处理NTRP水平选择 const handle_ntrp_level_change = (e: any) => { // if (!Array.isArray(e) || e.length === 0 || e[0] === undefined) { // Taro.showToast({ // title: "请选择NTRP水平", // icon: "none", // }); // return; // } const ntrp_level_value = e[0]; handle_field_edit("ntrp_level", ntrp_level_value); }; // 处理职业选择 const handle_occupation_change = (e: any) => { if ( !Array.isArray(e) || e.length === 0 || e.some((v) => v === undefined || v === null) ) { Taro.showToast({ title: "请完整选择职业", icon: "none", }); return; } // 职业可能是多级联动,将所有选中的值用空格连接 const occupation_value = e .map((v) => String(v ?? "")) .filter(Boolean) .join(" "); handle_field_edit("occupation", occupation_value); }; // 处理退出登录 const handle_logout = () => { Taro.showModal({ title: "确认退出", content: "确定要退出登录吗?", success: (res) => { if (res.confirm) { // 清除用户数据 clear_login_state(); Taro.reLaunch({ url: "/login_pages/index/index", }); } }, }); }; // 注销账户 const handle_close_account = () => { setShowLogoutDialog(true); }; const onGetPhoneNumber = async (e) => { if (!e.detail || !e.detail.code) { Taro.showToast({ title: "获取手机号失败,请重试", icon: "none", duration: 2000, }); return; } try { const phone = await UserService.parse_phone(e.detail.code); handle_field_edit("phone", phone); } catch (e) { console.warn("解析手机号失败:", e); Taro.showToast({ title: "解析手机号失败,请重试", icon: "none", duration: 2000, }); } }; const handleJoinGroup = () => { Taro.navigateTo({ url: "/user_pages/joinGroup/index", }); }; const getDefaultOption = (options) => { if (!Array.isArray(options) || options.length === 0) { return []; } const defaultOptions: string[] = []; let current = options[0]; while (current) { defaultOptions.push(current.text); current = current.children?.[0]; } return defaultOptions; }; return ( {/* 导航栏 */} {/* { Taro.navigateBack(); }} > */} {/* 顶部导航栏 */} { Taro.navigateBack(); }} /> {/* 主要内容 */} {loading ? ( 加载中... ) : ( <> {/* 头像编辑区域 */} {/* 基本信息编辑 */} {/* 名字 */} handle_open_edit_modal("nickname")} > 名字 {form_data.nickname || ""} {/* 性别 */} handle_open_edit_modal("gender")} > 性别 {convert_db_gender_to_display(form_data.gender)} {/* 生日 */} handle_open_edit_modal("birthday")} > 生日 {form_data.birthday || "选择生日"} {/* 简介编辑 */} handle_open_edit_modal("personal_profile")} > 简介 {form_data.personal_profile.replace(/\n/g, " ") || "介绍一下自己"} {/* 地区、NTRP水平、职业 */} {/* 地区 */} handle_open_edit_modal("location")} > 地区 {form_data.province || form_data.city || form_data.district ? `${form_data.province} ${form_data.city} ${form_data.district}` : "选择所在地区"} {/* NTRP水平 */} handle_open_edit_modal("ntrp_level")} > NTRP 水平 {form_data.ntrp_level || "测测你的 NTRP 水平"} {/* 职业 */} handle_open_edit_modal("occupation")} > 职业 {form_data.occupation || "填写你的职业"} {/* 手机号 */} 手机 {/* */} {/* */} 客服聊天 加入社群 {/* 退出登录 */} 退出登录 {/* 注销账号 */} 注销账号 )} {/* 编辑弹窗 */} /等无效字符。30 天内可修改 4 次昵称,${nickname_change_status.next_period_start_date} 前还可修改 ${nickname_change_status.remaining_count} 次。` : "请填写 2-100 个字符" } /> {/* 性别选择弹窗 */} {gender_picker_visible && ( )} {/* 生日选择弹窗 */} {birthday_picker_visible && ( )} {/* 地区选择弹窗 */} {location_picker_visible && ( )} {/* NTRP水平选择弹窗 */} {ntrp_picker_visible && ( )} {/* 职业选择弹窗 */} {occupation_picker_visible && ( )} {/* 取消关注确认弹窗 */} { UserService.logout(); }} onConfirm={() => setShowLogoutDialog(false)} contentTitle="确定要注销账号吗?" contentDesc="你的账号将会彻底删除,该操作不可恢复。" /> ); }; export default EditProfilePage;