Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e168d12
refactor: consolidate ConnectView user profile state management
google-labs-jules[bot] Feb 22, 2026
409f5dc
refactor: consolidate ConnectView user profile state management
google-labs-jules[bot] Feb 22, 2026
0f24244
refactor: consolidate ConnectView user profile state management
google-labs-jules[bot] Feb 22, 2026
c78814d
refactor: consolidate user profile state management in ConnectView
google-labs-jules[bot] Feb 22, 2026
31a89d1
refactor: further refine user profile state management
google-labs-jules[bot] Feb 22, 2026
2131620
refactor: finalize user profile state management refactor
google-labs-jules[bot] Feb 22, 2026
ca83e42
refactor: address reviewer feedback on height initialization
google-labs-jules[bot] Feb 22, 2026
069c269
refactor: consolidate tests and address reviewer feedback
google-labs-jules[bot] Feb 22, 2026
52386c7
refactor: consolidate user profile state and tests
google-labs-jules[bot] Feb 22, 2026
02a1eba
test: add unit tests for useConnectUserProfile hook
google-labs-jules[bot] Feb 22, 2026
1f5f474
fix: resolve linting issues in Connect tests
google-labs-jules[bot] Feb 22, 2026
bb0bd05
Refactor ConnectView user profile state management
google-labs-jules[bot] Feb 22, 2026
fe99f5e
Refactor ConnectView user profile state management (v2)
google-labs-jules[bot] Feb 22, 2026
28531b8
Fix linting and weight unit regression in ConnectView refactor
google-labs-jules[bot] Feb 22, 2026
84cef33
Finalize ConnectView profile state refactor with full test coverage
google-labs-jules[bot] Feb 22, 2026
0d7010c
Refactor ConnectView profile state management (v2.3)
google-labs-jules[bot] Feb 22, 2026
559ce23
Refactor ConnectView profile state management (v2.4)
google-labs-jules[bot] Feb 22, 2026
711649c
Refactor ConnectView profile state management (v2.5)
google-labs-jules[bot] Feb 22, 2026
c212444
Refactor ConnectView profile state management (v2.6)
google-labs-jules[bot] Feb 22, 2026
f689ccf
Refactor ConnectView profile state management (v2.7)
google-labs-jules[bot] Feb 22, 2026
920a530
Refactor ConnectView profile state management (v2.8)
google-labs-jules[bot] Feb 22, 2026
e15c871
Refactor ConnectView profile state management (v2.9)
google-labs-jules[bot] Feb 22, 2026
8675228
Refactor ConnectView profile state management (v2.10)
google-labs-jules[bot] Feb 22, 2026
d724884
Refactor ConnectView profile state management (v2.11)
google-labs-jules[bot] Feb 22, 2026
9bb1c84
Refactor ConnectView profile state management (v2.12)
google-labs-jules[bot] Feb 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 0 additions & 122 deletions app/client/connect/ConnectView.test.tsx

This file was deleted.

137 changes: 17 additions & 120 deletions app/client/connect/ConnectView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,42 +19,13 @@ import WorkoutControls from './WorkoutControls'
import ResetSection from './components/ResetSection'
import { useState, useEffect } from 'react'
import logger from '@/utils/logger'
import { MeasurementSystem, Gender } from '../../../types/core'
import { WorkoutStatus } from '../../../types/workout'
import { HeartRateZone } from '../../../lib/shared/hr-zones'
import {
ToggleButtonGroup,
ToggleButton,
FormControl,
FormLabel,
RadioGroup,
FormControlLabel,
Radio,
} from '@mui/material'
import { UserProfileState, HrZoneData } from '@/types/connect'

interface ConnectViewProps {
duration: string
caloriesBurned: number
userName: string
setUserName: (name: string) => void
userAge: string
setUserAge: (age: string) => void
onAgeBlur: () => void
ageError: string | null
userHeight: { cm: string; feet: string; inches: string }
setUserHeight: (
height: Partial<{ cm: string; feet: string; inches: string }>
) => void
onHeightBlur: () => void
heightError: string | null
userWeight: string
setUserWeight: (weight: string) => void
onWeightBlur: () => void
weightError: string | null
gender: Gender
setGender: (gender: Gender) => void
unitSystem: MeasurementSystem
onUnitChange: (unit: MeasurementSystem) => void
userProfile: UserProfileState
isConnected: boolean
isDataStale?: boolean
deviceStatus: string
Expand All @@ -65,8 +36,7 @@ interface ConnectViewProps {
isSupported: boolean
signalPeriodMs: number
currentHR: number
hrZoneProps: { percentage: number }
zone: HeartRateZone
hrZoneData: HrZoneData
connectionStatus: string
bluetoothConnected: boolean
hasStarted: boolean
Expand All @@ -80,24 +50,7 @@ interface ConnectViewProps {
export default function ConnectView({
duration,
caloriesBurned,
userName,
setUserName,
userAge,
setUserAge,
onAgeBlur,
ageError,
userHeight,
setUserHeight,
onHeightBlur,
heightError,
userWeight,
setUserWeight,
onWeightBlur,
weightError,
gender,
setGender,
unitSystem,
onUnitChange,
userProfile,
isConnected,
isDataStale = false,
deviceStatus,
Expand All @@ -108,8 +61,7 @@ export default function ConnectView({
isSupported,
signalPeriodMs,
currentHR,
hrZoneProps,
zone,
hrZoneData,
connectionStatus,
bluetoothConnected,
hasStarted,
Expand All @@ -120,15 +72,16 @@ export default function ConnectView({
onEndWorkout,
}: ConnectViewProps) {
const [isResetting, setIsResetting] = useState(false)
const { data } = userProfile

useEffect(() => {
if (isConnected) {
logger.debug(
{ currentHR, isDataStale, userName },
{ currentHR, isDataStale, userName: data.userName },
'HrTile rendering with currentHR'
)
}
}, [currentHR, isConnected, isDataStale, userName])
}, [currentHR, isConnected, isDataStale, data.userName])

const getBatteryIcon = (level: number) => {
if (level > 90) return <BatteryFullIcon color="success" />
Expand Down Expand Up @@ -178,63 +131,7 @@ export default function ConnectView({
</Typography>

{!showUserDetails ? (
<Stack spacing={2} sx={{ mb: 3 }}>
<ToggleButtonGroup
value={unitSystem}
exclusive
onChange={(_e, newUnit) => newUnit && onUnitChange(newUnit)}
aria-label="measurement system"
fullWidth
>
<ToggleButton value="IMPERIAL" aria-label="imperial">
Imperial (lbs)
</ToggleButton>
<ToggleButton value="METRIC" aria-label="metric">
Metric (kg)
</ToggleButton>
</ToggleButtonGroup>

<UserSettings
userName={userName}
setUserName={setUserName}
userAge={userAge}
setUserAge={setUserAge}
onAgeBlur={onAgeBlur}
ageError={ageError}
userHeight={userHeight}
setUserHeight={setUserHeight}
onHeightBlur={onHeightBlur}
heightError={heightError}
userWeight={userWeight}
setUserWeight={setUserWeight}
onWeightBlur={onWeightBlur}
weightError={weightError}
unit={unitSystem}
setUnit={onUnitChange}
/>

<FormControl component="fieldset">
<FormLabel component="legend">Gender</FormLabel>
<RadioGroup
row
aria-label="gender"
name="gender"
value={gender}
onChange={(e) => setGender(e.target.value as Gender)}
>
<FormControlLabel
value="MALE"
control={<Radio />}
label="Male"
/>
<FormControlLabel
value="FEMALE"
control={<Radio />}
label="Female"
/>
</RadioGroup>
</FormControl>
</Stack>
<UserSettings profile={userProfile} />
) : (
<Box
sx={{
Expand All @@ -250,10 +147,10 @@ export default function ConnectView({
Connected as
</Typography>
<Typography variant="h5" fontWeight="bold">
{userName}
{data.userName}
</Typography>
<Typography variant="body2" color="text.secondary">
Age: {userAge}
Age: {data.userAge}
</Typography>
</Box>
)}
Expand All @@ -277,8 +174,8 @@ export default function ConnectView({
size="large"
onClick={onConnect}
disabled={
!userName.trim() ||
!userAge.trim() ||
!data.userName.trim() ||
!data.userAge.trim() ||
deviceStatus.includes('Connecting')
}
>
Expand Down Expand Up @@ -349,12 +246,12 @@ export default function ConnectView({
)}

{isConnected && (
<Box sx={{ mt: 2 }}>
<Box sx={{ mt: 2 }} data-testid="hr-tile">
<HrTile
name={userName}
name={data.userName}
value={currentHR}
percentage={hrZoneProps.percentage}
zone={zone}
percentage={hrZoneData.percentage}
zone={hrZoneData.zone}
calories={caloriesBurned}
isDataStale={isDataStale}
/>
Expand Down
Loading
Loading