Skip to content

Commit

Permalink
Merge branch 'main' into fix_bind_event_error
Browse files Browse the repository at this point in the history
  • Loading branch information
koppthe authored May 10, 2024
2 parents befb5b5 + f45c37e commit e3fb81a
Show file tree
Hide file tree
Showing 19 changed files with 419 additions and 65 deletions.
30 changes: 30 additions & 0 deletions examples/mini-program-example/src/pages/api/media/video/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,36 @@ export default class Index extends React.Component {
})
},
},
{
id: 'chooseMedium',
inputData: {
count: 9,
mediaType: ['image'],
sourceType: ['album', 'camera'],
maxDuration: 30,
sizeType: ['original', 'compressed'],
camera: 'back',
mediaId: '',
takingSupported: false,
editSupported: false,
searchSupported: false,
},
func: (apiIndex, data) => {
TestConsole.consoleTest('chooseMedium')
// @ts-ignore
Taro.chooseMedium({
...data,
success: (res) => {
TestConsole.consoleSuccess.call(this, res, apiIndex)
},
fail: (res) => {
TestConsole.consoleFail.call(this, res, apiIndex)
},
}).then((res) => {
TestConsole.consoleResult.call(this, res, apiIndex)
})
},
},
{
id: 'createVideoContext',
func: (apiIndex) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@
"WriteResult": false,
"addCard": false,
"addFileToFavorites": false,
"addInterceptor": false,
"addInterceptor": true,
"addPhoneCalendar": {
"object": {
"title": true,
Expand Down Expand Up @@ -585,6 +585,33 @@
"type": true
}
},
"chooseMedium": {
"object": {
"count": true,
"mediaType": {
"video": true,
"image": true,
"mix": true
},
"sourceType": {
"album": true,
"camera": true
},
"maxDuration": true,
"sizeType": true,
"camera": {
"back": true,
"front": true
},
"takingSupported": true,
"editSupported": true,
"searchSupported": true
},
"success": {
"tempFiles": true,
"type": true
}
},
"chooseMessageFile": false,
"choosePoi": false,
"chooseVideo": {
Expand All @@ -608,7 +635,7 @@
"width": true
}
},
"cleanInterceptors": false,
"cleanInterceptors": true,
"clearStorage": true,
"clearStorageSync": true,
"closeBLEConnection": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,12 @@ class NativeApi {
return options
}

// @ts-ignore
@(syncAndRelease)
chooseMediumAssets (options: any): any {
return options
}

// @ts-ignore
@(syncAndRelease)
getVideoInfo (options: any): any {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
import { showActionSheet } from '@tarojs/taro-h5'

import native from '../../NativeApi'
import { shouldBeObject } from '../../utils'
import { MethodHandler } from '../../utils/handler'

namespace chooseMedium {
export interface Option {
/** 最多可以选择的文件个数
* @default 9
* @supported harmny-hybrid
*/
count?: number
/** 文件类型
* @default ['image', 'video']
* @supported harmny-hybrid
*/
mediaType?: Array<keyof mediaType>
/** 图片和视频选择的来源
* @default ['album', 'camera']
* @supported harmny-hybrid
*/
sourceType?: Array<keyof sourceType>
/** 拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 60s 之间
* @default 10
* @supported harmny-hybrid
*/
maxDuration?: number
/** 仅在 sourceType 为 camera 时生效,是否压缩文件
* @default ['original', 'compressed']
* @supported harmny-hybrid
*/
sizeType?: Array<'original' | 'compressed'>
/** 仅在 sourceType 为 camera 时生效,使用前置或后置摄像头
* @default "back"
* @supported harmny-hybrid
*/
camera?: string
/** 仅在 sourceType 为 album 时生效,相册中是否允许拍照
* @default "false"
* @supported harmny-hybrid
*/
takingSupported?: boolean
/** 仅在 sourceType 为 album 时生效,相册中是否允许编辑照片
* @default "false"
* @supported harmny-hybrid
*/
editSupported?: boolean
/** 仅在 sourceType 为 album 时生效,相册中是否允许搜索
* @default "false"
* @supported harmny-hybrid
*/
searchSupported?: boolean
/** 接口调用结束的回调函数(调用成功、失败都会执行) */
complete?: (res: TaroGeneral.CallbackResult) => void
/** 接口调用失败的回调函数 */
fail?: (res: TaroGeneral.CallbackResult) => void
/** 接口调用成功的回调函数 */
success?: (result: SuccessCallbackResult) => void
/** 用来上传的input元素ID
* @supported harmny-hybrid
*/
mediaId?: string
}
export interface SuccessCallbackResult extends TaroGeneral.CallbackResult {
/** 本地临时文件列表 */
tempFiles: ChooseMedium[]
/** 文件类型,有效值有 image 、video、mix */
type: string
}

/** 本地临时文件列表 */
export interface ChooseMedium {
/** 本地临时文件路径 (本地路径) */
tempFilePath: string
/** 本地临时文件大小,单位 B */
size: number
/** 视频的时间长度 */
duration: number
/** 视频的高度 */
height: number
/** 视频的宽度 */
width: number
/** 视频缩略图临时文件路径 */
thumbTempFilePath: string
/** 选择的文件的类型 */
fileType: string
/** 相册中是否支持拍照 */
takingSupported?: boolean
/** 相册中是否支持编辑照片 */
editSupported?: boolean
/** 相册中是否支持搜索 */
searchSupported?: boolean
}
export interface mediaType {
/** 只能拍摄视频或从相册选择视频 */
video
/** 只能拍摄图片或从相册选择图片 */
image
/** 可同时选择图片和视频 */
mix
}
export interface sourceType {
/** 从相册选择 */
album
/** 使用相机拍摄 */
camera
}
export interface camera {
/** 使用后置摄像头 */
back
/** 使用前置摄像头 */
front
}
}


interface harmony {
/** 拍摄或从手机相册中选择图片或视频。
* @supported harmony_hybrid
* @example
* ```tsx
* Taro.chooseMedium({
* count: 9,
* mediaType: ['image','video'],
* sourceType: ['album', 'camera'],
* maxDuration: 30,
* camera: 'back',
* takingSupported: false,
* editSupported: false,
* searchSupported: false,
* success: (res) => {
* console.log(res.tempFiles)
* console.log(res.type)
* }
* })
* ```
*/
chooseMedium (option: chooseMedium.Option): Promise<chooseMedium.SuccessCallbackResult>
}
/**
* 拍摄或从手机相册中选择图片或视频
*
* @canUse chooseMedium
* @__object [count, mediaType[video, image, mix], sourceType[album, camera], maxDuration, sizeType, camera[back, front],takingSupported,editSupported,searchSupported]
* @__success [tempFiles, type]
*/
export const chooseMedium: harmony['chooseMedium'] = async (options) => {
const name = 'chooseMedium'

// options must be an Object
const isValid = shouldBeObject(options).flag || typeof options === 'undefined'
if (!isValid) {
const res = { errMsg: `${name}:fail invalid params` }
console.error(res.errMsg)
return Promise.reject(res)
}

const {
count = 9,
mediaType = ['video', 'image'],
sourceType = ['album', 'camera'],
maxDuration = 10,
sizeType = ['original', 'compressed'],
camera = 'back',
takingSupported = false,
editSupported = false,
searchSupported = false,
success,
fail,
} = options as Exclude<typeof options, undefined>

const handle = new MethodHandler<{
tempFiles?: chooseMedium.ChooseMedium[]
type?: string
errMsg?: string
}>({ name, success, fail })

let sourceSelected
if (sourceType.length === 1) {
sourceSelected = sourceType[0]
} else if (typeof sourceType !== 'object' || (sourceType.includes('album') && sourceType.includes('camera'))) {
const selected = await showActionSheet({ itemList: ['拍摄', '从相册选择'] }).then(
(res) => {
sourceSelected = res.tapIndex === 0 ? 'camera' : 'album'
return true
},
() => {
return false
}
)
if (!selected) {
return handle.fail({ errMsg: 'fail cancel' })
}
}

return new Promise<chooseMedium.SuccessCallbackResult>((resolve, reject) => {
native.chooseMediumAssets({
count: count,
mediaType: mediaType,
sourceType: sourceSelected,
maxDuration: maxDuration,
sizeType: sizeType,
camera: camera,
takingSupported: takingSupported,
editSupported: editSupported,
searchSupported: searchSupported,
apiName: name,
success: (res: any) => {
const result: chooseMedium.SuccessCallbackResult = {
tempFiles: res.tempFiles,
type: res.type,
errMsg: res.errMsg,
}
handle.success(result, { resolve, reject })
},
fail: (err: any) => {
handle.fail(err, { resolve, reject })
},
})
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export { createVideoContext } from '@tarojs/taro-h5'
* 拍摄视频或从手机相册中选视频。
*/
export * from './chooseMedia'
export * from './chooseMedium'

/**
* VideoContext 实例
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,43 @@
import { request as h5Request } from '@tarojs/taro-h5'

import { request as nativeReuqest } from './nativeRequest'
import { addInterceptor as h5AddInterceptor, cleanInterceptors as h5CleanInterceptors, request as h5Request } from '@tarojs/taro-h5'

import { addInterceptor as nativeAddInterceptor, cleanInterceptors as nativeCleanInterceptors, request as nativeReuqest } from './nativeRequest'

/**
* 封装请求方法
* @param options 请求选项
* 发起 HTTPS 网络请求
*
* @canUse request
* @__object [url, data, header, timeout, method[OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT], dataType[json, text, base64, arraybuffer], responseType[text, arraybuffer], enableCache]
* @__success [data, header, statusCode, cookies]
* @param useNativeRequest 默认使用true
*/
export function request (options: any, useNativeRequest: boolean = true) {
return useNativeRequest ? nativeReuqest(options) : h5Request(options)
}


/**
* 网络请求任务对象
*
* @canUse RequestTask
* @__class [abort, onHeadersReceived, offHeadersReceived]
*/

/**
* 使用拦截器
*
* @canUse addInterceptor
*/
export function addInterceptor (interceptor, useNativeRequest: boolean = true) {
return useNativeRequest ? nativeAddInterceptor(interceptor) : h5AddInterceptor(interceptor)
}

/**
* 清除所有拦截器
*
* @canUse cleanInterceptors
*/
export function cleanInterceptors (interceptor, useNativeRequest: boolean = true) {
return useNativeRequest ? nativeCleanInterceptors(interceptor) : h5CleanInterceptors(interceptor)
}


Loading

0 comments on commit e3fb81a

Please sign in to comment.