deepsea-components 5.16.3 → 5.16.4

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.
@@ -1,5 +1,7 @@
1
1
  import { CSSProperties, ComponentProps, Key, ReactNode } from "react";
2
2
  import { DragMoveEvents } from "soda-hooks";
3
+ export type MustBeReactNode<T> = false extends (T extends ReactNode ? true : false) ? false : true;
4
+ export type MustBeReactKey<T> = false extends (T extends Key ? true : false) ? false : true;
3
5
  export type DraggableGridClassName = string | ((status: ContainerStatus) => string);
4
6
  export type DraggableGridItemClassName = string | ((status: DraggableGridItemStatus) => string);
5
7
  export type DraggableGridStyle = CSSProperties | ((status: ContainerStatus) => CSSProperties);
@@ -20,10 +22,10 @@ export interface DraggableGridItemStatus {
20
22
  isDragging: boolean;
21
23
  }
22
24
  /** 元素的 key 到次序的映射 */
23
- export type DraggableGridKeyToOrder = Map<Key, number>;
25
+ export type DraggableGridKeyToOrder<K extends Key> = Map<K, number>;
24
26
  /** 次序到元素的 key 的映射 */
25
- export type DraggableGridOrderToKey = Map<number, Key>;
26
- export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "children"> & DragMoveEvents<HTMLDivElement> & {
27
+ export type DraggableGridOrderToKey<K extends Key> = Map<number, K>;
28
+ export type DraggableGridProps<T, K extends Key = T extends Key ? T : never> = Omit<ComponentProps<"div">, "className" | "children"> & DragMoveEvents<HTMLDivElement> & {
27
29
  /** 类名 */
28
30
  className?: DraggableGridClassName;
29
31
  /** 类名 */
@@ -58,28 +60,28 @@ export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "c
58
60
  /** 元素高度 */
59
61
  itemHeight: number;
60
62
  /** 元素的 key 到次序的映射 */
61
- orderMap?: DraggableGridKeyToOrder;
63
+ orderMap?: DraggableGridKeyToOrder<K>;
62
64
  /** 次序变化时回调 */
63
- onOrderMapChange?: (orderMap: DraggableGridKeyToOrder) => void;
65
+ onOrderMapChange?: (orderMap: DraggableGridKeyToOrder<K>) => void;
64
66
  /** 禁用的元素 */
65
- isItemDisabled?: Key[] | ((item: T, key: Key) => boolean);
67
+ isItemDisabled?: K[] | ((item: T, key: K) => boolean);
66
68
  /** 禁用的次序 */
67
69
  isOrderDisabled?: number[] | ((order: number) => boolean);
68
70
  /** 次序的优先级,可以通过此函数调整元素的优先放置的方向,左上,右上,左下,右下,中心,顺时针,逆时针等等 */
69
71
  orderPriority?: (a: number, b: number) => number;
70
72
  /** 触发移动的元素 */
71
- handle?: string | HTMLElement | ((item: T, key: Key, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null;
72
- } & (T extends ReactNode ? {
73
+ handle?: string | HTMLElement | ((item: T, key: K, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null;
74
+ } & (MustBeReactNode<T> extends true ? {
73
75
  /** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
74
76
  render?: (item: T, status: DraggableGridItemStatus) => ReactNode;
75
77
  } : {
76
78
  /** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
77
79
  render: (item: T, status: DraggableGridItemStatus) => ReactNode;
78
- }) & (T extends Key ? {
80
+ }) & (MustBeReactKey<T> extends true ? {
79
81
  /** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
80
- keyExtractor?: (item: T) => Key;
82
+ keyExtractor?: (item: T) => K;
81
83
  } : {
82
84
  /** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
83
- keyExtractor: (item: T) => Key;
85
+ keyExtractor: (item: T) => K;
84
86
  });
85
- export declare function DraggableGrid<T>({ className, classNames, style, items, disabled, columns, rows, gap, gapX, gapY, itemWidth, itemHeight, orderMap, onOrderMapChange, render, keyExtractor, isItemDisabled: _isItemDisabled, isOrderDisabled, orderPriority, handle, onDragMoveStart: _onDragMoveStart, onDragMove: _onDragMove, onDragMoveEnd: _onDragMoveEnd, ...rest }: DraggableGridProps<T>): import("react/jsx-runtime").JSX.Element;
87
+ export declare function DraggableGrid<T, K extends Key = T extends Key ? T : never>({ className, classNames, style, items, disabled, columns, rows, gap, gapX, gapY, itemWidth, itemHeight, orderMap, onOrderMapChange, render, keyExtractor, isItemDisabled: _isItemDisabled, isOrderDisabled, orderPriority, handle, onDragMoveStart: _onDragMoveStart, onDragMove: _onDragMove, onDragMoveEnd: _onDragMoveEnd, ...rest }: DraggableGridProps<T, K>): import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepsea-components",
3
- "version": "5.16.3",
3
+ "version": "5.16.4",
4
4
  "description": "格数科技自用组件库",
5
5
  "type": "module",
6
6
  "exports": {
@@ -4,6 +4,10 @@ import { DragMoveEvent, DragMoveEvents, useDragMove } from "soda-hooks"
4
4
 
5
5
  import styles from "./DraggableGrid.module.css"
6
6
 
7
+ export type MustBeReactNode<T> = false extends (T extends ReactNode ? true : false) ? false : true
8
+
9
+ export type MustBeReactKey<T> = false extends (T extends Key ? true : false) ? false : true
10
+
7
11
  export type DraggableGridClassName = string | ((status: ContainerStatus) => string)
8
12
 
9
13
  export type DraggableGridItemClassName = string | ((status: DraggableGridItemStatus) => string)
@@ -30,10 +34,10 @@ export interface DraggableGridItemStatus {
30
34
  }
31
35
 
32
36
  /** 元素的 key 到次序的映射 */
33
- export type DraggableGridKeyToOrder = Map<Key, number>
37
+ export type DraggableGridKeyToOrder<K extends Key> = Map<K, number>
34
38
 
35
39
  /** 次序到元素的 key 的映射 */
36
- export type DraggableGridOrderToKey = Map<number, Key>
40
+ export type DraggableGridOrderToKey<K extends Key> = Map<number, K>
37
41
 
38
42
  function isTheSameArray<T>(a: T[], b: T[]) {
39
43
  if (a.length !== b.length) return false
@@ -50,15 +54,15 @@ function isTheSameIterable<T>(a: Iterable<T>, b: Iterable<T>) {
50
54
  return aSet.difference(bSet).size === 0
51
55
  }
52
56
 
53
- interface GetOrderMapParams {
54
- prev?: DraggableGridKeyToOrder
57
+ interface GetOrderMapParams<K extends Key> {
58
+ prev?: DraggableGridKeyToOrder<K>
55
59
  orders: number[]
56
- keys: Key[]
60
+ keys: K[]
57
61
  }
58
62
 
59
- function getOrderMap({ prev, orders, keys }: GetOrderMapParams) {
63
+ function getOrderMap<K extends Key>({ prev, orders, keys }: GetOrderMapParams<K>) {
60
64
  const orderSet = new Set(orders)
61
- const orderMap = new Map<Key, number>()
65
+ const orderMap = new Map<K, number>()
62
66
  const newKeys = keys.filter(key => {
63
67
  if (!prev) return true
64
68
  if (prev.has(key)) {
@@ -97,11 +101,11 @@ function getPosition({ order, columns, gapX, gapY, itemWidth, itemHeight }: GetP
97
101
  }
98
102
  }
99
103
 
100
- function getOrderToKey(keyToOrder: DraggableGridKeyToOrder) {
104
+ function getOrderToKey<K extends Key>(keyToOrder: DraggableGridKeyToOrder<K>) {
101
105
  return new Map(Array.from(keyToOrder.entries()).map(([key, order]) => [order, key]))
102
106
  }
103
107
 
104
- export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "children"> &
108
+ export type DraggableGridProps<T, K extends Key = T extends Key ? T : never> = Omit<ComponentProps<"div">, "className" | "children"> &
105
109
  DragMoveEvents<HTMLDivElement> & {
106
110
  /** 类名 */
107
111
  className?: DraggableGridClassName
@@ -137,18 +141,18 @@ export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "c
137
141
  /** 元素高度 */
138
142
  itemHeight: number
139
143
  /** 元素的 key 到次序的映射 */
140
- orderMap?: DraggableGridKeyToOrder
144
+ orderMap?: DraggableGridKeyToOrder<K>
141
145
  /** 次序变化时回调 */
142
- onOrderMapChange?: (orderMap: DraggableGridKeyToOrder) => void
146
+ onOrderMapChange?: (orderMap: DraggableGridKeyToOrder<K>) => void
143
147
  /** 禁用的元素 */
144
- isItemDisabled?: Key[] | ((item: T, key: Key) => boolean)
148
+ isItemDisabled?: K[] | ((item: T, key: K) => boolean)
145
149
  /** 禁用的次序 */
146
150
  isOrderDisabled?: number[] | ((order: number) => boolean)
147
151
  /** 次序的优先级,可以通过此函数调整元素的优先放置的方向,左上,右上,左下,右下,中心,顺时针,逆时针等等 */
148
152
  orderPriority?: (a: number, b: number) => number
149
153
  /** 触发移动的元素 */
150
- handle?: string | HTMLElement | ((item: T, key: Key, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null
151
- } & (T extends ReactNode
154
+ handle?: string | HTMLElement | ((item: T, key: K, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null
155
+ } & (MustBeReactNode<T> extends true
152
156
  ? {
153
157
  /** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
154
158
  render?: (item: T, status: DraggableGridItemStatus) => ReactNode
@@ -157,24 +161,32 @@ export type DraggableGridProps<T> = Omit<ComponentProps<"div">, "className" | "c
157
161
  /** 渲染函数,当 T 为 ReactNode 时,render 为可选 */
158
162
  render: (item: T, status: DraggableGridItemStatus) => ReactNode
159
163
  }) &
160
- (T extends Key
164
+ (MustBeReactKey<T> extends true
161
165
  ? {
162
166
  /** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
163
- keyExtractor?: (item: T) => Key
167
+ keyExtractor?: (item: T) => K
164
168
  }
165
169
  : {
166
170
  /** 获取 key 的函数,当 T 为 Key 时,keyExtractor 为可选 */
167
- keyExtractor: (item: T) => Key
171
+ keyExtractor: (item: T) => K
168
172
  })
169
173
 
170
- interface DraggableGridItemProps<T> extends ComponentProps<"div">, DragMoveEvents<HTMLDivElement> {
174
+ interface DraggableGridItemProps<T, K extends Key = T extends Key ? T : never> extends ComponentProps<"div">, DragMoveEvents<HTMLDivElement> {
171
175
  item: T
172
- itemKey: Key
176
+ itemKey: K
173
177
  /** 触发移动的元素 */
174
- handle?: string | HTMLElement | ((item: T, key: Key, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null
178
+ handle?: string | HTMLElement | ((item: T, key: K, element: HTMLDivElement) => HTMLElement | undefined | null) | undefined | null
175
179
  }
176
180
 
177
- function DraggableGridItem<T>({ item, itemKey, handle, onDragMoveStart, onDragMove, onDragMoveEnd, ...rest }: DraggableGridItemProps<T>) {
181
+ function DraggableGridItem<T, K extends Key = T extends Key ? T : never>({
182
+ item,
183
+ itemKey,
184
+ handle,
185
+ onDragMoveStart,
186
+ onDragMove,
187
+ onDragMoveEnd,
188
+ ...rest
189
+ }: DraggableGridItemProps<T, K>) {
178
190
  const element = useRef<HTMLDivElement>(null)
179
191
 
180
192
  useDragMove({
@@ -195,8 +207,8 @@ function DraggableGridItem<T>({ item, itemKey, handle, onDragMoveStart, onDragMo
195
207
  return <div ref={element} {...rest} />
196
208
  }
197
209
 
198
- interface DraggingItem {
199
- key: Key
210
+ interface DraggingItem<K extends Key> {
211
+ key: K
200
212
  startX: number
201
213
  startY: number
202
214
  deltaX: number
@@ -208,10 +220,10 @@ interface DraggingItem {
208
220
  gapY: number
209
221
  itemWidth: number
210
222
  itemHeight: number
211
- keyToOrder: DraggableGridKeyToOrder
223
+ keyToOrder: DraggableGridKeyToOrder<K>
212
224
  }
213
225
 
214
- export function DraggableGrid<T>({
226
+ export function DraggableGrid<T, K extends Key = T extends Key ? T : never>({
215
227
  className,
216
228
  classNames,
217
229
  style,
@@ -236,11 +248,11 @@ export function DraggableGrid<T>({
236
248
  onDragMove: _onDragMove,
237
249
  onDragMoveEnd: _onDragMoveEnd,
238
250
  ...rest
239
- }: DraggableGridProps<T>) {
251
+ }: DraggableGridProps<T, K>) {
240
252
  const keyToItem = useMemo(() => {
241
- const keyToItem = new Map<Key, T>()
253
+ const keyToItem = new Map<K, T>()
242
254
  items.forEach(item => {
243
- const key = keyExtractor ? keyExtractor(item) : (item as Key)
255
+ const key = keyExtractor ? keyExtractor(item) : (item as unknown as K)
244
256
  keyToItem.set(key, item)
245
257
  })
246
258
  return keyToItem
@@ -269,7 +281,7 @@ export function DraggableGrid<T>({
269
281
  })
270
282
 
271
283
  /** 拖拽中的元素 */
272
- const [dragging, setDragging] = useState<DraggingItem | undefined>(undefined)
284
+ const [dragging, setDragging] = useState<DraggingItem<K> | undefined>(undefined)
273
285
 
274
286
  const { current: cache } = useRef({
275
287
  orders,
@@ -321,7 +333,7 @@ export function DraggableGrid<T>({
321
333
  else onOrderMapChange?.(keyToOrder)
322
334
  }, [orderMap, keyToOrder, onOrderMapChange])
323
335
 
324
- function onDragMoveStart(key: Key, event: DragMoveEvent<HTMLDivElement>) {
336
+ function onDragMoveStart(key: K, event: DragMoveEvent<HTMLDivElement>) {
325
337
  _onDragMoveStart?.(event)
326
338
  const position = getPosition({ order: keyToOrder.get(key)!, columns, gapX, gapY, itemWidth, itemHeight })
327
339
  recent.current = key
@@ -423,7 +435,7 @@ export function DraggableGrid<T>({
423
435
  setDragging(undefined)
424
436
  }
425
437
 
426
- function isItemDisabled(key: Key) {
438
+ function isItemDisabled(key: K) {
427
439
  if (!_isItemDisabled) return false
428
440
  if (Array.isArray(_isItemDisabled)) return _isItemDisabled.includes(key)
429
441
  return _isItemDisabled(keyToItem.get(key)!, key)