@bifrostui/react 1.0.4 → 1.1.1
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.
- package/dist/CitySelector/CitySelector.css +102 -0
- package/dist/CitySelector/CitySelector.d.ts +4 -0
- package/dist/CitySelector/CitySelector.js +36 -0
- package/dist/CitySelector/CitySelector.miniapp.d.ts +5 -0
- package/dist/CitySelector/CitySelector.miniapp.js +79 -0
- package/dist/CitySelector/CitySelector.types.d.ts +47 -0
- package/dist/CitySelector/CitySelector.types.js +5 -0
- package/dist/CitySelector/CitySelectorCore.d.ts +5 -0
- package/dist/CitySelector/CitySelectorCore.js +184 -0
- package/dist/CitySelector/Selector/index.css +11 -0
- package/dist/CitySelector/Selector/index.d.ts +9 -0
- package/dist/CitySelector/Selector/index.js +22 -0
- package/dist/CitySelector/index.d.ts +2 -0
- package/dist/CitySelector/index.js +34 -0
- package/dist/CitySelector/miniapp.css +4 -0
- package/dist/Modal/Modal.miniapp.d.ts +16 -0
- package/dist/Modal/Modal.miniapp.js +73 -0
- package/dist/Picker/Picker.css +53 -0
- package/dist/Picker/Picker.d.ts +5 -0
- package/dist/Picker/Picker.js +155 -0
- package/dist/Picker/Picker.types.d.ts +98 -0
- package/dist/Picker/Picker.types.js +5 -0
- package/dist/Picker/PickerPanel.css +54 -0
- package/dist/Picker/PickerPanel.d.ts +5 -0
- package/dist/Picker/PickerPanel.js +210 -0
- package/dist/Picker/index.d.ts +2 -0
- package/dist/Picker/index.js +34 -0
- package/dist/Picker/utils.d.ts +13 -0
- package/dist/Picker/utils.js +66 -0
- package/dist/Tabs/Tabs.css +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +22 -0
- package/es/CitySelector/CitySelector.css +102 -0
- package/es/CitySelector/CitySelector.d.ts +4 -0
- package/es/CitySelector/CitySelector.js +36 -0
- package/es/CitySelector/CitySelector.miniapp.d.ts +5 -0
- package/es/CitySelector/CitySelector.miniapp.js +77 -0
- package/es/CitySelector/CitySelector.types.d.ts +47 -0
- package/es/CitySelector/CitySelector.types.js +1 -0
- package/es/CitySelector/CitySelectorCore.d.ts +5 -0
- package/es/CitySelector/CitySelectorCore.js +195 -0
- package/es/CitySelector/Selector/index.css +11 -0
- package/es/CitySelector/Selector/index.d.ts +9 -0
- package/es/CitySelector/Selector/index.js +13 -0
- package/es/CitySelector/index.d.ts +2 -0
- package/es/CitySelector/index.js +2 -0
- package/es/CitySelector/miniapp.css +4 -0
- package/es/Modal/Modal.miniapp.d.ts +16 -0
- package/es/Modal/Modal.miniapp.js +78 -0
- package/es/Picker/Picker.css +53 -0
- package/es/Picker/Picker.d.ts +5 -0
- package/es/Picker/Picker.js +171 -0
- package/es/Picker/Picker.types.d.ts +98 -0
- package/es/Picker/Picker.types.js +1 -0
- package/es/Picker/PickerPanel.css +54 -0
- package/es/Picker/PickerPanel.d.ts +5 -0
- package/es/Picker/PickerPanel.js +234 -0
- package/es/Picker/index.d.ts +2 -0
- package/es/Picker/index.js +2 -0
- package/es/Picker/utils.d.ts +13 -0
- package/es/Picker/utils.js +65 -0
- package/es/Tabs/Tabs.css +2 -2
- package/es/index.d.ts +2 -0
- package/es/index.js +3 -1
- package/package.json +6 -6
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
.bui-city-selector {
|
|
2
|
+
font-family: var(--bui-font-family);
|
|
3
|
+
height: 100%;
|
|
4
|
+
position: relative;
|
|
5
|
+
}
|
|
6
|
+
.bui-city-selector-title {
|
|
7
|
+
width: 100%;
|
|
8
|
+
height: 45px;
|
|
9
|
+
color: var(--bui-color-fg-default);
|
|
10
|
+
font-size: var(--bui-title-size-3);
|
|
11
|
+
line-height: 45px;
|
|
12
|
+
text-align: center;
|
|
13
|
+
position: sticky;
|
|
14
|
+
top: 0;
|
|
15
|
+
z-index: 1004;
|
|
16
|
+
border-bottom: solid 1px var(--bui-color-border-default);
|
|
17
|
+
background-color: var(--bui-color-bg-view);
|
|
18
|
+
}
|
|
19
|
+
.bui-city-selector-btn-close {
|
|
20
|
+
position: absolute;
|
|
21
|
+
top: 0;
|
|
22
|
+
right: 0;
|
|
23
|
+
width: 45px;
|
|
24
|
+
height: 45px;
|
|
25
|
+
color: var(--bui-color-fg-muted);
|
|
26
|
+
text-align: center;
|
|
27
|
+
font-size: 20px;
|
|
28
|
+
}
|
|
29
|
+
.bui-city-selector-scroll-view-container {
|
|
30
|
+
height: 100%;
|
|
31
|
+
}
|
|
32
|
+
.bui-city-selector-scroll-view-container.container-has-title {
|
|
33
|
+
height: calc(100% - 45px);
|
|
34
|
+
}
|
|
35
|
+
.bui-city-selector-all-city {
|
|
36
|
+
min-height: 500px;
|
|
37
|
+
font-size: var(--bui-text-size-2);
|
|
38
|
+
width: 100%;
|
|
39
|
+
background: var(--bui-color-bg-view);
|
|
40
|
+
align-self: flex-start;
|
|
41
|
+
}
|
|
42
|
+
.bui-city-selector-all-city .select-city-buttons {
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-flow: wrap;
|
|
45
|
+
padding-left: 3px;
|
|
46
|
+
padding-top: 7.5px;
|
|
47
|
+
}
|
|
48
|
+
.bui-city-selector-all-city .select-city-title {
|
|
49
|
+
font-size: var(--bui-title-size-4);
|
|
50
|
+
line-height: 15px;
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
padding-left: var(--bui-spacing-lg);
|
|
53
|
+
padding-top: 9px;
|
|
54
|
+
}
|
|
55
|
+
.bui-city-selector-list {
|
|
56
|
+
padding-left: var(--bui-spacing-lg);
|
|
57
|
+
list-style-type: none;
|
|
58
|
+
}
|
|
59
|
+
.bui-city-selector-list-item {
|
|
60
|
+
height: 45px;
|
|
61
|
+
font-size: var(--bui-title-size-4);
|
|
62
|
+
display: flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
}
|
|
65
|
+
.bui-city-selector-list-item:not(:last-child) {
|
|
66
|
+
border-bottom: 0.5px solid var(--bui-color-border-default);
|
|
67
|
+
}
|
|
68
|
+
.bui-city-selector-index-container {
|
|
69
|
+
z-index: 1001;
|
|
70
|
+
position: absolute;
|
|
71
|
+
white-space: nowrap;
|
|
72
|
+
right: 0;
|
|
73
|
+
top: 50%;
|
|
74
|
+
width: 40px;
|
|
75
|
+
will-change: transform;
|
|
76
|
+
transform: translate(0, -50%);
|
|
77
|
+
transition: opacity 0.2s ease-out, transform 0.2s ease-out;
|
|
78
|
+
}
|
|
79
|
+
.bui-city-selector-index-container.left-in {
|
|
80
|
+
opacity: 1;
|
|
81
|
+
transform: translate(0, -50%);
|
|
82
|
+
}
|
|
83
|
+
.bui-city-selector-index-container.city-index-has-title {
|
|
84
|
+
top: calc(50% + 22.5px);
|
|
85
|
+
}
|
|
86
|
+
.bui-city-selector-index-container ul {
|
|
87
|
+
margin: 0;
|
|
88
|
+
padding: 0;
|
|
89
|
+
float: left;
|
|
90
|
+
width: 100%;
|
|
91
|
+
touch-action: none;
|
|
92
|
+
}
|
|
93
|
+
.bui-city-selector-index-container li {
|
|
94
|
+
list-style: none;
|
|
95
|
+
height: 20px;
|
|
96
|
+
text-align: center;
|
|
97
|
+
font-size: var(--bui-text-size-3);
|
|
98
|
+
color: var(--bui-color-info, --bui-color-info);
|
|
99
|
+
display: flex;
|
|
100
|
+
align-items: center;
|
|
101
|
+
justify-content: center;
|
|
102
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _CitySelectorCore = _interopRequireDefault(require("./CitySelectorCore"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
11
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
12
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
13
|
+
const CitySelector = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
14
|
+
const {
|
|
15
|
+
cities
|
|
16
|
+
} = props;
|
|
17
|
+
const [height, setHeight] = (0, _react.useState)('');
|
|
18
|
+
const touchHandler = (e, scrollToCode) => {
|
|
19
|
+
const t = document.elementFromPoint(e.changedTouches[0].clientX, e.changedTouches[0].clientY);
|
|
20
|
+
const code = t?.dataset?.code;
|
|
21
|
+
scrollToCode(code);
|
|
22
|
+
};
|
|
23
|
+
(0, _react.useEffect)(() => {
|
|
24
|
+
if (!cities?.length || height) return;
|
|
25
|
+
const screenHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
26
|
+
const domHeight = document.querySelector('.bui-city-selector-scroll-view-container')?.getBoundingClientRect().height;
|
|
27
|
+
setHeight(`${domHeight / screenHeight * 100}vh`);
|
|
28
|
+
}, [cities]);
|
|
29
|
+
return /*#__PURE__*/_react.default.createElement(_CitySelectorCore.default, _extends({}, props, {
|
|
30
|
+
ref: ref,
|
|
31
|
+
touchHandler: touchHandler,
|
|
32
|
+
height: height
|
|
33
|
+
}));
|
|
34
|
+
});
|
|
35
|
+
CitySelector.displayName = 'BuiCitySelector';
|
|
36
|
+
var _default = exports.default = CitySelector;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { CitySelectorProps } from './CitySelector.types';
|
|
3
|
+
import './miniapp.less';
|
|
4
|
+
declare const CitySelector: React.ForwardRefExoticComponent<Omit<CitySelectorProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
5
|
+
export default CitySelector;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _taro = _interopRequireDefault(require("@tarojs/taro"));
|
|
9
|
+
var _CitySelectorCore = _interopRequireDefault(require("./CitySelectorCore"));
|
|
10
|
+
require("./miniapp.css");
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
15
|
+
const CitySelector = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
16
|
+
const {
|
|
17
|
+
cities
|
|
18
|
+
} = props;
|
|
19
|
+
const containerTop = (0, _react.useRef)(0);
|
|
20
|
+
const codeHeight = (0, _react.useRef)(0);
|
|
21
|
+
const [height, setHeight] = (0, _react.useState)('');
|
|
22
|
+
const queryContainerTop = cbk => {
|
|
23
|
+
const query = _taro.default.createSelectorQuery();
|
|
24
|
+
query.select('.bui-city-selector-index-container').boundingClientRect();
|
|
25
|
+
query.exec(res => {
|
|
26
|
+
containerTop.current = res[0]?.top;
|
|
27
|
+
cbk?.();
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
(0, _react.useEffect)(() => {
|
|
31
|
+
if (cities?.length === 0 || codeHeight.current) return;
|
|
32
|
+
// 演示获取字母高度
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
const query = _taro.default.createSelectorQuery();
|
|
35
|
+
query.select('.bui-city-selector-index-item').boundingClientRect();
|
|
36
|
+
query.exec(res => {
|
|
37
|
+
codeHeight.current = res[0]?.height;
|
|
38
|
+
});
|
|
39
|
+
}, 300);
|
|
40
|
+
}, [cities, height]);
|
|
41
|
+
(0, _react.useEffect)(() => {
|
|
42
|
+
if (!cities?.length || height) return;
|
|
43
|
+
const {
|
|
44
|
+
screenHeight
|
|
45
|
+
} = _taro.default.getSystemInfoSync();
|
|
46
|
+
const query = _taro.default.createSelectorQuery();
|
|
47
|
+
query.select('.bui-city-selector-scroll-view-container').boundingClientRect();
|
|
48
|
+
query.exec(codeRect => {
|
|
49
|
+
const domHeight = codeRect?.[0]?.height;
|
|
50
|
+
setHeight(`${domHeight / screenHeight * 100}vh`);
|
|
51
|
+
});
|
|
52
|
+
}, [cities]);
|
|
53
|
+
const parseIndex = (length, index) => {
|
|
54
|
+
if (index <= 0) return 0;
|
|
55
|
+
if (index >= length - 1) return length - 1;
|
|
56
|
+
return index;
|
|
57
|
+
};
|
|
58
|
+
const pxToCode = (clientY, scrollToCode, codeGroup) => {
|
|
59
|
+
let index = Math.floor((clientY - containerTop.current) / codeHeight.current);
|
|
60
|
+
index = parseIndex(codeGroup.length, index);
|
|
61
|
+
const codeItem = codeGroup[index];
|
|
62
|
+
scrollToCode(codeItem.code || codeItem);
|
|
63
|
+
};
|
|
64
|
+
const touchHandler = (event, scrollToCode, codeGroup) => {
|
|
65
|
+
const {
|
|
66
|
+
clientY
|
|
67
|
+
} = event.changedTouches[0];
|
|
68
|
+
queryContainerTop(() => {
|
|
69
|
+
pxToCode(clientY, scrollToCode, codeGroup);
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
return /*#__PURE__*/_react.default.createElement(_CitySelectorCore.default, _extends({}, props, {
|
|
73
|
+
ref: ref,
|
|
74
|
+
touchHandler: touchHandler,
|
|
75
|
+
height: height
|
|
76
|
+
}));
|
|
77
|
+
});
|
|
78
|
+
CitySelector.displayName = 'BuiCitySelector';
|
|
79
|
+
var _default = exports.default = CitySelector;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { OverrideProps } from '@bifrostui/types';
|
|
3
|
+
export type cityType = {
|
|
4
|
+
/** 城市名 */
|
|
5
|
+
name: string;
|
|
6
|
+
/** 城市名id */
|
|
7
|
+
code: string;
|
|
8
|
+
};
|
|
9
|
+
export type allCityItemType = {
|
|
10
|
+
/** 城市列表 */
|
|
11
|
+
cities: cityType[];
|
|
12
|
+
/** 索引字母 */
|
|
13
|
+
groupName: string;
|
|
14
|
+
};
|
|
15
|
+
export type CitySelectorProps<D extends React.ElementType = 'div', P = {}> = OverrideProps<{
|
|
16
|
+
props: P & {
|
|
17
|
+
/** 当前城市信息 */
|
|
18
|
+
selectedCity?: cityType;
|
|
19
|
+
/** 当前城市栏的title */
|
|
20
|
+
selectedCityGroupName?: string;
|
|
21
|
+
/** 定位城市信息 */
|
|
22
|
+
currentCity?: cityType;
|
|
23
|
+
/** 定位城市栏的title */
|
|
24
|
+
currentCityGroupName?: string;
|
|
25
|
+
/** 热门城市信息 */
|
|
26
|
+
hotCities?: cityType[];
|
|
27
|
+
/** 热门城市栏的title */
|
|
28
|
+
hotCitiesGroupName?: string;
|
|
29
|
+
/** 城市列表 */
|
|
30
|
+
cities: allCityItemType[];
|
|
31
|
+
/** 禁用展示索引 默认false 即展示索引 */
|
|
32
|
+
disableIndex?: boolean;
|
|
33
|
+
/** 头部标题 */
|
|
34
|
+
title?: string;
|
|
35
|
+
/** 选择城市回调 */
|
|
36
|
+
onSelect: (e: React.SyntheticEvent, data: {
|
|
37
|
+
city: cityType;
|
|
38
|
+
}) => void;
|
|
39
|
+
/** 和title配合使用,头部右侧的关闭回调 */
|
|
40
|
+
onClose?: (e: React.SyntheticEvent) => void;
|
|
41
|
+
};
|
|
42
|
+
defaultComponent: D;
|
|
43
|
+
}, D>;
|
|
44
|
+
export type CitySelectorCoreProps = CitySelectorProps & {
|
|
45
|
+
touchHandler: any;
|
|
46
|
+
height?: string;
|
|
47
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { CitySelectorCoreProps } from './CitySelector.types';
|
|
3
|
+
import './CitySelector.less';
|
|
4
|
+
declare const CitySelector: React.ForwardRefExoticComponent<Omit<CitySelectorCoreProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
5
|
+
export default CitySelector;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
9
|
+
var _utils = require("@bifrostui/utils");
|
|
10
|
+
var _ScrollView = require("../ScrollView");
|
|
11
|
+
var _Selector = _interopRequireDefault(require("./Selector"));
|
|
12
|
+
require("./CitySelector.css");
|
|
13
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
17
|
+
// 误差偏移量
|
|
18
|
+
const DEVIATION_HEIGHT = '6vmin';
|
|
19
|
+
const GPS_TYPE = {
|
|
20
|
+
title: '定位',
|
|
21
|
+
code: 'GPS'
|
|
22
|
+
};
|
|
23
|
+
const CURRENT_TYPE = {
|
|
24
|
+
title: '当前',
|
|
25
|
+
code: 'CRRT'
|
|
26
|
+
};
|
|
27
|
+
const HOT_CITY_TYPE = {
|
|
28
|
+
title: '热门',
|
|
29
|
+
code: 'HOT'
|
|
30
|
+
};
|
|
31
|
+
const prefixCls = 'bui-city-selector';
|
|
32
|
+
const CitySelector = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
33
|
+
const {
|
|
34
|
+
className,
|
|
35
|
+
title: pageTitle,
|
|
36
|
+
selectedCity,
|
|
37
|
+
selectedCityGroupName = '当前城市',
|
|
38
|
+
currentCity,
|
|
39
|
+
currentCityGroupName = '定位城市',
|
|
40
|
+
hotCities,
|
|
41
|
+
hotCitiesGroupName = '热门城市',
|
|
42
|
+
cities,
|
|
43
|
+
disableIndex,
|
|
44
|
+
touchHandler,
|
|
45
|
+
height,
|
|
46
|
+
onSelect,
|
|
47
|
+
onClose,
|
|
48
|
+
ref: propsRef,
|
|
49
|
+
...others
|
|
50
|
+
} = props;
|
|
51
|
+
const cityRef = (0, _react.useRef)(null);
|
|
52
|
+
const nodeRef = (0, _utils.useForkRef)(ref, propsRef, cityRef);
|
|
53
|
+
(0, _utils.useTouchEmulator)(cityRef.current);
|
|
54
|
+
const [codeGroup, setCodeGroup] = (0, _react.useState)([]);
|
|
55
|
+
const [codeShow, setCodeShow] = (0, _react.useState)(false);
|
|
56
|
+
const [targetId, setTargetId] = (0, _react.useState)('');
|
|
57
|
+
|
|
58
|
+
// 提取字母
|
|
59
|
+
(0, _react.useEffect)(() => {
|
|
60
|
+
if (!cities || cities?.length === 0 || codeGroup.length !== 0 || disableIndex) return;
|
|
61
|
+
const newGroup = [];
|
|
62
|
+
if (selectedCity) {
|
|
63
|
+
newGroup.push(CURRENT_TYPE);
|
|
64
|
+
}
|
|
65
|
+
if (currentCity) {
|
|
66
|
+
newGroup.push(GPS_TYPE);
|
|
67
|
+
}
|
|
68
|
+
if (hotCities) {
|
|
69
|
+
newGroup.push(HOT_CITY_TYPE);
|
|
70
|
+
}
|
|
71
|
+
cities.forEach(item => {
|
|
72
|
+
newGroup.push(item.groupName.toUpperCase());
|
|
73
|
+
});
|
|
74
|
+
setCodeGroup(newGroup);
|
|
75
|
+
}, [cities, selectedCity, currentCity, hotCities]);
|
|
76
|
+
|
|
77
|
+
// 计算每个code的top
|
|
78
|
+
(0, _react.useEffect)(() => {
|
|
79
|
+
if (codeGroup.length === 0) return;
|
|
80
|
+
setCodeShow(true);
|
|
81
|
+
}, [codeGroup]);
|
|
82
|
+
const selectHandler = (e, city) => {
|
|
83
|
+
onSelect(e, {
|
|
84
|
+
city
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
const scrollToCode = targetCode => {
|
|
88
|
+
if (!targetCode) return;
|
|
89
|
+
setTargetId(oldCode => {
|
|
90
|
+
if (targetCode !== oldCode) return targetCode;
|
|
91
|
+
return oldCode;
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
const touchCbk = e => {
|
|
95
|
+
e.stopPropagation();
|
|
96
|
+
touchHandler?.(e, scrollToCode, codeGroup);
|
|
97
|
+
};
|
|
98
|
+
const codeClickHandler = rightCode => {
|
|
99
|
+
setTargetId(rightCode);
|
|
100
|
+
};
|
|
101
|
+
const scrollHandler = (0, _utils.throttle)(() => {
|
|
102
|
+
if (targetId) {
|
|
103
|
+
setTargetId(undefined);
|
|
104
|
+
}
|
|
105
|
+
}, 500);
|
|
106
|
+
const closeHandler = e => {
|
|
107
|
+
onClose?.(e);
|
|
108
|
+
};
|
|
109
|
+
const renderTitile = (title, titleCode) => {
|
|
110
|
+
const parseTitle = (titleCode || title).toUpperCase();
|
|
111
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
112
|
+
className: "select-city-title",
|
|
113
|
+
id: disableIndex ? '' : parseTitle
|
|
114
|
+
}, title.toUpperCase());
|
|
115
|
+
};
|
|
116
|
+
const renderCity = (citys, title, titleCode) => {
|
|
117
|
+
return /*#__PURE__*/_react.default.createElement("div", null, renderTitile(title, titleCode), /*#__PURE__*/_react.default.createElement("div", {
|
|
118
|
+
className: "select-city-buttons"
|
|
119
|
+
}, citys.map((city, index) => {
|
|
120
|
+
return /*#__PURE__*/_react.default.createElement(_Selector.default, {
|
|
121
|
+
key: index,
|
|
122
|
+
city: city,
|
|
123
|
+
onSelect: selectHandler
|
|
124
|
+
});
|
|
125
|
+
})));
|
|
126
|
+
};
|
|
127
|
+
return /*#__PURE__*/_react.default.createElement("div", _extends({
|
|
128
|
+
className: (0, _clsx.default)(prefixCls, className),
|
|
129
|
+
ref: nodeRef
|
|
130
|
+
}, others), pageTitle ? /*#__PURE__*/_react.default.createElement("div", {
|
|
131
|
+
className: `${prefixCls}-title`
|
|
132
|
+
}, pageTitle, /*#__PURE__*/_react.default.createElement("div", {
|
|
133
|
+
className: `${prefixCls}-btn-close`,
|
|
134
|
+
onClick: closeHandler
|
|
135
|
+
}, "\u2715")) : null, /*#__PURE__*/_react.default.createElement(_ScrollView.ScrollView, {
|
|
136
|
+
scrollIntoView: targetId,
|
|
137
|
+
scrollY: true,
|
|
138
|
+
className: (0, _clsx.default)(`${prefixCls}-scroll-view-container tph`, {
|
|
139
|
+
'container-has-title': pageTitle
|
|
140
|
+
}),
|
|
141
|
+
onScroll: scrollHandler
|
|
142
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
143
|
+
className: `${prefixCls}-all-city`
|
|
144
|
+
}, selectedCity ? renderCity([selectedCity], selectedCityGroupName, CURRENT_TYPE.code) : null, currentCity ? renderCity([currentCity], currentCityGroupName, GPS_TYPE.code) : null, hotCities?.length > 0 ? renderCity(hotCities, hotCitiesGroupName, HOT_CITY_TYPE.code) : null, cities?.length > 0 ? /*#__PURE__*/_react.default.createElement("div", {
|
|
145
|
+
className: `${prefixCls}-list-container`
|
|
146
|
+
}, cities.map((item, cityGroupIndex) => {
|
|
147
|
+
if (!item?.groupName) return null;
|
|
148
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
149
|
+
key: cityGroupIndex
|
|
150
|
+
}, renderTitile(item.groupName, item.groupName), /*#__PURE__*/_react.default.createElement("ul", {
|
|
151
|
+
className: `${prefixCls}-list`
|
|
152
|
+
}, item.cities.map((city, cityIndex) => {
|
|
153
|
+
return /*#__PURE__*/_react.default.createElement("li", {
|
|
154
|
+
className: `${prefixCls}-list-item`,
|
|
155
|
+
key: cityIndex,
|
|
156
|
+
onClick: e => {
|
|
157
|
+
selectHandler(e, city);
|
|
158
|
+
}
|
|
159
|
+
}, city.name);
|
|
160
|
+
})));
|
|
161
|
+
})) : null)), codeGroup?.length > 0 && height ? /*#__PURE__*/_react.default.createElement("div", {
|
|
162
|
+
className: (0, _clsx.default)(`${prefixCls}-index-container`, {
|
|
163
|
+
'left-in': codeShow,
|
|
164
|
+
'city-index-has-title': pageTitle
|
|
165
|
+
})
|
|
166
|
+
}, /*#__PURE__*/_react.default.createElement("ul", {
|
|
167
|
+
onTouchMove: touchCbk,
|
|
168
|
+
className: `${prefixCls}-index-list`
|
|
169
|
+
}, codeGroup.map((item, chartIndex) => {
|
|
170
|
+
return /*#__PURE__*/_react.default.createElement("li", {
|
|
171
|
+
className: `${prefixCls}-index-item`,
|
|
172
|
+
key: chartIndex,
|
|
173
|
+
"data-code": item.code || item,
|
|
174
|
+
onClick: () => {
|
|
175
|
+
codeClickHandler(item.code || item);
|
|
176
|
+
},
|
|
177
|
+
style: {
|
|
178
|
+
maxHeight: `calc((${height} - ${DEVIATION_HEIGHT}) / ${codeGroup.length})`
|
|
179
|
+
}
|
|
180
|
+
}, item.title || item);
|
|
181
|
+
}))) : null);
|
|
182
|
+
});
|
|
183
|
+
CitySelector.displayName = 'BuiCitySelector';
|
|
184
|
+
var _default = exports.default = CitySelector;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
.bui-city-selector-item {
|
|
2
|
+
width: 111px;
|
|
3
|
+
height: 36px;
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
align-items: center;
|
|
7
|
+
border-radius: 20px;
|
|
8
|
+
margin: 4.5px 0 4.5px 9px;
|
|
9
|
+
background-color: var(--bui-color-bg-default);
|
|
10
|
+
font-size: var(--bui-text-size-2);
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { cityType } from '../CitySelector.types';
|
|
3
|
+
import './index.less';
|
|
4
|
+
type propsType = {
|
|
5
|
+
city: cityType;
|
|
6
|
+
onSelect: (e: React.SyntheticEvent, city: cityType) => void;
|
|
7
|
+
};
|
|
8
|
+
declare const Selector: (props: propsType) => React.JSX.Element;
|
|
9
|
+
export default Selector;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
require("./index.css");
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
const Selector = props => {
|
|
11
|
+
const {
|
|
12
|
+
city,
|
|
13
|
+
onSelect
|
|
14
|
+
} = props;
|
|
15
|
+
return /*#__PURE__*/_react.default.createElement("span", {
|
|
16
|
+
className: "bui-city-selector-item",
|
|
17
|
+
onClick: e => {
|
|
18
|
+
onSelect?.(e, city);
|
|
19
|
+
}
|
|
20
|
+
}, city.name);
|
|
21
|
+
};
|
|
22
|
+
var _default = exports.default = Selector;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _exportNames = {
|
|
7
|
+
CitySelector: true
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "CitySelector", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function () {
|
|
12
|
+
return _CitySelector.default;
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "default", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () {
|
|
18
|
+
return _CitySelector.default;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
var _CitySelector = _interopRequireDefault(require("./CitySelector"));
|
|
22
|
+
var _CitySelector2 = require("./CitySelector.types");
|
|
23
|
+
Object.keys(_CitySelector2).forEach(function (key) {
|
|
24
|
+
if (key === "default" || key === "__esModule") return;
|
|
25
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
26
|
+
if (key in exports && exports[key] === _CitySelector2[key]) return;
|
|
27
|
+
Object.defineProperty(exports, key, {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
get: function () {
|
|
30
|
+
return _CitySelector2[key];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ViewProps } from '@tarojs/components';
|
|
3
|
+
import './Modal.less';
|
|
4
|
+
declare const Modal: React.ForwardRefExoticComponent<Omit<ViewProps & {
|
|
5
|
+
open?: boolean;
|
|
6
|
+
container?: Element | (() => Element);
|
|
7
|
+
hideBackdrop?: boolean;
|
|
8
|
+
BackdropProps?: Partial<import("../Backdrop").BackdropProps>;
|
|
9
|
+
onClose?: (e: React.SyntheticEvent<Element, Event>, detail: import("./Modal.types").CloseDetail) => void;
|
|
10
|
+
disableScrollLock?: boolean;
|
|
11
|
+
disablePortal?: boolean;
|
|
12
|
+
keepMounted?: boolean;
|
|
13
|
+
} & import("../../../bui-types/src").ICommonProps & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
14
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
15
|
+
}, keyof import("../../../bui-types/src").ICommonProps | "open" | "container" | "hideBackdrop" | "BackdropProps" | "onClose" | "disableScrollLock" | "disablePortal" | "keepMounted">, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
16
|
+
export default Modal;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _utils = require("@bifrostui/utils");
|
|
8
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _components = require("@tarojs/components");
|
|
11
|
+
var _Backdrop = _interopRequireDefault(require("../Backdrop"));
|
|
12
|
+
var _Portal = _interopRequireDefault(require("../Portal"));
|
|
13
|
+
require("./Modal.css");
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
18
|
+
const prefixCls = 'bui-modal';
|
|
19
|
+
const Modal = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
20
|
+
const {
|
|
21
|
+
className,
|
|
22
|
+
open,
|
|
23
|
+
BackdropProps,
|
|
24
|
+
children,
|
|
25
|
+
container,
|
|
26
|
+
disablePortal,
|
|
27
|
+
disableScrollLock,
|
|
28
|
+
hideBackdrop,
|
|
29
|
+
onClose,
|
|
30
|
+
keepMounted,
|
|
31
|
+
...others
|
|
32
|
+
} = props;
|
|
33
|
+
const modalRef = _react.default.useRef(null);
|
|
34
|
+
const handleRef = (0, _utils.useForkRef)(modalRef, ref);
|
|
35
|
+
const [backdropExited, setBackDropExited] = (0, _react.useState)(hideBackdrop || !open);
|
|
36
|
+
const mounted = open || !backdropExited || keepMounted;
|
|
37
|
+
const handleBackdropClick = event => {
|
|
38
|
+
if (event.target.id !== event.currentTarget.id) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (onClose) {
|
|
42
|
+
onClose(event, {
|
|
43
|
+
from: 'backdrop'
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
if (!mounted) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return /*#__PURE__*/_react.default.createElement(_Portal.default, {
|
|
51
|
+
container: container,
|
|
52
|
+
disablePortal: disablePortal
|
|
53
|
+
}, /*#__PURE__*/_react.default.createElement(_components.View, _extends({
|
|
54
|
+
className: (0, _clsx.default)(prefixCls, className),
|
|
55
|
+
ref: handleRef,
|
|
56
|
+
catchMove: !disableScrollLock
|
|
57
|
+
}, others), !hideBackdrop ? /*#__PURE__*/_react.default.createElement(_Backdrop.default, _extends({
|
|
58
|
+
open: open,
|
|
59
|
+
onClick: handleBackdropClick,
|
|
60
|
+
onEnter: () => setBackDropExited(false),
|
|
61
|
+
onExited: () => setBackDropExited(true)
|
|
62
|
+
}, BackdropProps, {
|
|
63
|
+
className: (0, _clsx.default)(`${prefixCls}-backdrop`, BackdropProps?.className)
|
|
64
|
+
})) : null, (open || keepMounted) && children));
|
|
65
|
+
});
|
|
66
|
+
Modal.displayName = 'BuiModal';
|
|
67
|
+
Modal.defaultProps = {
|
|
68
|
+
open: false,
|
|
69
|
+
disablePortal: false,
|
|
70
|
+
disableScrollLock: false,
|
|
71
|
+
hideBackdrop: false
|
|
72
|
+
};
|
|
73
|
+
var _default = exports.default = Modal;
|