@ihabdevteam/core 0.9.0 → 0.9.2

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.
@@ -230,8 +230,10 @@ export type { ConfirmPopupProps } from './components/Popup/ConfirmPopup';
230
230
  export { default as CouponInputPopup } from './components/Popup/CouponInputPopup';
231
231
  export type { CouponInputPopupProps } from './components/Popup/CouponInputPopup';
232
232
  export { default as MenuTooltip } from './components/Tooltip/MenuTooltip';
233
+ export { default as InfoTooltip } from './components/Tooltip/InfoTooltip';
233
234
  export { default as TooltipInfo } from './components/Tooltip/InfoTooltip';
234
235
  export { default as DescriptionTooltip } from './components/Tooltip/DescriptionTooltip';
236
+ export { default as TextBoxTooltip } from './components/Tooltip/TextBoxTooltip';
235
237
  export { default as TooltipTextBox } from './components/Tooltip/TextBoxTooltip';
236
238
  export { default as TrainingTooltip, TRAINING_TOOLTIP_HOVER_DELAY_MS } from './components/Tooltip/TrainingTooltip';
237
239
  export type { TooltipTrainingProps } from './components/Tooltip/TrainingTooltip';
@@ -164,10 +164,18 @@ export { default as ListPopup } from './components/Popup/ListPopup';
164
164
  export { default as ConfirmPopup } from './components/Popup/ConfirmPopup';
165
165
  export { default as CouponInputPopup } from './components/Popup/CouponInputPopup';
166
166
  export { default as MenuTooltip } from './components/Tooltip/MenuTooltip';
167
+ export { default as InfoTooltip } from './components/Tooltip/InfoTooltip';
168
+ /* 배럴 이름이 파일명과 뒤집혀 있었다(TooltipInfo). 소비자가 그것을 알아채고
169
+ `import { TooltipInfo as InfoTooltip }` 로 도로 바꿔 쓰고 있었다 — 이름이 틀렸다는
170
+ 가장 분명한 증거다. 파일명·형제 컴포넌트(DescriptionTooltip, MenuTooltip)와 맞췄다.
171
+ 옛 이름은 깨뜨리지 않으려고 남겨둔다. 소비자가 다 옮기면 지운다. */
167
172
  export { default as TooltipInfo } from './components/Tooltip/InfoTooltip';
168
173
  /* 제목 + 사유 목록을 띄우는 툴팁. 컴포넌트는 진작 있었는데 배럴에 없어 소비자가
169
174
  쓸 수 없었다(어드민이 '왜 재생성 권고인지'를 이걸로 알린다). */
170
175
  export { default as DescriptionTooltip } from './components/Tooltip/DescriptionTooltip';
176
+ export { default as TextBoxTooltip } from './components/Tooltip/TextBoxTooltip';
177
+ /* 같은 까닭. 이쪽은 옛 이름을 쓰는 소비자가 한 곳도 없어(실측 0건) 원래는 그냥
178
+ 바꿔도 됐지만, 짝이 되는 InfoTooltip 과 다르게 다룰 까닭이 없어 나란히 남긴다. */
171
179
  export { default as TooltipTextBox } from './components/Tooltip/TextBoxTooltip';
172
180
  export { default as TrainingTooltip, TRAINING_TOOLTIP_HOVER_DELAY_MS } from './components/Tooltip/TrainingTooltip';
173
181
  export { default as EffectPartyPopper } from './components/Effect/EffectPartyPopper';
@@ -18,6 +18,12 @@ export function useDailyTrainingSelection(userId) {
18
18
  const yesterdayRef = useRef(null);
19
19
  const [loaded, setLoaded] = useState(false);
20
20
  const [showYesterday, setShowYesterday] = useState(false);
21
+ // 선택을 ref 에 담으면 바뀌어도 리렌더가 없다. loaded 만으로는 신호가 안 되는데,
22
+ // 두 번째 이후 계산에서는 이미 true 라 setLoaded(true) 가 그대로 빠져나가기 때문이다.
23
+ // 그 경우가 로그인 직후다: userId 가 undefined → 실제 id 로 바뀌면 refs 는 그 사람의
24
+ // 선택으로 갱신되지만 화면은 익명 선택을 계속 보여준다(실측: 모두가 같은 묶음을 받음).
25
+ // 계산이 끝날 때마다 올리는 이 값이 리렌더를 보장한다.
26
+ const [revision, setRevision] = useState(0);
21
27
  useEffect(() => {
22
28
  let cancelled = false;
23
29
  let timer;
@@ -38,6 +44,7 @@ export function useDailyTrainingSelection(userId) {
38
44
  todayRef.current = sel.today;
39
45
  yesterdayRef.current = sel.yesterday;
40
46
  setLoaded(true);
47
+ setRevision(n => n + 1);
41
48
  cancelled = true;
42
49
  stop();
43
50
  };
@@ -82,6 +89,6 @@ export function useDailyTrainingSelection(userId) {
82
89
  ? src[typeKey]
83
90
  : (fallback?.[typeKey]?.length ? fallback[typeKey] : undefined);
84
91
  return pick;
85
- }, [showYesterday]);
92
+ }, [showYesterday, revision]);
86
93
  return { loaded, showYesterday, setShowYesterday, getTrainingPerType };
87
94
  }
@@ -26,16 +26,23 @@ export function useVisitAllPanel(mergedVisits) {
26
26
  return true;
27
27
  }), [mergedVisits, vapSearch, vapStatus]);
28
28
  const vapTotal = Math.max(1, Math.ceil(vapFiltered.length / Number(vapPageSize)));
29
- // 필터/검색으로 결과가 줄면 현재 페이지가페이지를 초과해 화면이 슬라이스 시 clamp
29
+ // 결과가 줄면 지금 쪽이쪽수를 넘는다. 자르는 자리에서는 진작 조이고 있었는데
30
+ // **돌려주는 vapPage 는 날것이었다** — 그래서 쪽 표시에 그대로 넣으면 "3 / 1" 처럼
31
+ // 없는 쪽이 떴다. 찾기 칸은 그 자리에서 쪽을 1로 되돌려 줘서 가려져 있었고, 목록이
32
+ // 밖에서 줄어드는 길(다른 고객으로 바뀜·서버가 다시 준 목록)에서 드러났다.
33
+ //
34
+ // 상태는 손대지 않고 돌려주는 값만 조인다. 상태는 "어디로 가려 했나"(의도)이고
35
+ // 돌려주는 값은 "지금 어디인가"(사실)다. 그래서 setVapPage 의 뜻이 안 바뀌어
36
+ // 소비자를 깨뜨리지 않고, 줄었다 늘어나면 원래 보던 쪽으로 돌아온다.
37
+ const vapPageClamped = Math.min(vapPage, vapTotal);
30
38
  const vapPageItems = useMemo(() => {
31
- const page = Math.min(vapPage, vapTotal);
32
- return vapFiltered.slice((page - 1) * Number(vapPageSize), page * Number(vapPageSize));
33
- }, [vapFiltered, vapPage, vapPageSize, vapTotal]);
39
+ return vapFiltered.slice((vapPageClamped - 1) * Number(vapPageSize), vapPageClamped * Number(vapPageSize));
40
+ }, [vapFiltered, vapPageClamped, vapPageSize]);
34
41
  return {
35
42
  vapSearch, setVapSearch,
36
43
  vapPageSize, setVapPageSize,
37
44
  vapStatus, setVapStatus,
38
- vapPage, setVapPage,
45
+ vapPage: vapPageClamped, setVapPage,
39
46
  vapFiltered,
40
47
  vapTotal,
41
48
  vapPageItems,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihabdevteam/core",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "private": false,
5
5
  "main": "dist/ihabdevteam-core.cjs.js",
6
6
  "module": "dist/ihabdevteam-core.esm.js",