@fairys/taro-tools-react 1.0.32 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/esm/components/custom-tab-bar/index.css +39 -0
  2. package/esm/components/custom-tab-bar/index.d.ts +57 -0
  3. package/esm/components/custom-tab-bar/index.js +114 -0
  4. package/esm/components/index.d.ts +1 -0
  5. package/esm/components/index.js +1 -0
  6. package/esm/context/global.data.instance.d.ts +27 -0
  7. package/esm/context/global.data.instance.js +40 -0
  8. package/esm/context/global.message.data.instance.d.ts +0 -7
  9. package/esm/context/global.message.data.instance.js +0 -23
  10. package/esm/context/index.d.ts +1 -0
  11. package/esm/context/index.js +1 -0
  12. package/esm/context/page.data.instance.d.ts +2 -0
  13. package/esm/context/page.data.instance.js +4 -1
  14. package/esm/context/page.info.data.instance.d.ts +2 -0
  15. package/esm/context/page.info.data.instance.js +4 -1
  16. package/esm/styles/index.css +18 -0
  17. package/esm/utils/request.js +3 -2
  18. package/lib/components/custom-tab-bar/index.css +39 -0
  19. package/lib/components/custom-tab-bar/index.d.ts +57 -0
  20. package/lib/components/custom-tab-bar/index.js +165 -0
  21. package/lib/components/index.d.ts +1 -0
  22. package/lib/components/index.js +9 -0
  23. package/lib/context/global.data.instance.d.ts +27 -0
  24. package/lib/context/global.data.instance.js +91 -0
  25. package/lib/context/global.message.data.instance.d.ts +0 -7
  26. package/lib/context/global.message.data.instance.js +0 -34
  27. package/lib/context/index.d.ts +1 -0
  28. package/lib/context/index.js +9 -0
  29. package/lib/context/page.data.instance.d.ts +2 -0
  30. package/lib/context/page.data.instance.js +4 -1
  31. package/lib/context/page.info.data.instance.d.ts +2 -0
  32. package/lib/context/page.info.data.instance.js +4 -1
  33. package/lib/styles/index.css +18 -0
  34. package/lib/utils/request.js +3 -2
  35. package/package.json +1 -1
  36. package/src/components/custom-tab-bar/index.css +38 -0
  37. package/src/components/custom-tab-bar/index.tsx +169 -0
  38. package/src/components/index.ts +1 -0
  39. package/src/context/global.data.instance.ts +69 -0
  40. package/src/context/global.message.data.instance.ts +1 -34
  41. package/src/context/index.ts +1 -0
  42. package/src/context/page.data.instance.tsx +9 -0
  43. package/src/context/page.info.data.instance.tsx +8 -0
  44. package/src/utils/request.ts +3 -2
@@ -0,0 +1,169 @@
1
+ import { proxy, useSnapshot, ref } from 'valtio';
2
+ import { CoverImage, CoverView } from '@tarojs/components';
3
+ import Taro from '@tarojs/taro';
4
+ import { Fragment, memo, useMemo } from 'react';
5
+ import clsx from 'clsx';
6
+
7
+ let fairysTaroCustomTabBarRender: React.ReactNode | undefined;
8
+
9
+ /**自定义底部导航栏状态管理*/
10
+ export const fairysTaroCustomTabBarState = proxy({
11
+ /**当前选中的项*/
12
+ selected: '',
13
+ items: ref([]) as FairysTaroCustomTabBarItemItem[],
14
+ isUpdatedItems: false,
15
+ /**未选中颜色*/
16
+ color: 'rgb(156 163 175)',
17
+ /**选中颜色*/
18
+ selectedColor: '#000',
19
+ /**切换标签*/
20
+ onSwitchTab: (url: string) => {
21
+ fairysTaroCustomTabBarState.selected = url;
22
+ Taro.switchTab({ url });
23
+ },
24
+ /**更新自定义底部导航栏项*/
25
+ onUpdatedItems: (items: FairysTaroCustomTabBarItemItem[]) => {
26
+ fairysTaroCustomTabBarState.items = ref(items);
27
+ fairysTaroCustomTabBarState.isUpdatedItems = true;
28
+ },
29
+ /**设置自定义底部导航栏渲染*/
30
+ onSetTabBarRender: (_tabBarRender: React.ReactNode) => {
31
+ fairysTaroCustomTabBarRender = _tabBarRender;
32
+ fairysTaroCustomTabBarState.isUpdatedItems = false;
33
+ },
34
+ });
35
+
36
+ export interface FairysTaroCustomTabBarItemItem {
37
+ /**自定义底部导航栏项文本*/
38
+ text: string;
39
+ /**自定义底部导航栏项 URL*/
40
+ url: string;
41
+ /**自定义底部导航栏项图标*/
42
+ icon?: string;
43
+ /**自定义底部导航栏项样式*/
44
+ style?: React.CSSProperties;
45
+ /**自定义底部导航栏项类名*/
46
+ className?: string;
47
+ /**自定义底部导航栏项选中图标*/
48
+ selectedIcon?: string;
49
+ /**自定义底部导航栏项选中图标样式*/
50
+ selectedIconStyle?: React.CSSProperties;
51
+ /**自定义底部导航栏项图标样式*/
52
+ iconStyle?: React.CSSProperties;
53
+ /**自定义底部导航栏项选中图标类名*/
54
+ selectedIconClassName?: string;
55
+ /**自定义底部导航栏项选中文本样式*/
56
+ selectedTextStyle?: React.CSSProperties;
57
+ /**自定义底部导航栏项文本样式*/
58
+ textStyle?: React.CSSProperties;
59
+ /**自定义底部导航栏项选中文本类名*/
60
+ selectedTextClassName?: string;
61
+ }
62
+
63
+ export interface FairysTaroCustomTabBarProps {}
64
+
65
+ export interface FairysTaroCustomTabBarItemProps {
66
+ /**自定义底部导航栏项*/
67
+ item: FairysTaroCustomTabBarItemItem;
68
+ }
69
+
70
+ const FairysTaroCustomTabBarItemBase = (props: FairysTaroCustomTabBarItemProps) => {
71
+ const { item } = props;
72
+ const { selected, color, selectedColor } = useSnapshot(fairysTaroCustomTabBarState);
73
+ const isSelected = selected === item.url;
74
+ const className = useMemo(() => clsx('fairys_taro_custom_tab_bar_item', item.className), [item.className]);
75
+ const imgClassName = useMemo(
76
+ () =>
77
+ clsx('fairys_taro_custom_tab_bar_item_img', item.selectedIconClassName, {
78
+ fairys_taro_custom_tab_bar_item_img_selected: isSelected,
79
+ // 'fairystaro__opacity-100': isSelected,
80
+ // 'fairystaro__opacity-60': !isSelected,
81
+ }),
82
+ [item.selectedIconClassName, isSelected],
83
+ );
84
+ const imgStyle = useMemo(() => {
85
+ return {
86
+ opacity: isSelected ? 1 : 0.6,
87
+ };
88
+ }, [isSelected]);
89
+
90
+ const textClassName = useMemo(
91
+ () =>
92
+ clsx('fairys_taro_custom_tab_bar_item_text', item.selectedTextClassName, {
93
+ fairys_taro_custom_tab_bar_item_text_selected: isSelected,
94
+ // 'fairystaro__text-black': isSelected,
95
+ // 'fairystaro__text-gray-400': !isSelected,
96
+ }),
97
+ [item.selectedTextClassName, isSelected],
98
+ );
99
+
100
+ const textStyle = useMemo(() => {
101
+ return { color: isSelected ? selectedColor : color };
102
+ }, [isSelected, color, selectedColor]);
103
+
104
+ return (
105
+ <CoverView
106
+ onClick={() => fairysTaroCustomTabBarState.onSwitchTab(item.url)}
107
+ key={item.url}
108
+ style={item.style}
109
+ className={className}
110
+ >
111
+ {item.icon ? (
112
+ <CoverImage
113
+ src={isSelected ? item.selectedIcon || item.icon : item.icon}
114
+ className={imgClassName}
115
+ style={{ ...imgStyle, ...((isSelected ? item.selectedIconStyle : item.iconStyle) || {}) }}
116
+ />
117
+ ) : (
118
+ <Fragment />
119
+ )}
120
+ <CoverView
121
+ className={textClassName}
122
+ style={{
123
+ ...((isSelected ? item.selectedTextStyle : item.textStyle) || {}),
124
+ ...textStyle,
125
+ }}
126
+ >
127
+ {item.text}
128
+ </CoverView>
129
+ </CoverView>
130
+ );
131
+ };
132
+
133
+ const FairysTaroCustomTabBarBase = () => {
134
+ const { items } = useSnapshot(fairysTaroCustomTabBarState);
135
+ const _itemsRender = useMemo(() => {
136
+ if (fairysTaroCustomTabBarState.isUpdatedItems === false && fairysTaroCustomTabBarRender) {
137
+ return fairysTaroCustomTabBarRender;
138
+ }
139
+ const render = items.map((item) => {
140
+ return <FairysTaroCustomTabBarItemBase key={item.url} item={item} />;
141
+ });
142
+ fairysTaroCustomTabBarState.onSetTabBarRender(render);
143
+ return render;
144
+ }, [items]);
145
+
146
+ return (
147
+ <CoverView className="fairys_taro_custom_tab_bar">
148
+ <CoverView className="fairys_taro_custom_tab_bar-border"></CoverView>
149
+ {_itemsRender}
150
+ </CoverView>
151
+ );
152
+ };
153
+
154
+ export const FairysTaroCustomTabBar = memo(() => {
155
+ return useMemo(() => <FairysTaroCustomTabBarBase />, []);
156
+ });
157
+
158
+ /**
159
+ * 页面高度问题
160
+ */
161
+ export const useFairysTaroCustomTabBarPageStyle = () => {
162
+ return useMemo(() => {
163
+ const height = Taro.getSystemInfoSync().windowHeight;
164
+ return {
165
+ height: height - 60,
166
+ overflowY: 'auto',
167
+ };
168
+ }, []);
169
+ };
@@ -4,3 +4,4 @@ export * from './Mesage';
4
4
  export * from './Toast';
5
5
  export * from './connectToastMessage';
6
6
  export * from './MainPage';
7
+ export * from './custom-tab-bar';
@@ -0,0 +1,69 @@
1
+ import { proxy, useSnapshot } from 'valtio';
2
+ import navigate from 'utils/navigate';
3
+ import { ProxyInstanceObjectBase } from 'utils/valtio/instance';
4
+ import { globalSettingDataInstance } from './global.setting.data.instance';
5
+ import Taro from '@tarojs/taro';
6
+ import { authDataInstance } from './auth.data.instance';
7
+
8
+ export interface GlobalDataInstanceState {
9
+ /**数据默认值不使用*/
10
+ __defaultValue?: string;
11
+ }
12
+
13
+ /**
14
+ * 全局数据实例
15
+ */
16
+ export class GlobalDataInstance extends ProxyInstanceObjectBase<GlobalDataInstanceState> {
17
+ store = proxy<GlobalDataInstanceState>({});
18
+ /**
19
+ * 跳转登录页面前执行
20
+ */
21
+ onBeforetToLoginPage?: () => boolean | void;
22
+ /**跳转 redirect 路由*/
23
+ toRedirect = () => {
24
+ // 获取当前路由参数
25
+ const currentPath = Taro.getCurrentInstance().router?.params?.redirect || '';
26
+ if (currentPath) {
27
+ // 跳转 redirect 路由
28
+ navigate.navigateTo({ url: currentPath });
29
+ }
30
+ };
31
+
32
+ /**跳转登录页面*/
33
+ toLoginPage = () => {
34
+ // 清除登录凭证(token)、权限列表、菜单权限列表、用户信息
35
+ authDataInstance.clear();
36
+ if (this.onBeforetToLoginPage) {
37
+ const f = this.onBeforetToLoginPage();
38
+ if (f === false) {
39
+ // 如果返回false则不跳转登录页面
40
+ return;
41
+ }
42
+ }
43
+ const loginPageRoute = globalSettingDataInstance.store.loginPageRoute || '';
44
+ const isLoginPage = navigate.isCurrentPage(loginPageRoute || '');
45
+ const _loginPageRoute = `${loginPageRoute || ''}`.replace(/^\//, '');
46
+ if (isLoginPage) {
47
+ // 如果是登录页面不进行跳转
48
+ return;
49
+ }
50
+ // 跳转登录页面
51
+ Taro.navigateTo({ url: `/${_loginPageRoute}` });
52
+ };
53
+ }
54
+ /**
55
+ * 全局数据实例
56
+ */
57
+ export const globalDataInstance = new GlobalDataInstance();
58
+
59
+ /**
60
+ * 全局数据状态管理
61
+ */
62
+ export const useGlobalData = () => {
63
+ const store = useSnapshot(globalDataInstance.store);
64
+ return [store, globalDataInstance, store.__defaultValue] as [
65
+ GlobalDataInstanceState,
66
+ GlobalDataInstance,
67
+ string | undefined,
68
+ ];
69
+ };
@@ -7,6 +7,7 @@ import type { FairysTaroMessageItemProps } from 'components/Mesage';
7
7
  import { ProxyInstanceObjectBase } from 'utils/valtio/instance';
8
8
  import { globalSettingDataInstance } from './global.setting.data.instance';
9
9
  import Taro from '@tarojs/taro';
10
+ import { authDataInstance } from './auth.data.instance';
10
11
 
11
12
  export interface MessageDataType extends FairysTaroMessageItemProps {
12
13
  /**用于唯一标识提示框(默认自动生成)*/
@@ -77,40 +78,6 @@ export class GlobalMessageDataInstance extends ProxyInstanceObjectBase<GlobalMes
77
78
  hideToast = () => {
78
79
  this.store.toastData = ref({ ...this.store.toastData, visible: false });
79
80
  };
80
-
81
- /**
82
- * 跳转登录页面前执行
83
- */
84
- onBeforetToLoginPage?: () => boolean | void;
85
- // 跳转 redirect 路由
86
- toRedirect = () => {
87
- // 获取当前路由参数
88
- const currentPath = Taro.getCurrentInstance().router?.params?.redirect || '';
89
- if (currentPath) {
90
- // 跳转 redirect 路由
91
- navigate.navigateTo({ url: currentPath });
92
- }
93
- };
94
-
95
- /**跳转登录页面*/
96
- toLoginPage = () => {
97
- if (this.onBeforetToLoginPage) {
98
- const f = this.onBeforetToLoginPage();
99
- if (f === false) {
100
- // 如果返回false则不跳转登录页面
101
- return;
102
- }
103
- }
104
- const loginPageRoute = globalSettingDataInstance.store.loginPageRoute || '';
105
- const isLoginPage = navigate.isCurrentPage(loginPageRoute || '');
106
- const _loginPageRoute = `${loginPageRoute || ''}`.replace(/^\//, '');
107
- if (isLoginPage) {
108
- // 如果是登录页面不进行跳转
109
- return;
110
- }
111
- // 跳转登录页面
112
- Taro.navigateTo({ url: `/${_loginPageRoute}` });
113
- };
114
81
  }
115
82
  /**
116
83
  * 全局消息数据实例
@@ -3,3 +3,4 @@ export * from './page.data.instance';
3
3
  export * from './page.info.data.instance';
4
4
  export * from './auth.data.instance';
5
5
  export * from './global.setting.data.instance';
6
+ export * from './global.data.instance';
@@ -494,6 +494,8 @@ export interface PageDataInstanceContextProviderProps<
494
494
  valueFields?: M['valueFields'];
495
495
  /**是否是第一次加载*/
496
496
  isMountLoad?: boolean;
497
+ /**是否使用 useDidShow*/
498
+ isDidShowLoad?: boolean;
497
499
  /**页面标题*/
498
500
  title?: string;
499
501
  /**成功状态码
@@ -535,6 +537,7 @@ export function PageDataInstanceContextProvider<
535
537
  responseSuccessCode,
536
538
  responseListField,
537
539
  responseTotalField,
540
+ isDidShowLoad,
538
541
  } = props;
539
542
 
540
543
  const pageInstance = usePageDataInstance(instance);
@@ -563,6 +566,12 @@ export function PageDataInstanceContextProvider<
563
566
  }
564
567
  }, []);
565
568
 
569
+ useDidShow(() => {
570
+ if (isDidShowLoad) {
571
+ pageInstance.main_onSearch();
572
+ }
573
+ });
574
+
566
575
  useDidShow(() => {
567
576
  if (title) {
568
577
  // 列表查询才调用
@@ -235,6 +235,8 @@ export interface PageInfoDataInstanceContextProviderProps<
235
235
  title?: string;
236
236
  /**页面一加载是否请求详情接口*/
237
237
  isMountRequestInfo?: boolean;
238
+ /**是否使用 useDidShow*/
239
+ isDidShowRequestInfo?: boolean;
238
240
  /**自定义hooks,挂载参数和设置完初始值后执行*/
239
241
  useHooks?: (instance: M) => void;
240
242
  }
@@ -254,6 +256,7 @@ export function PageInfoDataInstanceContextProvider<
254
256
  title,
255
257
  isMountRequestInfo,
256
258
  useHooks,
259
+ isDidShowRequestInfo,
257
260
  } = props;
258
261
  const pageInfoInstance = usePageInfoDataInstance(instance);
259
262
  pageInfoInstance.requestInfoConfig = requestInfoConfig;
@@ -276,6 +279,11 @@ export function PageInfoDataInstanceContextProvider<
276
279
  }
277
280
  }, []);
278
281
 
282
+ useDidShow(() => {
283
+ if (isDidShowRequestInfo) {
284
+ pageInfoInstance.main_getInfo();
285
+ }
286
+ });
279
287
  return (
280
288
  <PageInfoDataInstanceContext.Provider value={pageInfoInstance}>{children}</PageInfoDataInstanceContext.Provider>
281
289
  );
@@ -1,6 +1,7 @@
1
1
  import Taro from '@tarojs/taro';
2
2
  import { globalSettingDataInstance } from 'context/global.setting.data.instance';
3
3
  import { globalMessageDataInstance } from 'context/global.message.data.instance';
4
+ import { globalDataInstance } from 'context/global.data.instance';
4
5
 
5
6
  const codeMessage = {
6
7
  400: '发出的请求错误',
@@ -56,7 +57,7 @@ const requestResponseHandle = (
56
57
  // 权限问题 ,重新登录
57
58
  msg = '请重新登录';
58
59
  /**重新跳转登录页面*/
59
- globalMessageDataInstance.toLoginPage();
60
+ globalDataInstance.toLoginPage();
60
61
  } else if (![globalSettingDataInstance.store.requestSuccessCode, requestSuccessCode, 1, 200].includes(code)) {
61
62
  // 提示内容
62
63
  // @ts-ignore
@@ -244,7 +245,7 @@ export class RequestInstance {
244
245
  }
245
246
  }
246
247
  options?.fail?.({ errMsg: '未登录' });
247
- globalMessageDataInstance.toLoginPage();
248
+ globalDataInstance.toLoginPage();
248
249
  return undefined;
249
250
  }
250
251
  }