Skip to content

Commit

Permalink
feat(mp-alipay): getPhoneNumber
Browse files Browse the repository at this point in the history
  • Loading branch information
fxy060608 committed Aug 28, 2019
1 parent 0677225 commit 5617c58
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 46 deletions.
29 changes: 28 additions & 1 deletion packages/uni-mp-alipay/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -1811,7 +1811,7 @@ const handleLink$1 = (function () {
}
})();

function parseApp (vm) {
function parseApp (vm) {
Object.defineProperty(Vue.prototype, '$slots', {
get () {
return this.$scope && this.$scope.props.$slots
Expand All @@ -1829,6 +1829,33 @@ function parseApp (vm) {
}
});

Vue.prototype.$onAliGetAuthorize = function onAliGetAuthorize (method, $event) {
my.getPhoneNumber({
success: (res) => {
$event.type = 'getphonenumber';
const response = JSON.parse(res.response).response;
if (response.code === '10000') { // success
$event.detail.errMsg = 'getPhoneNumber:ok';
$event.detail.encryptedData = res.response;
} else {
$event.detail.errMsg = 'getPhoneNumber:fail Error: ' + res.response;
}
this[method]($event);
},
fail: (res) => {
$event.type = 'getphonenumber';
$event.detail.errMsg = 'getPhoneNumber:fail';
this[method]($event);
}
});
};

Vue.prototype.$onAliAuthError = function $onAliAuthError (method, $event) {
$event.type = 'getphonenumber';
$event.detail.errMsg = 'getPhoneNumber:fail Error: ' + $event.detail.errorMessage;
this[method]($event);
};

return parseBaseApp(vm, {
mocks,
initRefs
Expand Down
3 changes: 2 additions & 1 deletion packages/uni-mp-baidu/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,8 @@ const todos = [
'stopBeaconDiscovery',
'hideShareMenu',
'onWindowResize',
'offWindowResize'
'offWindowResize',
'vibrate'
];

// 存在兼容性的 API 列表
Expand Down
3 changes: 2 additions & 1 deletion packages/uni-mp-qq/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,8 @@ const todos = [
'checkIsSoterEnrolledInDevice',
'reportMonitor',
'getLogManager',
'reportAnalytics'
'reportAnalytics',
'vibrate'
];
const canIUses = [
'scanCode',
Expand Down
3 changes: 2 additions & 1 deletion packages/uni-mp-toutiao/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,8 @@ const todos = [
'onWindowResize',
'offWindowResize',
'compressImage',
'createOffscreenCanvas'
'createOffscreenCanvas',
'vibrate'
];

// 存在兼容性的 API 列表
Expand Down
4 changes: 3 additions & 1 deletion packages/uni-mp-weixin/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,9 @@ var previewImage = {
const protocols = {
previewImage
};
const todos = [];
const todos = [
'vibrate'
];
const canIUses = [];

const CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
Expand Down
83 changes: 45 additions & 38 deletions packages/uni-template-compiler/__tests__/compiler-mp-alipay.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,24 @@ describe('mp:compiler-mp-alipay', () => {
'<view><view v-if="show">hello</view><view v-else-if="hide">world</view><view v-else>bye</view></view>',
`<view><block a:if="{{show}}"><view>hello</view></block><block a:else><block a:if="{{hide}}"><view>world</view></block><block a:else><view>bye</view></block></block></view>`
)
})
it('generate ref', () => {
assertCodegen(
'<component1 ref="c1">text</component1>',
`<component1 vue-id="1" ref="__r" data-ref="c1" onVueInit="__l">text</component1>`
)
assertCodegen(
'<component1 :ref="c2">text<text>123213</text></component1>',
`<component1 vue-id="1" ref="__r" data-ref="{{c2}}" onVueInit="__l">text<text>123213</text></component1>`
)
assertCodegen(
'<component1 v-for="item in items" ref="c3"></component1>',
`<block a:for="{{items}}" a:for-item="item" a:for-index="__i0__"><component1 vue-id="{{'1-'+__i0__}}" ref="__r" data-ref-in-for="c3" onVueInit="__l"></component1></block>`
)
assertCodegen(
'<component1 v-for="item in items" :ref="c4"></component1>',
`<block a:for="{{items}}" a:for-item="item" a:for-index="__i0__"><component1 vue-id="{{'1-'+__i0__}}" ref="__r" data-ref-in-for="{{c4}}" onVueInit="__l"></component1></block>`
)
})
it('generate ref', () => {
assertCodegen(
'<component1 ref="c1">text</component1>',
`<component1 vue-id="1" ref="__r" data-ref="c1" onVueInit="__l">text</component1>`
)
assertCodegen(
'<component1 :ref="c2">text<text>123213</text></component1>',
`<component1 vue-id="1" ref="__r" data-ref="{{c2}}" onVueInit="__l">text<text>123213</text></component1>`
)
assertCodegen(
'<component1 v-for="item in items" ref="c3"></component1>',
`<block a:for="{{items}}" a:for-item="item" a:for-index="__i0__"><component1 vue-id="{{'1-'+__i0__}}" ref="__r" data-ref-in-for="c3" onVueInit="__l"></component1></block>`
)
assertCodegen(
'<component1 v-for="item in items" :ref="c4"></component1>',
`<block a:for="{{items}}" a:for-item="item" a:for-index="__i0__"><component1 vue-id="{{'1-'+__i0__}}" ref="__r" data-ref-in-for="{{c4}}" onVueInit="__l"></component1></block>`
)
})
it('generate default slot', () => {
assertCodegen(
Expand Down Expand Up @@ -104,6 +104,13 @@ describe('mp:compiler-mp-alipay', () => {
)
})

it('generate getPhoneNumber', () => {
assertCodegen(
'<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">获取手机号</button>',
`<button open-type="getAuthorize" scope="phoneNumber" data-event-opts="{{[['getAuthorize',[['$onAliGetAuthorize',['getPhoneNumber','$event']]]],['error',[['$onAliAuthError',['getPhoneNumber','$event']]]]]}}" onGetAuthorize="__e" onError="__e">获取手机号</button>`
)
})

it('generate events with v-on directive', () => {
assertCodegen(
`<uni-list-item title="标题文字" note="描述信息" show-extra-icon="true" :extra-icon="{color: '#4cd964',size: '22',type: 'spinner'}"></uni-list-item>`,
Expand All @@ -119,26 +126,26 @@ describe('mp:compiler-mp-alipay', () => {
assertCodegen(
`<form @submit="formSubmit" @reset="formReset"/>`,
`<form data-event-opts="{{[['submit',[['formSubmit',['$event']]]]]}}" onSubmit="__e" onReset="formReset"></form>`
)

assertCodegen(
`<map @callouttap="calloutTap" @controltap="controlTap" @markertap="markerTap" @regionchange="regionChange" @tap="tap"/>`,
`<map data-event-opts="{{[['tap',[['tap',['$event']]]]]}}" onCalloutTap="calloutTap" onControlTap="controlTap" onMarkerTap="markerTap" onRegionChange="regionChange" onTap="__e"></map>`
)

assertCodegen(
`<view @transitionend="transitionEnd" @animationstart="animationStart" @animationiteration="animationIteration" @animationend="animationEnd" @firstappear="firstAppear"/>`,
`<view data-event-opts="{{[['transitionEnd',[['transitionEnd',['$event']]]],['animationStart',[['animationStart',['$event']]]],['animationIteration',[['animationIteration',['$event']]]],['animationEnd',[['animationEnd',['$event']]]],['firstAppear',[['firstAppear',['$event']]]]]}}" onTransitionEnd="__e" onAnimationStart="__e" onAnimationIteration="__e" onAnimationEnd="__e" onFirstAppear="__e"></view>`
)

assertCodegen(
`<scroll-view @scrolltoupper="scrollToUpper" @scrolltolower="scrollToLower"/>`,
`<scroll-view data-event-opts="{{[['scrollToUpper',[['scrollToUpper',['$event']]]],['scrollToLower',[['scrollToLower',['$event']]]]]}}" onScrollToUpper="__e" onScrollToLower="__e"></scroll-view>`
)

assertCodegen(
`<movable-view @changeend="changeEnd"/>`,
`<movable-view data-event-opts="{{[['changeEnd',[['changeEnd',['$event']]]]]}}" onChangeEnd="__e"></movable-view>`
)

assertCodegen(
`<map @callouttap="calloutTap" @controltap="controlTap" @markertap="markerTap" @regionchange="regionChange" @tap="tap"/>`,
`<map data-event-opts="{{[['tap',[['tap',['$event']]]]]}}" onCalloutTap="calloutTap" onControlTap="controlTap" onMarkerTap="markerTap" onRegionChange="regionChange" onTap="__e"></map>`
)

assertCodegen(
`<view @transitionend="transitionEnd" @animationstart="animationStart" @animationiteration="animationIteration" @animationend="animationEnd" @firstappear="firstAppear"/>`,
`<view data-event-opts="{{[['transitionEnd',[['transitionEnd',['$event']]]],['animationStart',[['animationStart',['$event']]]],['animationIteration',[['animationIteration',['$event']]]],['animationEnd',[['animationEnd',['$event']]]],['firstAppear',[['firstAppear',['$event']]]]]}}" onTransitionEnd="__e" onAnimationStart="__e" onAnimationIteration="__e" onAnimationEnd="__e" onFirstAppear="__e"></view>`
)

assertCodegen(
`<scroll-view @scrolltoupper="scrollToUpper" @scrolltolower="scrollToLower"/>`,
`<scroll-view data-event-opts="{{[['scrollToUpper',[['scrollToUpper',['$event']]]],['scrollToLower',[['scrollToLower',['$event']]]]]}}" onScrollToUpper="__e" onScrollToLower="__e"></scroll-view>`
)

assertCodegen(
`<movable-view @changeend="changeEnd"/>`,
`<movable-view data-event-opts="{{[['changeEnd',[['changeEnd',['$event']]]]]}}" onChangeEnd="__e"></movable-view>`
)
})
})
3 changes: 1 addition & 2 deletions packages/uni-template-compiler/__tests__/demo.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
const compiler = require('../lib')

const res = compiler.compile(
`
<view @/>
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">获取手机号</button>
`, {
resourcePath: '/User/fxy/Documents/test.wxml',
mp: {
Expand Down
6 changes: 6 additions & 0 deletions packages/uni-template-compiler/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ const generateTemplate = require('./template/generate')

const compilerModule = require('./module')

const compilerAlipayModule = require('./module-alipay')

const generateCodeFrame = require('./codeframe')

module.exports = {
Expand All @@ -28,6 +30,10 @@ module.exports = {

(options.modules || (options.modules = [])).push(compilerModule)

if (options.mp.platform === 'mp-alipay') {
options.modules.push(compilerAlipayModule)
}

const res = compile(source, Object.assign(options, {
optimize: false
}))
Expand Down
26 changes: 26 additions & 0 deletions packages/uni-template-compiler/lib/module-alipay.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module.exports = {
postTransformNode (el) {
const attrsMap = el.attrsMap
if (attrsMap['open-type'] !== 'getPhoneNumber') {
return
}
const getPhoneNumberValue = attrsMap['@getphonenumber'] || attrsMap['v-on:getphonenumber']
if (!getPhoneNumberValue) {
return
}

el.attrs.find(attr => attr.name === 'open-type').value = '"getAuthorize"'
el.attrs.push({
name: 'scope',
value: '"phoneNumber"'
})

delete el.events['getphonenumber']
el.events['getAuthorize'] = {
value: '$onAliGetAuthorize(\'' + getPhoneNumberValue + '\',$event)'
}
el.events['error'] = {
value: '$onAliAuthError(\'' + getPhoneNumberValue + '\',$event)'
}
}
}
29 changes: 28 additions & 1 deletion src/platforms/mp-alipay/runtime/wrapper/app-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
initRefs
} from './util'

export default function parseApp (vm) {
export default function parseApp (vm) {
Object.defineProperty(Vue.prototype, '$slots', {
get () {
return this.$scope && this.$scope.props.$slots
Expand All @@ -25,6 +25,33 @@ export default function parseApp (vm) {
}
})

Vue.prototype.$onAliGetAuthorize = function onAliGetAuthorize (method, $event) {
my.getPhoneNumber({
success: (res) => {
$event.type = 'getphonenumber'
const response = JSON.parse(res.response).response
if (response.code === '10000') { // success
$event.detail.errMsg = 'getPhoneNumber:ok'
$event.detail.encryptedData = res.response
} else {
$event.detail.errMsg = 'getPhoneNumber:fail Error: ' + res.response
}
this[method]($event)
},
fail: (res) => {
$event.type = 'getphonenumber'
$event.detail.errMsg = 'getPhoneNumber:fail'
this[method]($event)
}
})
}

Vue.prototype.$onAliAuthError = function $onAliAuthError (method, $event) {
$event.type = 'getphonenumber'
$event.detail.errMsg = 'getPhoneNumber:fail Error: ' + $event.detail.errorMessage
this[method]($event)
}

return parseBaseApp(vm, {
mocks,
initRefs
Expand Down

0 comments on commit 5617c58

Please sign in to comment.