Skip to content

Commit 428ca63

Browse files
committed
new logic to set recommended level on home screen
1 parent 9229a33 commit 428ca63

1 file changed

Lines changed: 50 additions & 8 deletions

File tree

src/App.tsx

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,37 @@ function getRecommendation(levelConfig: LevelConfig, totalMistakes: number): num
5656
return levelConfig.level;
5757
}
5858

59+
function getStoredSessionRecommendation(progress: AppProgress): number | null {
60+
const lastSession = progress.sessions[progress.sessions.length - 1];
61+
if (!lastSession) {
62+
return null;
63+
}
64+
65+
const levelConfig = LEVELS.find((entry) => entry.level === lastSession.level);
66+
if (!levelConfig) {
67+
return null;
68+
}
69+
70+
return getRecommendation(levelConfig, lastSession.totalMistakes);
71+
}
72+
73+
function isKnownLevel(level: number | undefined): level is number {
74+
return typeof level === "number" && LEVELS.some((entry) => entry.level === level);
75+
}
76+
77+
function getInitialSelectedLevel(progress: AppProgress, selectedRank: string): number {
78+
const sessionRecommendation = getStoredSessionRecommendation(progress);
79+
if (sessionRecommendation !== null) {
80+
return sessionRecommendation;
81+
}
82+
83+
if (isKnownLevel(progress.lastSelectedLevel)) {
84+
return progress.lastSelectedLevel;
85+
}
86+
87+
return getRecommendedStartLevel(selectedRank);
88+
}
89+
5990
function getRecommendationLabel(currentLevel: number, recommendedLevel: number) {
6091
if (recommendedLevel > currentLevel) {
6192
return "Level up" as const;
@@ -68,16 +99,16 @@ function getRecommendationLabel(currentLevel: number, recommendedLevel: number)
6899

69100
export default function App() {
70101
const initialProgress = useMemo(() => loadProgress(), []);
102+
const initialRank = initialProgress.lastSelectedRank ?? "15 kyu";
103+
const initialSessionRecommendation = getStoredSessionRecommendation(initialProgress);
71104
const [progress, setProgress] = useState<AppProgress>(initialProgress);
72105
const [appState, setAppState] = useState<AppState>("home");
73-
const [selectedRank, setSelectedRank] = useState<string>(
74-
initialProgress.lastSelectedRank ?? "15 kyu",
75-
);
106+
const [selectedRank, setSelectedRank] = useState<string>(initialRank);
76107
const [selectedLevel, setSelectedLevel] = useState<number>(
77-
initialProgress.lastSelectedLevel &&
78-
LEVELS.some((entry) => entry.level === initialProgress.lastSelectedLevel)
79-
? initialProgress.lastSelectedLevel
80-
: getRecommendedStartLevel("15 kyu"),
108+
getInitialSelectedLevel(initialProgress, initialRank),
109+
);
110+
const [useSessionRecommendation, setUseSessionRecommendation] = useState(
111+
initialSessionRecommendation !== null,
81112
);
82113
const [session, setSession] = useState<TrainingSession | null>(null);
83114
const [selectedStoneColor, setSelectedStoneColor] = useState<"black" | "white">("black");
@@ -142,11 +173,21 @@ export default function App() {
142173
return () => window.clearInterval(timer);
143174
}, [appState]);
144175

145-
const recommendedLevel = useMemo(
176+
const rankRecommendedLevel = useMemo(
146177
() => getRecommendedStartLevel(selectedRank),
147178
[selectedRank],
148179
);
149180

181+
const storedSessionRecommendation = useMemo(
182+
() => getStoredSessionRecommendation(progress),
183+
[progress],
184+
);
185+
186+
const recommendedLevel =
187+
useSessionRecommendation && storedSessionRecommendation !== null
188+
? storedSessionRecommendation
189+
: rankRecommendedLevel;
190+
150191
const currentLevelConfig = useMemo(
151192
() => getLevelConfig(selectedLevel),
152193
[selectedLevel],
@@ -171,6 +212,7 @@ export default function App() {
171212
function handleRankChange(rank: string): void {
172213
setSelectedRank(rank);
173214
const recommended = getRecommendedStartLevel(rank);
215+
setUseSessionRecommendation(false);
174216
setSelectedLevel(recommended);
175217
setProgress((current) => ({
176218
...current,

0 commit comments

Comments
 (0)