@@ -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+
5990function 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
69100export 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