oak-pay-business/src/components/pay/detail/index.ts

133 lines
4.1 KiB
TypeScript

import { CentToString } from "oak-domain/lib/utils/money";
import { PAY_CHANNEL_OFFLINE_NAME, PAY_CHANNEL_ACCOUNT_NAME, PAY_CHANNEL_WECHAT_APP_NAME,
PAY_CHANNEL_WECHAT_H5_NAME, PAY_CHANNEL_WECHAT_JS_NAME, PAY_CHANNEL_WECHAT_MP_NAME, PAY_CHANNEL_WECHAT_NATIVE_NAME
} from "../../../types/PayConfig";
import { DATA_SUBSCRIBER_KEYS } from "../../../config/constants";
import assert from "assert";
export default OakComponent({
entity: 'pay',
isList: false,
projection: {
id: 1,
applicationId: 1,
price: 1,
meta: 1,
iState: 1,
channel: 1,
paid: 1,
refunded: 1,
timeoutAt: 1,
forbidRefundAt: 1,
externalId: 1,
orderId: 1,
accountId: 1,
account: {
id: 1,
entityId: 1,
entity: 1,
},
order: {
id: 1,
creatorId: 1,
}
},
properties: {
onClose: () => undefined as void,
},
data: {
PAY_CHANNEL_OFFLINE_NAME,
PAY_CHANNEL_ACCOUNT_NAME,
PAY_CHANNEL_WECHAT_APP_NAME,
PAY_CHANNEL_WECHAT_H5_NAME,
PAY_CHANNEL_WECHAT_JS_NAME,
PAY_CHANNEL_WECHAT_MP_NAME,
PAY_CHANNEL_WECHAT_NATIVE_NAME,
showCloseConfirmMp: false,
},
formData({ data }) {
const application = this.features.application.getApplication();
const iState = data?.iState;
const iStateColor = iState && this.features.style.getColor('pay', 'iState', iState);
const payConfig = this.features.pay.getPayConfigs();
return {
type: data?.orderId ? 'order' : 'account',
pay: data,
application,
iStateColor,
payConfig,
closable: !!(data?.["#oakLegalActions"]?.includes('close')),
startPayable: false,
metaUpdatable: !!(data?.["#oakLegalActions"]?.find(
ele => typeof ele === 'object'
&& ele.action === 'update'
&& ele.attrs?.includes('meta')
)),
offline: payConfig && payConfig.find(ele => ele.channel === PAY_CHANNEL_OFFLINE_NAME),
notSameApp: data && data.applicationId !== application!.id && data.channel !== PAY_CHANNEL_OFFLINE_NAME,
priceStr: data?.price && CentToString(data!.price!, 2),
};
},
features: ['application'],
actions: ['close', 'startPaying', {
action: 'update',
attrs: ['meta'],
}],
methods: {
onSetOfflineSerialMp(e: WechatMiniprogram.Input) {
const { pay } = this.state;
const { value } = e.detail;
this.update({
meta: {
...pay?.meta,
serial: value,
}
});
},
onSelectOfflineOptionMp(e: WechatMiniprogram.TouchEvent) {
const { option } = e.currentTarget.dataset;
const { pay } = this.state;
this.update({
meta: {
...pay?.meta,
option,
}
});
},
executeMp() {
return this.execute();
},
resetMp() {
return this.clean();
},
closeMp() {
this.setState({
showCloseConfirmMp: true,
});
},
cancelCloseMp() {
this.setState({
showCloseConfirmMp: false,
});
},
async confirmCloseMp() {
await this.execute('close');
this.cancelCloseMp();
},
goBack() {
this.navigateBack();
}
},
lifetimes: {
ready() {
const { oakId } = this.props;
assert(typeof oakId === 'string');
this.subDataEvents([`${DATA_SUBSCRIBER_KEYS.payStateChanged}-${oakId}`]);
},
detached() {
const { oakId } = this.props;
assert(typeof oakId === 'string');
this.unsubDataEvents([`${DATA_SUBSCRIBER_KEYS.payStateChanged}-${oakId}`]);
}
}
});