import { BaseEventOrig, Button, ButtonProps, ITouchEvent } from '@tarojs/components'; import classNames from 'classnames'; import { useCallback } from 'react'; import { logWithPrefix } from '@/utils/common'; import Toast from '@/utils/toast'; import { requestUserInfo, setPhoneNumber } from '@/utils/user'; import './index.less'; export enum BindPhoneStatus { Success, Cancel, Error, } export interface IPhoneButtonProps extends ButtonProps { message?: string; // 绑定后是否需要刷新接口获取手机号 needPhone?: boolean; onBindPhone?: (status: BindPhoneStatus, e: ITouchEvent) => void; onSuccess?: (e: ITouchEvent) => void; } const PREFIX = 'phone-button'; const log = logWithPrefix(PREFIX); export default function PhoneButton(props: IPhoneButtonProps) { const { className, children, message = '绑定成功', openType, needPhone, onSuccess, onBindPhone, ...otherProps } = props; const handleGetPhoneNumber = useCallback( async (e: BaseEventOrig) => { log('handleGetPhoneNumber', e.detail.code, e.detail.iv, e.detail.encryptedData); const encryptedData = e.detail.encryptedData; const iv = e.detail.iv; if (!encryptedData || !iv) { onBindPhone?.(BindPhoneStatus.Cancel, e as ITouchEvent); return Toast.error('取消授权'); } try { await setPhoneNumber({ encryptedData, iv }); needPhone && (await requestUserInfo()); Toast.success(message); onBindPhone?.(BindPhoneStatus.Success, e as ITouchEvent); onSuccess?.(e as ITouchEvent); } catch (err) { onBindPhone?.(BindPhoneStatus.Error, e as ITouchEvent); Toast.error('绑定失败'); log('bind phone fail', err); } }, [message, needPhone, onSuccess, onBindPhone] ); return ( ); }