diff --git a/packages/taro-cli/src/config/manifest.default.json b/packages/taro-cli/src/config/manifest.default.json index c0139462c41c..e25e88c1c022 100644 --- a/packages/taro-cli/src/config/manifest.default.json +++ b/packages/taro-cli/src/config/manifest.default.json @@ -17,6 +17,13 @@ { "name": "system.geolocation" }, { "name": "system.share" }, { "name": "system.notification" } + { "name": "system.device" }, + { "name": "system.webview" }, + { "name": "system.request" }, + { "name": "system.audio" }, + { "name": "system.record" }, + { "name": "system.contact" }, + { "name": "system.sms" } ], "permissions": [ { "origin": "*" } diff --git a/packages/taro-components-qa/src/components/scroll-view/index.ux b/packages/taro-components-qa/src/components/scroll-view/index.ux new file mode 100644 index 000000000000..eafb3d2cb5fe --- /dev/null +++ b/packages/taro-components-qa/src/components/scroll-view/index.ux @@ -0,0 +1,70 @@ + + + + + + \ No newline at end of file diff --git a/packages/taro-components-qa/src/components/swiper-item/index.ux b/packages/taro-components-qa/src/components/swiper-item/index.ux new file mode 100644 index 000000000000..27c06d2b79d9 --- /dev/null +++ b/packages/taro-components-qa/src/components/swiper-item/index.ux @@ -0,0 +1,42 @@ + + + + + + \ No newline at end of file diff --git a/packages/taro-components-qa/src/components/taro-webview/index.ux b/packages/taro-components-qa/src/components/taro-webview/index.ux new file mode 100644 index 000000000000..5c927042ce34 --- /dev/null +++ b/packages/taro-components-qa/src/components/taro-webview/index.ux @@ -0,0 +1,57 @@ + + + + + + \ No newline at end of file diff --git a/packages/taro-components/src/components/swiper/index.js b/packages/taro-components/src/components/swiper/index.js index 40bc4738ea4e..a04410b3c745 100644 --- a/packages/taro-components/src/components/swiper/index.js +++ b/packages/taro-components/src/components/swiper/index.js @@ -107,7 +107,12 @@ class Swiper extends Nerv.Component { componentWillReceiveProps (nextProps) { if (this.mySwiper) { - const nextCurrent = nextProps.current || this._$current || 0 + let nextCurrent = 0 + if (nextProps.current === 0) { + nextCurrent = this._$current || 0 + } else { + nextCurrent = nextProps.current || this._$current || 0 + } // 是否衔接滚动模式 if (nextProps.circular) { this.mySwiper.slideToLoop(parseInt(nextCurrent, 10)) // 更新下标 diff --git a/packages/taro-quickapp/src/api/device/index.js b/packages/taro-quickapp/src/api/device/index.js new file mode 100644 index 000000000000..c5eb9d5fb01b --- /dev/null +++ b/packages/taro-quickapp/src/api/device/index.js @@ -0,0 +1,95 @@ +import contact from '@system.contact' +import sms from '@system.sms' + +export function getContactPick (opts = {}) { + const { success, fail, complete } = opts + const res = { errMsg: 'getContactPick:ok' } + return new Promise((resolve, reject) => { + contact.pick({ + success (data) { + res.result = data + success && success(data) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getContactList (opts = {}) { + const { success, fail, complete } = opts + const res = { errMsg: 'getContactList:ok' } + return new Promise((resolve, reject) => { + contact.list({ + success (data) { + res.result = data + success && success(data) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function sendSms (opts = {}) { + const { address, content, success, fail, complete } = opts + const res = { errMsg: 'sendSms:ok' } + return new Promise((resolve, reject) => { + sms.send({ + address, + content, + success (data) { + res.result = data + success && success(data) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function readSmsSafely (opts = {}) { + const { timeout, success, fail, complete } = opts + const res = { errMsg: 'sendSms:ok' } + return new Promise((resolve, reject) => { + sms.readSafely({ + timeout, + success (data) { + res.result = data + success && success(data) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export default { + getContactPick, + getContactList, + sendSms +} diff --git a/packages/taro-quickapp/src/api/index.js b/packages/taro-quickapp/src/api/index.js new file mode 100644 index 000000000000..62719eaca797 --- /dev/null +++ b/packages/taro-quickapp/src/api/index.js @@ -0,0 +1,14 @@ +// 未实现 + +// 已实现 api +export * from './request' +export * from './storage' +export * from './router' +export * from './interactive' +export * from './equipment' +export * from './share' +export * from './notification' +export * from './system' +export * from './webview' +export * from './media' +export * from './device' \ No newline at end of file diff --git a/packages/taro-quickapp/src/api/media/index.js b/packages/taro-quickapp/src/api/media/index.js new file mode 100644 index 000000000000..0d62f28f924b --- /dev/null +++ b/packages/taro-quickapp/src/api/media/index.js @@ -0,0 +1,73 @@ +import audio from '@system.audio' +import record from '@system.record' + +export function createInnerAudioContext () { + return audio +} + +export function getPlayState (opts = {}) { + const { success, fail, complete } = opts + const res = { errMsg: 'getPlayState:ok' } + return new Promise((resolve, reject) => { + device.getCpuInfo({ + success (data) { + res.result = data + success && success(data) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function startRecord (opts = {}) { + const { + duration, + sampleRate, + numberOfChannels, + encodeBitRate, + format, + success, + fail, + complete + } = opts + const res = { errMsg: 'startRecord:ok' } + return new Promise((resolve, reject) => { + record.start({ + duration, + sampleRate, + numberOfChannels, + encodeBitRate, + format, + success (data) { + res.result = data + success && success(data) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function stopRecord () { + return record.stop() +} + +export default { + createAudioContext, + getPlayState, + startRecord, + stopRecord +} diff --git a/packages/taro-quickapp/src/api/notification/index.js b/packages/taro-quickapp/src/api/notification/index.js index 816a7d25c969..67f992b15b0c 100644 --- a/packages/taro-quickapp/src/api/notification/index.js +++ b/packages/taro-quickapp/src/api/notification/index.js @@ -1,6 +1,6 @@ import notification from '@system.notification' -export function showSotification (opts = {}) { +export function showNotification (opts = {}) { const { contentTitle, contentText, clickAction } = opts if (clickAction) { const uri = clickAction.uri @@ -14,5 +14,5 @@ export function showSotification (opts = {}) { } export default { - showSotification + showNotification } diff --git a/packages/taro-quickapp/src/api/request/index.js b/packages/taro-quickapp/src/api/request/index.js index f6fd4265c8e6..6da0bafc6bc7 100644 --- a/packages/taro-quickapp/src/api/request/index.js +++ b/packages/taro-quickapp/src/api/request/index.js @@ -1,6 +1,7 @@ import fetch from '@system.fetch' +import quickRequest from '@system.request' -export default function request (options = {}) { +export function request (options = {}) { return new Promise((resolve, reject) => { if (typeof options === 'string') { options = { @@ -17,10 +18,7 @@ export default function request (options = {}) { complete } = options - let { - header, - data = '' - } = options + let { header, data = '' } = options // headers if (typeof header !== 'object') header = {} @@ -30,11 +28,13 @@ export default function request (options = {}) { } // method - const methodUpper = typeof method === 'string' ? method.toUpperCase() : 'GET' + const methodUpper = + typeof method === 'string' ? method.toUpperCase() : 'GET' // data if (methodUpper === 'POST' && typeof data === 'object') { - let contentType = header && (header['Content-Type'] || header['content-type']) + let contentType = + header && (header['Content-Type'] || header['content-type']) if (contentType === 'application/json') { data = JSON.stringify(data) } @@ -74,3 +74,117 @@ export default function request (options = {}) { fetch.fetch(obj) }) } + +export function uploadFile (options = {}) { + return new Promise((resolve, reject) => { + const { + url = '', + filePath, + name = 'file', + formData = {}, + success, + fail, + complete + } = options + let { header, method = 'POST', files = [], data = [] } = options + if (typeof header !== 'object') header = {} + if (files.length === 0) { + files.push({ + name, + uri: filePath + }) + } + if (data.length === 0) { + data.push(formData) + } + const methodUpper = typeof method === 'string' ? method.toUpperCase() : 'POST' + + const obj = { + url, + header, + method: methodUpper, + files, + data, + success (res) { + let data = res.data + + if (dataType === 'json') data = JSON.parse(res.data) + + const reponse = { + data, + statusCode: res.code, + header: res.headers + } + typeof success === 'function' && success(reponse) + typeof complete === 'function' && complete(reponse) + resolve(reponse) + }, + fail (err, code) { + const reason = { + err, + code + } + typeof fail === 'function' && fail(reason) + typeof complete === 'function' && complete(reason) + reject(reason) + } + } + + quickRequest.upload(obj) + }) +} + +export function downloadFile (options = {}) { + return new Promise((resolve, reject) => { + const { + url = '', + description = '', + filename, + success, + fail, + complete + } = options + let { header } = options + if (typeof header !== 'object') header = {} + + let obj = { + url, + header, + description, + data, + success (res) { + let data = res.data + + if (dataType === 'json') data = JSON.parse(res.data) + + const reponse = { + data, + statusCode: res.code, + header: res.headers + } + typeof success === 'function' && success(reponse) + typeof complete === 'function' && complete(reponse) + resolve(reponse) + }, + fail (err, code) { + const reason = { + err, + code + } + typeof fail === 'function' && fail(reason) + typeof complete === 'function' && complete(reason) + reject(reason) + } + } + + if (filename) obj.filename = filename + + quickRequest.download(obj) + }) +} + +export default { + request, + uploadFile, + downloadFile +} diff --git a/packages/taro-quickapp/src/api/system/index.js b/packages/taro-quickapp/src/api/system/index.js new file mode 100644 index 000000000000..17a8677e17fc --- /dev/null +++ b/packages/taro-quickapp/src/api/system/index.js @@ -0,0 +1,224 @@ +import device from '@system.device' +import { generateUnSupportApi } from '../utils' + +export function getSystemInfo (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemInfo:ok' } + + return new Promise((resolve, reject) => { + device.getInfo({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + reject(res) + }, + complete () { + complete && complete(res) + } + }) + }) +} + +export function getSystemId (options = {}) { + const { success, fail, complete, type } = options + const res = { errMsg: 'getSystemId:ok' } + return new Promise((resolve, reject) => { + device.getId({ + type, + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + reject(res) + }, + complete () { + complete && complete(res) + } + }) + }) +} + +export function getSystemDeviceId (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemDeviceId:ok' } + return new Promise((resolve, reject) => { + device.getDeviceId({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getSystemUserId (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemUserId:ok' } + return new Promise((resolve, reject) => { + device.getDeviceId({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getSystemAdvertisingId (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemAdvertisingId:ok' } + return new Promise((resolve, reject) => { + device.getAdvertisingId({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getSystemSerial (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemSerial:ok' } + return new Promise((resolve, reject) => { + device.getSerial({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getSystemTotalStorage (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemTotalStorage:ok' } + return new Promise((resolve, reject) => { + device.getTotalStorage({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getSystemAvailableStorage (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemAvailableStorage:ok' } + return new Promise((resolve, reject) => { + device.getAvailableStorage({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getSystemCpuInfo (options = {}) { + const { success, fail, complete } = options + const res = { errMsg: 'getSystemCpuInfo:ok' } + return new Promise((resolve, reject) => { + device.getCpuInfo({ + success (data) { + res.result = data.result + success && success(res) + resolve(res) + }, + fail (data, code) { + res.errMsg = data + res.code = code + fail && fail(res) + complete && complete(res) + reject(res) + } + }) + }) +} + +export function getSystemPlatform () { + return device.platform +} + +let unSupportApis = ['getSystemInfoSync'] +unSupportApis = generateUnSupportApi( + '快应用暂不支持SystemInfo的同步接口', + unSupportApis +) + +const qSystem = { + getSystemInfo, + getSystemId, + getSystemDeviceId, + getSystemUserId, + getSystemAdvertisingId, + getSystemSerial, + getSystemTotalStorage, + getSystemAvailableStorage, + getSystemCpuInfo, + getSystemPlatform +} + +Object.assign(qSystem, unSupportApis) + +export default qSystem diff --git a/packages/taro-quickapp/src/api/webview/index.js b/packages/taro-quickapp/src/api/webview/index.js new file mode 100644 index 000000000000..be078005cb20 --- /dev/null +++ b/packages/taro-quickapp/src/api/webview/index.js @@ -0,0 +1,9 @@ +import webview from '@system.webview' + +export function webviewLoadUrl (opts = {}) { + return webview.loadUrl(opts) +} + +export default { + webviewLoadUrl +} diff --git a/packages/taro-quickapp/src/native-api.js b/packages/taro-quickapp/src/native-api.js index f90e46bd390e..7aba962f38d0 100644 --- a/packages/taro-quickapp/src/native-api.js +++ b/packages/taro-quickapp/src/native-api.js @@ -4,13 +4,9 @@ import { otherApis, initPxTransform } from '@tarojs/taro' -import request from './api/request' -import storage from './api/storage' -import router from './api/router' -import interactive from './api/interactive' -import equipment from './api/equipment' -import share from './api/share' -import notification from './api/notification' + +import * as supportApi from './api/index' + function processApis (taro) { const weApis = Object.assign({}, onAndSyncApis, noPromiseApis, otherApis) @@ -31,9 +27,8 @@ function pxTransform (size) { export default function initNativeApi (taro) { processApis(taro) - taro.request = request taro.canIUseWebp = canIUseWebp taro.initPxTransform = initPxTransform.bind(taro) taro.pxTransform = pxTransform.bind(taro) - Object.assign(taro, storage, router, interactive, equipment, share, notification) + Object.assign(taro, supportApi) }