|
19 | 19 | - [x] Real gear photo analysis via Claude Vision API (with mock fallback) |
20 | 20 | - [x] Fischer and Evosports Nordic sizing models with FA Value |
21 | 21 | - [x] Range vs single size display toggle (per-session + default in Settings) |
| 22 | +- [x] Square UI (all rounded corners removed globally) |
22 | 23 |
|
23 | 24 | ## Next Up |
24 | 25 | - [x] Persist skill levels per member in database |
|
37 | 38 | - [ ] Age-specific sizing adjustments for children |
38 | 39 | - [ ] Growth projections for kids (next season sizing) |
39 | 40 | - [ ] Waist width recommendations for alpine skis |
| 41 | +- [ ] Binding safety check — warn when DIN setting is outside safe range for user's weight/skill |
| 42 | +- [ ] Multi-brand sizing comparison view when adding gear |
| 43 | +- [ ] Equipment lifespan tracking based on condition progression |
| 44 | +- [ ] Stance width measurement guide (visual diagram) |
| 45 | +- [ ] Coach/instructor notes on family member profiles |
| 46 | +- [ ] Ski base condition analyzer — take a photo of the bottom of a ski and use Claude Vision to determine if it needs waxing, base grinding, edge sharpening, or base repair (ptex fill) |
40 | 47 |
|
41 | 48 | ## Technical Debt |
42 | 49 | - [x] Code-split Firebase to reduce bundle size — chunks exceed 500KB after minification (currently 680KB), use dynamic imports |
43 | 50 | - [ ] Add E2E tests with Playwright |
44 | 51 | - [x] Increase test coverage to 80%+ for branches/functions — 88% stmts, 82% branches, 86% functions, 90% lines (516 tests) |
| 52 | +- [ ] Increase PhotoCapture test coverage (currently 38.2% — lowest in codebase) |
| 53 | +- [ ] Extract GEAR_TYPE_LABELS and SPORT_LABELS to a shared constants file (currently duplicated across GearCard, MemberDetail, SettingsScreen, etc.) |
| 54 | +- [ ] Add useMemo to MemberDetail sizingCards calculation (recalculates on every render) |
45 | 55 |
|
46 | 56 | ## Known Issues |
47 | 57 |
|
|
50 | 60 | - [x] photos/extendedDetails fields lost on Firestore read — was already fixed in `docToGearItem()` |
51 | 61 | - [x] No user-scoped Firebase queries — was already fixed in `getAllFamilyMembers()` and `getAllGearItems()` |
52 | 62 | - [x] status/location/checkedOutTo/checkedOutDate lost on Firestore read — fixed in `docToGearItem()` (PR #39) |
| 63 | +- [ ] `getGearItemsByOwner()` not filtered by userId — queries by ownerId only, not `userId + ownerId`; a user could fetch another user's gear if they know the ownerId (`src/services/firebase.ts`) |
| 64 | + |
| 65 | +### High |
| 66 | +- [ ] Boot unit preference (MP/EU/US) resets on every visit — `bootUnit` state in MemberDetail is local and not persisted in AppSettings |
| 67 | +- [ ] Hockey skate fallback size formula wrong — `MemberInfoTable.tsx:55` uses `footLength * 1.5 + 2 - 32` fallback instead of `getShoeSizesFromFootLength()` from shoeSize service |
53 | 68 |
|
54 | 69 | ### Medium |
55 | 70 | - [x] Negative/zero size values after conversion — MemberDetail now guards against footLength <= 0 |
|
58 | 73 | - [x] Missing Firebase env var validation — `src/config/firebase.ts` now throws with clear error listing missing vars |
59 | 74 | - [ ] No account linking flow — users get stuck signing in with Google after creating email account with same address |
60 | 75 | - [ ] No offline error handling — Firebase operations show raw errors when offline |
| 76 | +- [ ] Year field in GearForm accepts invalid values (0, negative, far future) — needs validation to 1980–current year + 1 |
| 77 | +- [ ] GearForm numeric fields (tip/waist/tail profile) use parseFloat/parseInt without isNaN guard — NaN silently stored on submit |
| 78 | +- [ ] Foot measurement bounds not validated — MemberForm accepts values outside reasonable range (12–30 cm) |
61 | 79 |
|
62 | 80 | ### Low |
63 | 81 | - [x] `parseFloat(value) || undefined` treats 0 as undefined — optional numeric fields now use `e.target.value === '' ? undefined : parseFloat()` |
|
68 | 86 | - [x] No loading state for gear operations — gear delete/submit in App.tsx show no loading indicators; mutations now catch errors and surface a dismissible toast |
69 | 87 | - [x] Race condition in useAuth — `setLoading(false)` and `setError()` now guarded by mounted ref |
70 | 88 | - [ ] No email verification on signup — email accounts created without verifying address |
| 89 | +- [ ] Hockey skate width thresholds (0.36, 0.40) hardcoded without source documentation (`sizing.ts:653`) |
| 90 | +- [ ] Firestore timestamp conversion drops nanoseconds (`firebase.ts:32`) — minor precision loss |
71 | 91 |
|
72 | 92 | ## Notes |
73 | 93 | - App URL: https://gearguru-b3bc8.web.app |
|
0 commit comments