Skip to content

Commit

Permalink
feat(usewerun): add useWeRun hook
Browse files Browse the repository at this point in the history
  • Loading branch information
innocces committed Sep 21, 2021
1 parent c293b1e commit 951826f
Show file tree
Hide file tree
Showing 9 changed files with 319 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/app/src/app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export default {
'pages/useRequestSubscribeMessage/index',
'pages/useChooseAddress/index',
'pages/useInvoice/index',
'pages/useWeRun/index',
// network
'pages/useRequest/index',
'pages/useRequest/defaultRequest/index',
Expand Down
4 changes: 4 additions & 0 deletions packages/app/src/constant/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ export const ChildrenList: { [_: string]: APIChildrenItem[] } = {
id: 'useInvoice',
name: 'useInvoice 发票(抬头)',
},
{
id: 'useWeRun',
name: 'useWeRun 微信运动',
},
],
[APIChildrenName.media]: [
{
Expand Down
3 changes: 3 additions & 0 deletions packages/app/src/pages/useInvoice/index.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default {
navigationBarTitleText: 'useInvoice',
};
66 changes: 66 additions & 0 deletions packages/app/src/pages/useInvoice/index.tsx
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>
);
};
3 changes: 3 additions & 0 deletions packages/app/src/pages/useWeRun/index.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default {
navigationBarTitleText: 'useWeRun',
};
57 changes: 57 additions & 0 deletions packages/app/src/pages/useWeRun/index.tsx
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>
);
};
2 changes: 2 additions & 0 deletions packages/hooks/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import useLogin from './useLogin';
import useRequestSubscribeMessage from './useRequestSubscribeMessage';
import useChooseAddress from './useChooseAddress';
import useInvoice from './useInvoice';
import useWeRun from './useWeRun';

// network
import useNetworkType from './useNetworkType';
Expand Down Expand Up @@ -97,4 +98,5 @@ export {
useRequestSubscribeMessage,
useChooseAddress,
useInvoice,
useWeRun,
};
98 changes: 98 additions & 0 deletions packages/hooks/src/useWeRun/index.md
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 &#124; 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)
85 changes: 85 additions & 0 deletions packages/hooks/src/useWeRun/index.ts
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;

0 comments on commit 951826f

Please sign in to comment.