SIGN IN SIGN UP

refactor: convert CoursewareContainer to TypeScript (#2021)

Rename src/courseware/CoursewareContainer.jsx → .tsx with the minimum annotations
to compile. No behavior change; fast-follow to the de-class (#2008/#2020) so the
courseware React Query peels happen in TS-land.

- state: RootState on the inline useSelectors
- useRef<any> for the two loose refs (mirrored props + memoized guards); reselect
  infers the redirect helpers + createSelector selectors, so no annotations there
- courseStatus asserted `as CourseStatus` at the read (a valid CourseStatus from its
  source); courseId coerced `?? undefined` only at the TabPage prop, since the
  effect's ids-mismatch bail needs courseId to stay string | null
- dispatch stays plain useDispatch(); no typed-dispatch primitive added — typed
  thunk dispatch would only serve the Redux being removed

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
B
Brian Smith committed
020a3eebf9fddc86956d187c4e128624cc4a2f48
Parent: a3a4bcf
Committed by GitHub <noreply@github.com> on 8/24/2026, 11:00:03 PM