import { useState } from 'react'; import { INJURY_TRACKERS, TRACKED_GRADE_SCALE, capGradeAtMax, getGradeScore, } from '../utils/weekUtils'; import './SessionLog.css'; const SESSION_TYPES = { lead: 'Lead', bouldering: 'Bouldering', }; function getDuringPain(session, trackerKey) { return session[`${trackerKey}_during`] ?? session[`${trackerKey}_pain`] ?? ''; } function getAfterPain(session, trackerKey) { return session[`${trackerKey}_after`] ?? ''; } function SessionLog({ sessions, onEditSession, onDeleteSession }) { const [editingId, setEditingId] = useState(null); const [editForm, setEditForm] = useState({}); if (!sessions || sessions.length === 0) { return (
No climbing sessions logged yet. Add your first one above.
| Date | Type | Routes | Max Grade | RPE | Load | Injury (D/A) | Notes | |
|---|---|---|---|---|---|---|---|---|
| setEditForm({ ...editForm, date: event.target.value })} onKeyDown={handleKeyDown} /> | setEditForm({ ...editForm, routes_count: event.target.value })} onKeyDown={handleKeyDown} /> | setEditForm({ ...editForm, max_grade: event.target.value })} onBlur={() => setEditForm((prev) => ({ ...prev, max_grade: capGradeAtMax(prev.max_grade) }))} list={`grade-scale-list-${session.id}`} onKeyDown={handleKeyDown} placeholder="e.g. 6B+ (max 7B)" /> | setEditForm({ ...editForm, rpe: event.target.value })} onKeyDown={handleKeyDown} /> | {(previewRoutes * previewRpe).toFixed(0)} |
{INJURY_TRACKERS.map((tracker) => (
))}
|
setEditForm({ ...editForm, notes: event.target.value })} onKeyDown={handleKeyDown} placeholder="Notes..." /> | ||
| {formatDate(session.date)} | {formatSessionType(session.session_type)} | {session.routes_count} | {session.max_grade || '—'} | {session.rpe}/10 | {(session.routes_count * session.rpe).toFixed(0)} |
LE: {session.left_elbow_during ?? session.left_elbow_pain ?? '—'}/{session.left_elbow_after ?? '—'}
RS: {session.right_shoulder_during ?? session.right_shoulder_pain ?? '—'}/{session.right_shoulder_after ?? '—'}
|
{session.notes || ''} |