|
|
@@ -0,0 +1,123 @@
|
|
|
+// components/popup-user-auth/popup-user-auth.ts
|
|
|
+import { openPrivacyContract } from "../../lib/wx/open-api";
|
|
|
+import { login } from "../../lib/logic";
|
|
|
+import { usePhoneNumber } from "../../lib/use/use-phone";
|
|
|
+import { getSceneRegisterMethod, setSceneRegisterMethod } from "../../lib/request/common";
|
|
|
+let submitting = false;
|
|
|
+Component({
|
|
|
+ properties: {
|
|
|
+ visible: { type: Boolean, value: false },
|
|
|
+ overlay: { type: Boolean, value: true },
|
|
|
+ scene: { type: String, value: '' },
|
|
|
+ cardno: { type: String, value: '' },
|
|
|
+ phone: { type: String, value: '' },
|
|
|
+ },
|
|
|
+ data: {
|
|
|
+ title: '完善信息',
|
|
|
+ privacyContract: { agree: false, name: "《隐私政策》", show: false },
|
|
|
+
|
|
|
+ loading: false,
|
|
|
+ submitting: false,
|
|
|
+
|
|
|
+ cardnoProps: { prefix: '', suffix: '', fill: '', length: 0 },
|
|
|
+ phoneProps: { prefix: '', suffix: '', fill: '', length: 0 },
|
|
|
+ },
|
|
|
+ observers: {
|
|
|
+ cardno(value: string) {
|
|
|
+ if (!value) return;
|
|
|
+ const length = 18;
|
|
|
+ const tag = '*';
|
|
|
+ if (!value.includes(tag)) value = value.padEnd(length, tag);
|
|
|
+ const [_, prefix = '', fill = '', suffix = ''] = value.match(/(\d+)?(\*+)?(\d+)?/) || [];
|
|
|
+ this.setData({ cardnoProps: { prefix, suffix, fill: '', length: fill.length === length ? 0 : fill.length } });
|
|
|
+ if (this.data.cardnoProps.length) this.setData({ visible: true });
|
|
|
+ },
|
|
|
+ phone(value: string) {
|
|
|
+ if (!value) return;
|
|
|
+ const length = 11;
|
|
|
+ const tag = '*';
|
|
|
+ if (!value.includes(tag)) value = value.padEnd(length, tag);
|
|
|
+ const [_, prefix = '', fill = '', suffix = ''] = value.match(/(\d+)?(\*+)?(\d+)?/) || [];
|
|
|
+ this.setData({ phoneProps: { prefix, suffix, fill: '', length: fill.length === length ? 0 : fill.length } });
|
|
|
+ if (this.data.phoneProps.length) this.setData({ visible: true });
|
|
|
+ },
|
|
|
+ scene(value: string) { this.init(value); }
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ async init(scene: string) {
|
|
|
+ if (!scene) return;
|
|
|
+ await login();
|
|
|
+ const data = await getSceneRegisterMethod(scene);
|
|
|
+ this.setData({ ...data });
|
|
|
+ this.triggerEvent('loaded', { visible: this.data.visible, scene });
|
|
|
+ if (data.patientId) this.register(data.patientId);
|
|
|
+ },
|
|
|
+ getPhoneNumberHandle(event: WechatMiniprogram.ButtonGetPhoneNumber) {
|
|
|
+ this.setData({ loading: true });
|
|
|
+ const { getPhoneNumber } = usePhoneNumber();
|
|
|
+ getPhoneNumber(event, (value) => {
|
|
|
+ this.setData({ "phoneProps.fill": value, loading: false })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ openPrivacyContract: openPrivacyContract,
|
|
|
+ onPrivacySetting({ detail }: { detail: WechatMiniprogram.GetPrivacySettingSuccessCallbackResult; }) {
|
|
|
+ this.setData({
|
|
|
+ "privacyContract.name": detail.privacyContractName,
|
|
|
+ // 'privacyContract.agree': !detail.needAuthorization,
|
|
|
+ });
|
|
|
+ },
|
|
|
+ onAgreeChange(event: any) {
|
|
|
+ const agree = event?.detail?.checked;
|
|
|
+ if (agree) this.setData({ "privacyContract.show": true });
|
|
|
+ else this.setData({ "privacyContract.agree": agree });
|
|
|
+ },
|
|
|
+ onAgree() {
|
|
|
+ this.setData({ "privacyContract.agree": true });
|
|
|
+ },
|
|
|
+ onDisagree() {
|
|
|
+ this.setData({ "privacyContract.agree": false });
|
|
|
+ },
|
|
|
+ register(patientId: string) {
|
|
|
+ if (!patientId) return;
|
|
|
+ wx.setStorageSync("patientId", patientId);
|
|
|
+ this.setData({ 'visible': false });
|
|
|
+ this.triggerEvent('register', { patientId });
|
|
|
+ },
|
|
|
+ async onSubmit(event: WechatMiniprogram.FormSubmit) {
|
|
|
+ if (this.data.submitting || submitting) return;
|
|
|
+ submitting = true;
|
|
|
+ try {
|
|
|
+ const data = { agemust: this.data.privacyContract.agree ? 'Y' : 'N', phone: '' } as any;
|
|
|
+ if (data.agemust === "N") {
|
|
|
+ this.setData({ "privacyContract.show": true });
|
|
|
+ throw `请阅读并同意${this.data.privacyContract.name}`;
|
|
|
+ }
|
|
|
+
|
|
|
+ const phone = this.data.phoneProps;
|
|
|
+ if (phone.length && phone.fill.length !== phone.length) throw `手机号码请补充完整`;
|
|
|
+ else if (!phone.fill) throw `请获取手机号码`;
|
|
|
+ else data.phone = `${phone.prefix}${phone.fill}${phone.suffix}`;
|
|
|
+
|
|
|
+ const cardno = this.data.cardnoProps;
|
|
|
+ if (cardno.length && cardno.fill.length !== cardno.length) throw `身份证号请补充完整`;
|
|
|
+ else if (cardno.length) data.cardno = `${phone.prefix}${phone.fill}${phone.suffix}`;
|
|
|
+
|
|
|
+ if (this.data.scene) data.scene = decodeURIComponent(this.data.scene);
|
|
|
+
|
|
|
+ this.setData({ "submitting": submitting });
|
|
|
+ const { patientId } = await setSceneRegisterMethod(data);
|
|
|
+ this.register(patientId);
|
|
|
+ } catch (error) {
|
|
|
+ if (typeof error === 'string') this.triggerEvent('message', { type: 'warning', content: error });
|
|
|
+ else if (error.errMsg) {
|
|
|
+ this.triggerEvent('message', { type: 'error', content: error.errMsg });
|
|
|
+ if (!this.data.phoneProps.length) this.setData({ "phoneProps.fill": '', loading: false });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ setTimeout(() => {
|
|
|
+ submitting = false;
|
|
|
+ this.setData({ "submitting": submitting });
|
|
|
+ }, 100);
|
|
|
+ },
|
|
|
+ }
|
|
|
+})
|