You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

570 lines
16 KiB
TypeScript

import dayjs from "dayjs";
import {
// MpSplashDetail,
// UpUserNick,
// UserInfoUp,
// WCUserLogin,
UpdateUser,
UpdateUserUploadFile,
GetProvince,
GetAreaListByPid,
} from "../../utils/Interface";
import { Component, PropsWithChildren, useEffect, useState } from "react";
import Taro from "@tarojs/taro";
// 引入 Swiper, SwiperItem 组件
import { Block, View, Text, Image, Input, Button } from "@tarojs/components";
import { Toast, Popup, Picker, DatetimePicker } from "@antmjs/vantui";
import "taro-ui/dist/style/components/button.scss"; // 按需引入
import "./userInfo.less";
/*** redux ***/
import { connect } from "react-redux";
import { userRefresh } from "../../store/features/userInfo";
/*** redux end ***/
/** 自定义组件 **/
import Navbar from "../../components/navbar/navbar";
import PopupAlert from "../../components/popup/popup-alert";
/** 自定义组件 **/
import { loading, msg, go } from "../../utils/traoAPI";
import FormData from "../../utils/wxFormdata/formData";
// 仅注册成功后进入此页面
class UserInfo extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
name: "用户信息",
style: "font-size: 26rpx; font-weight: 400; color: #ccc",
userInfo: {
...this.props.userInfo,
},
isShowIntegralText: false,
cityShow: false,
timeShow: false,
columns: [
{
values: [],
className: "column1",
defaultIndex: 0,
},
{
values: [],
className: "column2",
defaultIndex: 0,
},
{
values: [],
className: "column3",
defaultIndex: 0,
},
],
leve1region: [],
leve2region: [],
leve3region: [],
loading: true,
form: {
nickname: "", // 昵称
province: "",
city: "", // 市
area: "", // 县区
provinceId: "", // 省份
cityId: "", // 市
areaId: "", // 县区
headimg: null,
},
// maxDate: new Date().getTime(),
// minDate: new Date("1949-10-01").getTime(),
minDate: new Date("1949-10-01").getTime(),
birthday: this.props.userInfo.birthday
? dayjs(this.props.userInfo.birthday).valueOf()
: dayjs().valueOf(),
isSubmit: false, // 是否允许提交
};
}
async onLoad() {
if (!Taro.getStorageSync("token")) {
// await this.WCUserLogin();
}
this.initData();
}
componentDidMount() {}
componentWillUnmount() {}
componentDidShow() {}
componentDidHide() {}
async initData() {
await this.getProvince();
}
getProvince = async () => {
let res = await GetProvince();
if (res.data.code === 200) {
let { columns } = this.state;
let values = res.data.data.map((item: any) => item.name);
columns[0].values = values;
this.setState({ leve1region: res.data.data, columns });
this.GetAreaListByPid_level2(res.data.data[0].id);
}
};
GetAreaListByPid_level2 = async (level2) => {
let res = await GetAreaListByPid({ pid: level2 });
if (res.data.code === 200) {
let { columns } = this.state;
let values = res.data.data.map((item: any) => item.name);
columns[1].values = values;
this.setState({ leve2region: res.data.data, columns });
this.GetAreaListByPid_level3(res.data.data[0].id);
}
};
GetAreaListByPid_level3 = async (level3) => {
let res = await GetAreaListByPid({ pid: level3 });
if (res.data.code === 200) {
let { columns } = this.state;
let values = res.data.data.map((item: any) => item.name);
columns[2].values = values;
this.setState({ leve3region: res.data.data, columns });
}
};
UpdateUser = async () => {
let { form, userInfo } = this.state;
let isTmpFile = userInfo.headimg.indexOf("//tmp") > -1;
let isWXFile = userInfo.headimg.indexOf("wxfile://") > -1;
if (isTmpFile || isWXFile) {
let formData = {
province: form.province,
city: form.city,
area: form.area,
provinceId: form.provinceId,
cityId: form.cityId,
areaId: form.areaId,
birthday: userInfo.birthday,
nickname: userInfo.nickname,
headimg: userInfo.headimg,
file: userInfo.headimg || null,
};
let res = await UpdateUserUploadFile(formData);
console.log("Res", res);
if (res.code === 200) {
userInfo.province = res.data.province;
userInfo.city = res.data.city;
userInfo.area = res.data.area;
userInfo.provinceId = res.data.provinceId;
userInfo.cityId = res.data.cityId;
userInfo.areaId = res.data.areaId;
userInfo.nickname = res.data.nickname;
userInfo.headimg = res.data.headimg;
userInfo.integralText = res.data.integralText;
this.props.userRefresh(userInfo);
this.setState({ userInfo: userInfo });
if (res.data.integralText) {
this.setState({ isShowIntegralText: true });
} else {
msg("更新成功");
this.onSkip();
}
}
} else {
let formData = new FormData();
formData.append("province", form.province);
formData.append("city", form.city);
formData.append("area", form.area);
formData.append("provinceId", form.provinceId);
formData.append("cityId", form.cityId);
formData.append("areaId", form.areaId);
formData.append("birthday", userInfo.birthday);
formData.append("nickname", userInfo.nickname);
formData.append("headimg", userInfo.headimg);
formData.append("file", null);
let data = formData.getData();
let res = await UpdateUser(data);
if (res.data.code === 200) {
userInfo.province = res.data.data.province;
userInfo.city = res.data.data.city;
userInfo.area = res.data.data.area;
userInfo.provinceId = res.data.data.provinceId;
userInfo.cityId = res.data.data.cityId;
userInfo.areaId = res.data.data.areaId;
userInfo.nickname = res.data.data.nickname;
userInfo.headimg = res.data.data.headimg;
userInfo.integralText = res.data.data.integralText;
this.props.userRefresh(userInfo);
this.setState({ userInfo: userInfo });
if (res.data.data.integralText) {
this.setState({ isShowIntegralText: true });
} else {
msg("更新成功");
this.onSkip();
}
}
}
};
getChooseAvatar = (event) => {
console.log("getChooseAvatar", event);
let { userInfo } = this.state;
userInfo.headimg = event.detail.avatarUrl;
this.setState({ userInfo });
this.isSubmitCheck();
};
onSubmit = async () => {
const { userInfo, form } = this.state;
if (!userInfo.headimg) return msg("请点击授权头像");
if (!userInfo.nickname) return msg("请输入昵称");
if (!form.provinceId) return msg("请选择您所在的地区");
if (!userInfo.birthday) return msg("请选择您的生日");
loading("提交中");
// @ts-ignore
await this.UpdateUser();
// // @ts-ignore
// UpUserNick({
// headimg: userInfo.headimg,
// nickname: userInfo.nickname,
// }).then((res) => {
// loading("请稍等");
// const data = {
// birthday,
// province: form.provinceId,
// city: form.cityId,
// area: form.areaId,
// };
// // @ts-ignore
// UserInfoUp(data).then((res) => {
// msg(res.data.msg);
// this.onSkip();
// });
// });
};
onSkip = () => {
// 仅注册账号进入个人信息完善页。此时判断是否扫码进入的小程序,如果是扫码进入,提交与跳过都是回到主页
const isScan = Taro.getStorageSync("isScan");
if (isScan) {
// Taro.setStorageSync("isScanNotRegisterSkip", true);
Taro.switchTab({
url: "/pages/index/index",
});
return;
}
let isInstrumentJump = Taro.getStorageSync("isInstrumentJump");
if (isInstrumentJump === "true") {
go("/pages/instrument/instrument");
} else {
Taro.switchTab({
url: "/pages/user/user",
});
}
};
pickerChange = (event) => {
console.log("pickerChange", event);
};
onPickerColumnChange = (event) => {
console.log("onPickerColumnChange", event);
};
onCityChange = async (picker) => {
console.log("onCityChange", picker);
if (picker.detail.index === 0) {
this.setState({ loading: true });
let { leve1region } = this.state;
let obj = leve1region.find(
(item: any) => item.name === picker.detail.value[0]
);
await this.GetAreaListByPid_level2(obj.id);
this.setState({ loading: false });
return false;
}
if (picker.detail.index === 1) {
this.setState({ loading: true });
let { leve2region } = this.state;
let obj = leve2region.find(
(item: any) => item.name === picker.detail.value[1]
);
await this.GetAreaListByPid_level3(obj.id);
this.setState({ loading: false });
}
};
onCityConfirm = (picker) => {
const index = picker.detail.index;
let { form } = this.state;
form.province = picker.detail.value[0];
form.provinceId = this.state.leve1region[index[0]].id;
form.city = picker.detail.value[1];
form.cityId = this.state.leve2region[index[1]].id;
form.area = picker.detail.value[2];
form.areaId = this.state.leve3region[index[2]].id;
this.setState({ form });
this.onCityCancel();
this.isSubmitCheck();
};
onCityCancel = () => {
this.setState({ cityShow: false });
};
onCityShow = () => {
this.setState({ cityShow: true });
};
closeShow = () => {
this.setState({ cityShow: false });
};
onTimeShow = () => {
this.setState({ timeShow: true });
};
closeTime = () => {
this.setState({ timeShow: false });
};
onTimePickerCancel = () => {
console.log("onTimePickerCancel");
this.closeTime();
};
onTimePickerConfirm = (picker) => {
let { userInfo } = this.state;
userInfo.birthday = dayjs(picker.detail.value).format("YYYY-MM-DD");
if (picker.detail.value) {
this.setState({ userInfo });
}
this.closeTime();
this.isSubmitCheck();
};
onNicknameChange = (event) => {
let { userInfo } = this.state;
userInfo.nickname = event.detail.value;
this.setState({ userInfo });
this.isSubmitCheck();
};
onNickNameReview = (event) => {
console.log("onNickNameReview", event);
};
isSubmitCheck() {
let { userInfo, form } = this.state;
if (
userInfo.nickname &&
userInfo.headimg &&
form.province &&
form.city &&
form.area &&
userInfo.birthday
) {
this.setState({ isSubmit: true });
} else {
this.setState({ isSubmit: false });
}
}
closeIntegralText = () => {
this.setState({ isShowIntegralText: false });
setTimeout(() => {
this.onSkip();
}, 600);
};
onDateChange = (e) => {
console.log("onDateChange", e);
};
render() {
let {
style,
userInfo,
columns,
cityShow,
timeShow,
form,
minDate,
isSubmit,
isShowIntegralText,
birthday,
} = this.state;
const formatter = (type, value) => {
if (type === "year") {
return `${value}`;
}
if (type === "month") {
return `${value}`;
}
return `${value}`;
};
return (
<Block>
<PopupAlert
isShow={isShowIntegralText}
isClose={true}
title="提示"
content={userInfo.integralText}
confirmButtonText="确定"
textAlgin="center"
close={this.closeIntegralText}
confirm={this.closeIntegralText}
/>
<Navbar></Navbar>
<View className="main">
<View className="title"></View>
<View className="txt"></View>
<View className="txt"></View>
<Button
className="avatar_box"
open-type="chooseAvatar"
onChooseAvatar={this.getChooseAvatar}
>
{!userInfo.headimg ? (
<Block>
<Image
className="avatar"
src={require("../../img/welcome/avatar.png")}
/>
<View className="btn_avatar"></View>
</Block>
) : (
<Image className="avatar" src={userInfo.headimg}></Image>
)}
</Button>
<View className="form">
<View className="form_item">
<View className="label"></View>
<Input
type="nickname"
className="ipt nickname"
placeholder="请填写您的昵称"
placeholder-style={style}
value={userInfo.nickname}
maxlength={20}
onInput={this.onNicknameChange}
onNickNameReview={this.onNickNameReview}
></Input>
</View>
<View className="form_item">
<View className="label">/</View>
<Input
onClick={this.onCityShow}
disabled
className="ipt"
placeholder="请选择您所在的地区/省市区"
value={form.province + form.city + form.area}
></Input>
<Image
className="arrow"
src={require("../../img/welcome/arrow-down.png")}
></Image>
</View>
<View className="form_item">
<View className="label"></View>
<Input
onClick={this.onTimeShow}
disabled
className="ipt"
placeholder="请选择您的生日"
placeholder-style={style}
value={userInfo.birthday}
></Input>
{/* <Picker
mode="date"
value={userInfo.birthday}
onChange={this.onDateChange}
>
<Input
// onClick={this.onTimeShow}
disabled
className="ipt"
placeholder="请选择您的生日"
placeholder-style={style}
value={userInfo.birthday}
></Input>
</Picker> */}
<Image
className="arrow"
src={require("../../img/welcome/arrow-down.png")}
></Image>
</View>
</View>
</View>
<View className="footer">
{isSubmit ? (
<View className="btn" onClick={this.onSubmit}>
</View>
) : (
<View className="btn btn-disable" onClick={this.onSubmit}>
</View>
)}
<View className="text" onClick={this.onSkip}>
<Text style="margin-right: 6rpx;"></Text>
<Image
src={require("../../img/right.png")}
style="width: 30rpx;height:30rpx"
mode="aspectFit"
/>
</View>
</View>
<Popup show={cityShow} position={"bottom"} onClose={this.closeShow}>
<Picker
showToolbar
title="请选择您所在的地区"
defaultIndex={0}
columns={columns}
onChange={this.onCityChange}
onCancel={this.onCityCancel}
onConfirm={this.onCityConfirm}
/>
</Popup>
<Popup show={timeShow} position={"bottom"} onClose={this.closeTime}>
<DatetimePicker
type="date"
formatter={formatter}
value={birthday}
minDate={minDate}
maxDate={Date.now()}
onCancel={this.onTimePickerCancel}
onConfirm={this.onTimePickerConfirm}
/>
</Popup>
</Block>
);
}
}
const mapStateToProps = (state) => ({
userInfo: state.userInfo,
});
const mapDispatchToProps = (dispatch) => ({
userRefresh(data) {
dispatch(userRefresh(data));
},
});
export default connect(mapStateToProps, mapDispatchToProps)(UserInfo);