@ihabdevteam/core 0.9.9 → 0.9.10

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.
@@ -6990,6 +6990,8 @@ export declare function useComboboxSuggestions({ value, onChange, suggestions, o
6990
6990
  */
6991
6991
  export declare function useDailyTrainingSelection(userId?: string): {
6992
6992
  loaded: boolean;
6993
+ /** 뽑을 것이 실제로 있었나. loaded 만으로는 "포기했다" 와 가를 수 없다. */
6994
+ hasData: boolean;
6993
6995
  showYesterday: boolean;
6994
6996
  setShowYesterday: Dispatch<SetStateAction<boolean>>;
6995
6997
  getTrainingPerType: (typeKey: string) => TrainingItem[] | undefined;
@@ -11,6 +11,8 @@ import type { TrainingItem } from '../types/training';
11
11
  */
12
12
  export declare function useDailyTrainingSelection(userId?: string): {
13
13
  loaded: boolean;
14
+ /** 뽑을 것이 실제로 있었나. loaded 만으로는 "포기했다" 와 가를 수 없다. */
15
+ hasData: boolean;
14
16
  showYesterday: boolean;
15
17
  setShowYesterday: import("react").Dispatch<import("react").SetStateAction<boolean>>;
16
18
  getTrainingPerType: (typeKey: string) => TrainingItem[] | undefined;
@@ -24,6 +24,11 @@ export function useDailyTrainingSelection(userId) {
24
24
  // 선택으로 갱신되지만 화면은 익명 선택을 계속 보여준다(실측: 모두가 같은 묶음을 받음).
25
25
  // 계산이 끝날 때마다 올리는 이 값이 리렌더를 보장한다.
26
26
  const [revision, setRevision] = useState(0);
27
+ // loaded 는 "시도를 그만뒀다" 는 뜻이지 "자료가 있다" 는 뜻이 아니다 — 10초 뒤 포기할
28
+ // 때도 true 가 된다. 그러면 부르는 쪽은 **"아직 자료가 없다" 와 "오늘 훈련이 없다" 를
29
+ // 가를 수가 없어** 설명 없는 빈 화면을 그리게 된다(실제로 그런 화면이 있다).
30
+ // loaded 의 뜻을 바꾸면 지금 쓰는 곳이 깨지므로, 가를 수 있는 값을 따로 낸다.
31
+ const [hasData, setHasData] = useState(false);
27
32
  useEffect(() => {
28
33
  let cancelled = false;
29
34
  let timer;
@@ -44,6 +49,7 @@ export function useDailyTrainingSelection(userId) {
44
49
  todayRef.current = sel.today;
45
50
  yesterdayRef.current = sel.yesterday;
46
51
  setLoaded(true);
52
+ setHasData(true);
47
53
  setRevision(n => n + 1);
48
54
  cancelled = true;
49
55
  stop();
@@ -72,8 +78,11 @@ export function useDailyTrainingSelection(userId) {
72
78
  return;
73
79
  }
74
80
  // 데이터가 끝내 차지 않으면 일정 시도 후 중단(빈 선택이라도 로딩 종료)
81
+ // 포기한다. hasData 를 반드시 false 로 되돌린다 — userId 가 바뀌어 다시 돌 때,
82
+ // 앞 사람 것이 성공했다면 true 로 남아 있어 "자료가 있다" 고 거짓말하게 된다.
75
83
  if (++attempts >= MAX_ATTEMPTS) {
76
84
  setLoaded(true);
85
+ setHasData(false);
77
86
  cancelled = true;
78
87
  stop();
79
88
  }
@@ -90,5 +99,10 @@ export function useDailyTrainingSelection(userId) {
90
99
  : (fallback?.[typeKey]?.length ? fallback[typeKey] : undefined);
91
100
  return pick;
92
101
  }, [showYesterday, revision]);
93
- return { loaded, showYesterday, setShowYesterday, getTrainingPerType };
102
+ return {
103
+ loaded,
104
+ /** 뽑을 것이 실제로 있었나. loaded 만으로는 "포기했다" 와 가를 수 없다. */
105
+ hasData,
106
+ showYesterday, setShowYesterday, getTrainingPerType,
107
+ };
94
108
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihabdevteam/core",
3
- "version": "0.9.9",
3
+ "version": "0.9.10",
4
4
  "private": false,
5
5
  "main": "dist/ihabdevteam-core.cjs.js",
6
6
  "module": "dist/ihabdevteam-core.esm.js",
@@ -111,6 +111,7 @@
111
111
  "preview-playground": "vite preview --outDir playground/dist",
112
112
  "smoke-test": "node ./scripts/smoke-test.js",
113
113
  "audit:exports": "node ./scripts/audit-exports.cjs",
114
+ "audit:docs": "node ./scripts/audit-docs.cjs",
114
115
  "analyze:bundle": "node ./scripts/analyze-bundle.cjs",
115
116
  "pack:check": "bash ./scripts/publish-check.sh",
116
117
  "check:size": "size-limit",