133 lines
4.1 KiB
TypeScript
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}`]);
|
|
}
|
|
}
|
|
}); |