-
-
Notifications
You must be signed in to change notification settings - Fork 36
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
319 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export default { | ||
navigationBarTitleText: 'useInvoice', | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
import React, { useCallback, useState } from 'react'; | ||
import { AtButton, AtRadio } from 'taro-ui'; | ||
|
||
import DocPage from '@components/DocPage'; | ||
|
||
import { useModal, useInvoice } from 'taro-hooks'; | ||
|
||
export default () => { | ||
const [invoice, setInvoice] = useState<{ [_: string]: string }[]>([]); | ||
const [show] = useModal({ mask: true, title: '获取结果', showCancel: false }); | ||
const [chooseInvoice, chooseInvoiceTitle] = useInvoice(); | ||
|
||
const handleChooseInvoice = useCallback(async () => { | ||
let content = '获取成功!'; | ||
try { | ||
const invoiceInfo = await chooseInvoice(); | ||
console.log(invoiceInfo); | ||
if (!invoiceInfo) { | ||
content = '获取失败'; | ||
} else { | ||
setInvoice(invoiceInfo); | ||
} | ||
} catch (e) { | ||
console.log(e); | ||
content = '获取失败'; | ||
} | ||
show({ content }); | ||
}, [chooseInvoice, show]); | ||
|
||
const handleChooseInvoiceTitle = useCallback(async () => { | ||
let content = '获取成功!'; | ||
try { | ||
const invoiceTitleInfo = await chooseInvoiceTitle(); | ||
console.log(invoiceTitleInfo); | ||
if (!invoiceTitleInfo) { | ||
content = '获取失败'; | ||
} else { | ||
setInvoice([invoiceTitleInfo]); | ||
} | ||
} catch (e) { | ||
content = '获取失败'; | ||
} | ||
show({ content }); | ||
}, [chooseInvoiceTitle, show]); | ||
|
||
return ( | ||
<DocPage title="useInvoice 发票(抬头)" panelTitle="useInvoice"> | ||
<AtButton onClick={handleChooseInvoice}>获取发票信息</AtButton> | ||
<AtButton className="gap" onClick={handleChooseInvoiceTitle}> | ||
获取发票抬头信息 | ||
</AtButton> | ||
{invoice.map((item, index) => ( | ||
<AtRadio | ||
key={index + item.title} | ||
onClick={console.log} | ||
value={null} | ||
options={Object.entries(item).map(([key, value]) => ({ | ||
label: key, | ||
value, | ||
desc: value as string, | ||
}))} | ||
/> | ||
))} | ||
</DocPage> | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export default { | ||
navigationBarTitleText: 'useWeRun', | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
import React, { useCallback } from 'react'; | ||
import { AtButton } from 'taro-ui'; | ||
|
||
import DocPage from '@components/DocPage'; | ||
|
||
import { useModal, useWeRun, useLogin } from 'taro-hooks'; | ||
|
||
export default () => { | ||
const [show] = useModal({ mask: true, title: '获取结果', showCancel: false }); | ||
const [getWeRunData, shareToWeRun] = useWeRun(); | ||
const [login] = useLogin(); | ||
|
||
const handleGetWeRunData = useCallback(async () => { | ||
let content = '获取成功!'; | ||
try { | ||
await login(true); | ||
const data = await getWeRunData(); | ||
if (!data) { | ||
content = '获取失败'; | ||
} else { | ||
content = JSON.stringify(data); | ||
} | ||
} catch (e) { | ||
content = '获取失败'; | ||
} | ||
show({ content }); | ||
}, [getWeRunData, show, login]); | ||
|
||
const handleShareToWeRun = useCallback(async () => { | ||
let content = '获取成功!'; | ||
try { | ||
await login(true); | ||
const recordList = [ | ||
{ typeId: 1003, time: 200, calorie: 100 }, | ||
{ typeId: 3005, time: 300, calorie: 1000, distance: 1000 }, | ||
{ typeId: 4003, calorie: 1000, number: 100 }, | ||
]; | ||
const data = await shareToWeRun(recordList); | ||
if (!data) { | ||
content = '获取失败'; | ||
} | ||
} catch (e) { | ||
console.log(e); | ||
content = '获取失败'; | ||
} | ||
show({ content }); | ||
}, [shareToWeRun, show, login]); | ||
|
||
return ( | ||
<DocPage title="useWeRun 微信运动" panelTitle="useWeRun"> | ||
<AtButton onClick={handleGetWeRunData}>获取微信运动步数</AtButton> | ||
<AtButton className="gap" onClick={handleShareToWeRun}> | ||
分享数据至微信运动 | ||
</AtButton> | ||
</DocPage> | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
--- | ||
title: useWeRun | ||
nav: | ||
title: Hooks | ||
path: /hooks | ||
order: 2 | ||
group: | ||
title: 小程序 | ||
path: /wechat | ||
--- | ||
|
||
# useWeRun | ||
|
||
获取微信运动数据 | ||
|
||
## 何时使用 | ||
|
||
当需要使用用户微信运动数据时 | ||
|
||
<Alert> | ||
获取用户微信数据时, 需要先调用 <code>wx.login</code> 接口。步数信息会在用户主动进入小程序时更新. 此外, 分享微信运动需在小程序管理后台,「开发」-「接口设置」中自助开通该组件权限。 只针对「体育-在线健身」类目的小程序开放。 | ||
</Alert> | ||
|
||
## API | ||
|
||
```jsx | pure | ||
const [getWeRunData, shareToWeRun] = useWeRun(); | ||
``` | ||
|
||
## 参数说明 | ||
|
||
无 | ||
|
||
## 返回值说明 | ||
|
||
| 参数 | 类型 | 说明 | | ||
| ------------ | ------------------------------------------------------------------------- | ------------------------------ | | ||
| getWeRunData | `() => Promise<IGetWeRunDataSuccessResult | General.CallbackResult>` | 获取用户过去三十天微信运动步数 | | ||
| shareToWeRun | `(recordList: IRecordListItem[]) => Promise<General.CallbackResult>` | 分享数据到微信运动 | | ||
|
||
### IGetWeRunDataSuccessResult | ||
|
||
| 参数 | 类型 | 说明 | | ||
| ------------- | -------- | ----------------------------------------------------------------------------- | | ||
| encryptedData | `string` | 包括敏感数据在内的完整用户信息的加密数据, 解密后得到的数据结构见后文 | | ||
| iv | `string` | 加密算法的初始向量 | | ||
| cloudId | `string` | 敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据 | | ||
|
||
### IRecordListItem | ||
|
||
| 参数 | 类型 | 说明 | | ||
| -------- | -------- | ------------------------------------- | | ||
| typeId | `number` | 运动项目 id | | ||
| time | `number` | 运动时长(单位: 分钟, 范围: 1-1440) | | ||
| distance | `number` | 运动距离(单位: 米, 范围: 1-100000) | | ||
| number | `number` | 运动个数(单位: 个, 范围: 1-10000) | | ||
| calorie | `number` | 消耗卡路里(单位: 千焦, 范围: 1-10000) | | ||
|
||
### typeId | ||
|
||
| 运动类型 | typeId | 支持传入单位 | | ||
| ---------- | ------ | --------------------- | | ||
| 锻炼 | `1001` | time/calorie | | ||
| 体能训练 | `1002` | time/calorie | | ||
| 功能性训练 | `1003` | time/calorie | | ||
| 瑜伽 | `2001` | time/calorie | | ||
| 钓鱼 | `2002` | time/calorie | | ||
| 广场舞 | `2003` | time/calorie | | ||
| 踢足球 | `2004` | time/calorie | | ||
| 打篮球 | `2005` | time/calorie | | ||
| 打羽毛球 | `2006` | time/calorie | | ||
| 打乒乓球 | `2007` | time/calorie | | ||
| 打网球 | `2008` | time/calorie | | ||
| 跑步 | `3001` | time/distance/calorie | | ||
| 登山 | `3002` | time/distance/calorie | | ||
| 骑车 | `3003` | time/distance/calorie | | ||
| 游泳 | `3004` | time/distance/calorie | | ||
| 滑雪 | `3005` | time/distance/calorie | | ||
| 跳绳 | `4001` | number/calorie | | ||
| 俯卧撑 | `4002` | number/calorie | | ||
| 深蹲 | `4003` | number/calorie | | ||
|
||
## 代码演示 | ||
|
||
<code src="@pages/useWeRun" /> | ||
|
||
## Hook 支持度 | ||
|
||
| 微信小程序 | H5 | ReactNative | | ||
| :--------: | :-: | :---------: | | ||
| ✔️ | | | | ||
|
||
## FAQ | ||
|
||
### 1. 更多说明 | ||
|
||
- [getWeRunData](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html) | ||
- [shareToWeRun](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.shareToWeRun.html) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
import { ENV_TYPE, getWeRunData, General } from '@tarojs/taro'; | ||
import { useCallback } from 'react'; | ||
import useEnv from '../useEnv'; | ||
import { typeOf } from '../utils/tool'; | ||
|
||
declare var wx: any; | ||
|
||
export interface IGetWeRunDataSuccessResult { | ||
encryptedData: string; | ||
iv: string; | ||
cloudId?: string; | ||
} | ||
export interface IRecordListItem { | ||
typeId: number; | ||
time?: number; | ||
distance?: number; | ||
calorie: number; | ||
number?: number; | ||
} | ||
|
||
export type TGetWeRunData = () => Promise< | ||
IGetWeRunDataSuccessResult | General.CallbackResult | ||
>; | ||
|
||
export type TShareToWeRun = ( | ||
recordList: IRecordListItem[], | ||
) => Promise<General.CallbackResult>; | ||
|
||
function useWeRun(): [TGetWeRunData, TShareToWeRun] { | ||
const env = useEnv(); | ||
|
||
const getWeRunDataAsync = useCallback<TGetWeRunData>(() => { | ||
return new Promise((resolve, reject) => { | ||
if (env !== ENV_TYPE.WEAPP) { | ||
reject({ errMsg: 'getWeRunData: fail' }); | ||
} else { | ||
try { | ||
getWeRunData({ | ||
success: (res) => { | ||
const { errMsg, ...result } = | ||
res as unknown as IGetWeRunDataSuccessResult & | ||
General.CallbackResult; | ||
resolve(result); | ||
}, | ||
fail: reject, | ||
}).catch(reject); | ||
} catch (e) { | ||
reject({ errMsg: 'getWeRunData: fail', data: e }); | ||
} | ||
} | ||
}); | ||
}, [env]); | ||
|
||
const shareToWeRunAsync = useCallback<TShareToWeRun>( | ||
(recordList) => { | ||
return new Promise((resolve, reject) => { | ||
if ( | ||
env !== ENV_TYPE.WEAPP || | ||
typeOf(wx, 'Undefined') || | ||
!Array.isArray(recordList) || | ||
!recordList.length | ||
) { | ||
reject({ errMsg: 'shareToWeRun: fail' }); | ||
} else { | ||
try { | ||
if (env === ENV_TYPE.WEAPP) { | ||
wx.shareToWeRun({ | ||
recordList, | ||
success: resolve, | ||
fail: reject, | ||
}).catch(reject); | ||
} | ||
} catch (e) { | ||
reject({ errMsg: 'shareToWeRun: fail', data: e }); | ||
} | ||
} | ||
}); | ||
}, | ||
[env], | ||
); | ||
|
||
return [getWeRunDataAsync, shareToWeRunAsync]; | ||
} | ||
|
||
export default useWeRun; |