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)
}