@rainbow-oh/yee-c 0.8.2 → 0.8.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.
Files changed (123) hide show
  1. package/dist/cjs/Form/form-store.js +3 -0
  2. package/dist/cjs/Input/style/index.less +1 -0
  3. package/dist/cjs/Select/interface.d.ts +1 -1
  4. package/dist/cjs/Selector/style/index.less +1 -0
  5. package/dist/cjs/Table/icon/arrow-icon.js +1 -1
  6. package/dist/cjs/Table/theader/cell.js +6 -3
  7. package/dist/cjs/TextArea/style/index.less +1 -0
  8. package/dist/cjs/VerificationCode/style/index.less +1 -0
  9. package/dist/cjs/hooks/useCountdown.d.ts +2 -1
  10. package/dist/cjs/hooks/useCountdown.js +46 -23
  11. package/dist/cjs/locale/interface.d.ts +3 -0
  12. package/dist/cjs/locale/lang/en_US.js +4 -1
  13. package/dist/cjs/locale/lang/ja_JP.js +4 -1
  14. package/dist/cjs/locale/lang/zh_CN.js +4 -1
  15. package/dist/cjs/locale/lang/zh_TW.js +4 -1
  16. package/dist/cjs/message/demo/base.js +1 -1
  17. package/dist/cjs/message/index.d.ts +1 -1
  18. package/dist/cjs/message/interface.d.ts +16 -7
  19. package/dist/cjs/message/message-provider.d.ts +2 -1
  20. package/dist/cjs/message/message-provider.js +1 -1
  21. package/dist/cjs/message/message.js +14 -9
  22. package/dist/cjs/message/style/index.less +3 -1
  23. package/dist/cjs/message/use-message.d.ts +3 -12
  24. package/dist/cjs/message/use-message.js +103 -45
  25. package/dist/cjs/message/wrapper.d.ts +21 -27
  26. package/dist/cjs/message/wrapper.js +49 -19
  27. package/dist/cjs/notice/index.d.ts +1 -1
  28. package/dist/cjs/notice/interface.d.ts +17 -7
  29. package/dist/cjs/notice/notice-list.d.ts +3 -3
  30. package/dist/cjs/notice/notice-provider.d.ts +2 -1
  31. package/dist/cjs/notice/notice-provider.js +1 -1
  32. package/dist/cjs/notice/notice.js +63 -20
  33. package/dist/cjs/notice/style/index.less +13 -1
  34. package/dist/cjs/notice/use-notice.d.ts +2 -11
  35. package/dist/cjs/notice/use-notice.js +156 -71
  36. package/dist/cjs/notice/wrapper.d.ts +19 -15
  37. package/dist/cjs/notice/wrapper.js +122 -52
  38. package/dist/cjs/style/size.css +3 -3
  39. package/dist/cjs/style/themes.css +1 -1
  40. package/dist/cjs/style/variables.css +4 -4
  41. package/dist/cjs/version.d.ts +1 -1
  42. package/dist/cjs/version.js +1 -1
  43. package/dist/esm/Form/form-store.js +25 -17
  44. package/dist/esm/Input/style/index.less +1 -0
  45. package/dist/esm/Select/interface.d.ts +1 -1
  46. package/dist/esm/Selector/style/index.less +1 -0
  47. package/dist/esm/Table/icon/arrow-icon.js +1 -1
  48. package/dist/esm/Table/theader/cell.js +7 -3
  49. package/dist/esm/TextArea/style/index.less +1 -0
  50. package/dist/esm/VerificationCode/style/index.less +1 -0
  51. package/dist/esm/hooks/useCountdown.d.ts +2 -1
  52. package/dist/esm/hooks/useCountdown.js +44 -14
  53. package/dist/esm/locale/interface.d.ts +3 -0
  54. package/dist/esm/locale/lang/en_US.js +4 -1
  55. package/dist/esm/locale/lang/ja_JP.js +4 -1
  56. package/dist/esm/locale/lang/zh_CN.js +4 -1
  57. package/dist/esm/locale/lang/zh_TW.js +4 -1
  58. package/dist/esm/message/demo/base.js +4 -1
  59. package/dist/esm/message/index.d.ts +1 -1
  60. package/dist/esm/message/interface.d.ts +16 -7
  61. package/dist/esm/message/message-provider.d.ts +2 -1
  62. package/dist/esm/message/message-provider.js +1 -1
  63. package/dist/esm/message/message.js +22 -9
  64. package/dist/esm/message/style/index.less +3 -1
  65. package/dist/esm/message/use-message.d.ts +3 -12
  66. package/dist/esm/message/use-message.js +129 -79
  67. package/dist/esm/message/wrapper.d.ts +21 -27
  68. package/dist/esm/message/wrapper.js +60 -18
  69. package/dist/esm/notice/index.d.ts +1 -1
  70. package/dist/esm/notice/interface.d.ts +17 -7
  71. package/dist/esm/notice/notice-list.d.ts +3 -3
  72. package/dist/esm/notice/notice-provider.d.ts +2 -1
  73. package/dist/esm/notice/notice-provider.js +1 -1
  74. package/dist/esm/notice/notice.js +73 -21
  75. package/dist/esm/notice/style/index.less +13 -1
  76. package/dist/esm/notice/use-notice.d.ts +2 -11
  77. package/dist/esm/notice/use-notice.js +180 -100
  78. package/dist/esm/notice/wrapper.d.ts +19 -15
  79. package/dist/esm/notice/wrapper.js +144 -62
  80. package/dist/esm/style/size.css +3 -3
  81. package/dist/esm/style/themes.css +1 -1
  82. package/dist/esm/style/variables.css +4 -4
  83. package/dist/esm/version.d.ts +1 -1
  84. package/dist/esm/version.js +1 -1
  85. package/dist/umd/yee-c.min.css +2 -2
  86. package/dist/umd/yee-c.min.js +1 -1
  87. package/package.json +1 -1
  88. package/src/Form/form-store.ts +5 -0
  89. package/src/Input/style/index.less +1 -0
  90. package/src/Select/interface.ts +1 -1
  91. package/src/Selector/style/index.less +1 -0
  92. package/src/Table/icon/arrow-icon.tsx +1 -1
  93. package/src/Table/theader/cell.tsx +6 -3
  94. package/src/TextArea/style/index.less +1 -0
  95. package/src/VerificationCode/style/index.less +1 -0
  96. package/src/hooks/useCountdown.ts +52 -21
  97. package/src/locale/interface.ts +3 -0
  98. package/src/locale/lang/en_US.ts +3 -0
  99. package/src/locale/lang/ja_JP.ts +3 -0
  100. package/src/locale/lang/zh_CN.ts +3 -0
  101. package/src/locale/lang/zh_TW.ts +3 -0
  102. package/src/message/demo/base.tsx +1 -1
  103. package/src/message/index.ts +1 -1
  104. package/src/message/interface.ts +22 -7
  105. package/src/message/message-provider.tsx +3 -2
  106. package/src/message/message.test.tsx +283 -0
  107. package/src/message/message.tsx +14 -9
  108. package/src/message/style/index.less +3 -1
  109. package/src/message/use-message.tsx +144 -67
  110. package/src/message/wrapper.tsx +62 -20
  111. package/src/notice/index.en-US.md +76 -75
  112. package/src/notice/index.ts +6 -1
  113. package/src/notice/index.zh-CN.md +3 -2
  114. package/src/notice/interface.ts +31 -14
  115. package/src/notice/notice-list.tsx +3 -9
  116. package/src/notice/notice-provider.tsx +3 -2
  117. package/src/notice/notice.test.tsx +450 -0
  118. package/src/notice/notice.tsx +69 -21
  119. package/src/notice/style/index.less +13 -1
  120. package/src/notice/use-notice.tsx +210 -94
  121. package/src/notice/wrapper.tsx +159 -71
  122. package/src/style/size.css +3 -3
  123. package/src/version.ts +1 -1
@@ -1,35 +1,70 @@
1
1
  import React from 'react';
2
2
  import { createRoot, Root } from 'react-dom/client';
3
- import { NoticeConfig, NoticeType, WrapperedNoticeConfig } from './interface';
3
+ import {
4
+ NoticeClose,
5
+ NoticeConfig,
6
+ NoticeType,
7
+ PlacementType,
8
+ WrapperedNoticeConfig,
9
+ } from './interface';
4
10
  import NoticeList from './notice-list';
5
11
 
6
- type PlacementType =
7
- | 'topLeft'
8
- | 'topRight'
9
- | 'bottomLeft'
10
- | 'bottomRight'
11
- | 'top'
12
- | 'bottom';
12
+ const noop: NoticeClose = () => {};
13
+
14
+ const invokeOnClose = (notices: NoticeType[]) => {
15
+ const errors: unknown[] = [];
16
+
17
+ notices.forEach((notice) => {
18
+ try {
19
+ notice.onClose?.();
20
+ } catch (error) {
21
+ errors.push(error);
22
+ }
23
+ });
24
+
25
+ errors.forEach((error) => {
26
+ const reportError = (
27
+ globalThis as typeof globalThis & {
28
+ reportError?: (reportedError: unknown) => void;
29
+ }
30
+ ).reportError;
31
+ if (reportError) {
32
+ reportError(error);
33
+ } else {
34
+ console.error(error);
35
+ }
36
+ });
37
+ };
13
38
 
14
39
  class NoticeWrapper {
15
40
  roots: Map<PlacementType, Root>;
16
41
  containers: Map<PlacementType, HTMLElement>;
17
42
  notices: Map<PlacementType, NoticeType[]>;
43
+ generationByKey: Map<string | number, number>;
44
+ generation: number;
45
+ timerGeneration: number;
18
46
 
19
47
  constructor() {
20
48
  this.roots = new Map();
21
49
  this.containers = new Map();
22
50
  this.notices = new Map();
51
+ this.generationByKey = new Map();
52
+ this.generation = 0;
53
+ this.timerGeneration = 0;
54
+ this.destroy = this.destroy.bind(this);
23
55
  }
24
56
 
25
57
  uuid(): string {
26
- return crypto.randomUUID
27
- ? crypto.randomUUID()
28
- : 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
29
- const r = (Math.random() * 16) | 0;
30
- const v = c === 'x' ? r : (r & 0x3) | 0x8;
31
- return v.toString(16);
32
- });
58
+ const randomUUID = globalThis.crypto?.randomUUID?.();
59
+ if (randomUUID) {
60
+ return randomUUID;
61
+ }
62
+
63
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
64
+ const r = (Math.random() * 16) | 0;
65
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
66
+ return v.toString(16);
67
+ });
33
68
  }
34
69
 
35
70
  private createContainer(placement: PlacementType): HTMLElement {
@@ -44,49 +79,52 @@ class NoticeWrapper {
44
79
 
45
80
  private cleanupContainer(placement: PlacementType) {
46
81
  const container = this.containers.get(placement);
47
- if (container && container.parentNode) {
82
+ if (container?.parentNode) {
48
83
  container.parentNode.removeChild(container);
49
- this.containers.delete(placement);
50
84
  }
85
+ this.containers.delete(placement);
51
86
  }
52
87
 
53
88
  unmount(placement?: PlacementType) {
54
- if (placement) {
55
- const root = this.roots.get(placement);
56
- if (root) {
57
- root.unmount();
58
- this.roots.delete(placement);
59
- this.cleanupContainer(placement);
60
- this.notices.delete(placement);
61
- }
62
- } else {
63
- // Clean up all
64
- this.roots.forEach((root, placement) => {
65
- root.unmount();
66
- this.cleanupContainer(placement);
67
- });
89
+ const placements = placement
90
+ ? [placement]
91
+ : Array.from(this.notices.keys());
92
+ const removed = placements.flatMap((item) => this.notices.get(item) || []);
93
+
94
+ placements.forEach((item) => {
95
+ this.roots.get(item)?.unmount();
96
+ this.roots.delete(item);
97
+ this.cleanupContainer(item);
98
+ this.notices.delete(item);
99
+ });
100
+
101
+ if (!placement) {
68
102
  this.roots.clear();
69
103
  this.containers.clear();
70
- this.notices.clear();
71
104
  }
105
+
106
+ removed.forEach((item) => {
107
+ this.generationByKey.delete(item.key);
108
+ });
109
+ invokeOnClose(removed);
72
110
  }
73
111
 
74
112
  render(placement: PlacementType) {
75
- const notices = this.notices.get(placement) || [];
113
+ if (typeof document === 'undefined') {
114
+ return;
115
+ }
76
116
 
117
+ const notices = this.notices.get(placement) || [];
77
118
  if (notices.length === 0) {
78
- const root = this.roots.get(placement);
79
- if (root) {
80
- root.unmount();
81
- this.roots.delete(placement);
82
- this.cleanupContainer(placement);
83
- }
119
+ this.roots.get(placement)?.unmount();
120
+ this.roots.delete(placement);
121
+ this.cleanupContainer(placement);
122
+ this.notices.delete(placement);
84
123
  return;
85
124
  }
86
125
 
87
126
  const container = this.createContainer(placement);
88
127
  let root = this.roots.get(placement);
89
-
90
128
  if (!root) {
91
129
  root = createRoot(container);
92
130
  this.roots.set(placement, root);
@@ -96,53 +134,102 @@ class NoticeWrapper {
96
134
  <NoticeList
97
135
  items={notices}
98
136
  placement={placement}
99
- onDestroy={(key) => this.destroy(key, placement)}
137
+ onDestroy={this.destroy}
100
138
  />,
101
139
  );
102
140
  }
103
141
 
104
- show(params: WrapperedNoticeConfig) {
105
- const placement = params.placement || 'topRight';
106
-
107
- if (!params.key) {
108
- params.key = this.uuid();
142
+ show(params: WrapperedNoticeConfig): NoticeClose {
143
+ if (typeof document === 'undefined') {
144
+ return noop;
109
145
  }
110
146
 
111
- const notices = this.notices.get(placement) || [];
112
- const existIndex = notices.findIndex((item) => item.key === params.key);
147
+ const placement = params.placement ?? 'topRight';
148
+ const key = params.key ?? this.uuid();
149
+ const keyGeneration =
150
+ this.generationByKey.get(key) ?? this.generation++;
151
+ this.generationByKey.set(key, keyGeneration);
113
152
 
114
- if (existIndex >= 0) {
115
- notices[existIndex] = params as NoticeType;
153
+ const affectedPlacements = new Set<PlacementType>([placement]);
154
+ this.notices.forEach((items, currentPlacement) => {
155
+ if (
156
+ currentPlacement !== placement &&
157
+ items.some((item) => item.key === key)
158
+ ) {
159
+ this.notices.set(
160
+ currentPlacement,
161
+ items.filter((item) => item.key !== key),
162
+ );
163
+ affectedPlacements.add(currentPlacement);
164
+ }
165
+ });
166
+
167
+ const currentNotices = this.notices.get(placement) || [];
168
+ const existingIndex = currentNotices.findIndex((item) => item.key === key);
169
+ const nextNotice = {
170
+ ...params,
171
+ key,
172
+ placement,
173
+ timerGeneration: this.timerGeneration++,
174
+ } as NoticeType;
175
+ const nextNotices = currentNotices.filter((item) => item.key !== key);
176
+
177
+ if (existingIndex >= 0) {
178
+ nextNotices.splice(existingIndex, 0, nextNotice);
116
179
  } else {
117
- notices.push(params as NoticeType);
180
+ nextNotices.push(nextNotice);
118
181
  }
119
182
 
120
- this.notices.set(placement, notices);
121
- this.render(placement);
183
+ this.notices.set(placement, nextNotices);
184
+ affectedPlacements.forEach((item) => this.render(item));
185
+
186
+ return () => {
187
+ if (this.generationByKey.get(key) === keyGeneration) {
188
+ this.destroy(key);
189
+ }
190
+ };
122
191
  }
123
192
 
124
- destroy(key: string | number, placement?: PlacementType) {
125
- if (placement) {
126
- const notices = this.notices.get(placement) || [];
127
- const filtered = notices.filter((item) => item.key !== key);
128
- this.notices.set(placement, filtered);
129
- this.render(placement);
130
- } else {
131
- // Find and remove in all placements
132
- this.notices.forEach((notices, p) => {
133
- const filtered = notices.filter((item) => item.key !== key);
134
- this.notices.set(p, filtered);
135
- this.render(p);
136
- });
193
+ destroy(key: string | number, expectedTimerGeneration?: number) {
194
+ let target: NoticeType | undefined;
195
+ this.notices.forEach((items) => {
196
+ target ??= items.find((item) => item.key === key);
197
+ });
198
+
199
+ if (
200
+ !target ||
201
+ (expectedTimerGeneration !== undefined &&
202
+ target.timerGeneration !== expectedTimerGeneration)
203
+ ) {
204
+ return;
137
205
  }
206
+
207
+ const affectedPlacements = new Set<PlacementType>();
208
+ this.notices.forEach((items, placement) => {
209
+ if (items.some((item) => item.key === key)) {
210
+ this.notices.set(
211
+ placement,
212
+ items.filter((item) => item.key !== key),
213
+ );
214
+ affectedPlacements.add(placement);
215
+ }
216
+ });
217
+
218
+ this.generationByKey.delete(key);
219
+ affectedPlacements.forEach((item) => this.render(item));
220
+ target.onClose?.();
221
+ }
222
+
223
+ clear(placement?: PlacementType) {
224
+ this.unmount(placement);
138
225
  }
139
226
 
140
227
  open(params: string | NoticeConfig) {
141
- this.show(typeof params === 'string' ? { content: params } : params);
228
+ return this.show(typeof params === 'string' ? { content: params } : params);
142
229
  }
143
230
 
144
231
  info(params: string | NoticeConfig) {
145
- this.show(
232
+ return this.show(
146
233
  typeof params === 'string'
147
234
  ? { status: 'info', content: params }
148
235
  : { ...params, status: 'info' },
@@ -150,7 +237,7 @@ class NoticeWrapper {
150
237
  }
151
238
 
152
239
  success(params: string | NoticeConfig) {
153
- this.show(
240
+ return this.show(
154
241
  typeof params === 'string'
155
242
  ? { status: 'success', content: params }
156
243
  : { ...params, status: 'success' },
@@ -158,7 +245,7 @@ class NoticeWrapper {
158
245
  }
159
246
 
160
247
  warning(params: string | NoticeConfig) {
161
- this.show(
248
+ return this.show(
162
249
  typeof params === 'string'
163
250
  ? { status: 'warning', content: params }
164
251
  : { ...params, status: 'warning' },
@@ -166,7 +253,7 @@ class NoticeWrapper {
166
253
  }
167
254
 
168
255
  error(params: string | NoticeConfig) {
169
- this.show(
256
+ return this.show(
170
257
  typeof params === 'string'
171
258
  ? { status: 'error', content: params }
172
259
  : { ...params, status: 'error' },
@@ -187,4 +274,5 @@ export const notice = {
187
274
  warning: noticeWrapper.warning.bind(noticeWrapper),
188
275
  error: noticeWrapper.error.bind(noticeWrapper),
189
276
  destroy: noticeWrapper.destroy.bind(noticeWrapper),
277
+ clear: noticeWrapper.clear.bind(noticeWrapper),
190
278
  };
@@ -323,9 +323,9 @@
323
323
  --yee-menu-submenu-vertical-top: -4px;
324
324
 
325
325
  /* --Message-- */
326
- --yee-message-gap: 8px;
327
- --yee-message-padding: 12px 16px;
328
- --yee-message-border-radius: 4px;
326
+ --yee-message-gap: 6px;
327
+ --yee-message-padding: 9px 12px;
328
+ --yee-message-border-radius: 8px;
329
329
  --yee-message-box-shadow: 0 8px 24px 0 var(--yee-box-shadow-color);
330
330
  --yee-message-icon-size: 20px;
331
331
  --yee-message-list-top: 24px;
package/src/version.ts CHANGED
@@ -4,7 +4,7 @@ declare global {
4
4
  }
5
5
  }
6
6
 
7
- export const version = "0.8.2";
7
+ export const version = "0.8.4";
8
8
 
9
9
  if (typeof window !== 'undefined') {
10
10
  window.__yee_c_version__ = version;