Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 5 additions & 3 deletions apps/frontend/src/components/ActionBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from 'react-bootstrap-icons';
import { useNavigate } from 'react-router-dom';
import { hrColor, powerColor } from '../colors';
import { useActiveWorkout } from '../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../context/ActiveWorkoutSessionContext';
import { useHeartRateMonitor } from '../context/HeartRateContext';
import { useSmartTrainer } from '../context/SmartTrainerContext';
import { useUser } from '../context/UserContext';
Expand All @@ -26,7 +26,7 @@ import { settingUpProfile } from '@dundring/utils';
export const ActionBar = () => {
const { user } = useUser();
const { activeGroupSession } = useWebsocket();
const { activeWorkout } = useActiveWorkout();
const { activeWorkoutSession } = useActiveWorkoutSession();
const linkColor = useLinkColor();
const navigate = useNavigate();

Expand Down Expand Up @@ -119,7 +119,9 @@ export const ActionBar = () => {
<ActionBarItem
text="Open workout editor"
icon={
<Icon as={activeWorkout.workout ? BarChartLineFill : BarChartLine} />
<Icon
as={activeWorkoutSession.workout ? BarChartLineFill : BarChartLine}
/>
}
onClick={() => navigate('/workout')}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
InputRightAddon,
Tooltip,
} from '@chakra-ui/react';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';
import { useSmartTrainer } from '../../context/SmartTrainerContext';
import {
ftpPercentFromWatt,
Expand All @@ -25,7 +25,7 @@ interface PowerInputData {
}

export const PowerControlInput = () => {
const { activeFtp } = useActiveWorkout();
const { activeFtp } = useActiveWorkoutSession();
const {
isConnected: smartTrainerIsConnected,
setResistance: setSmartTrainerResistance,
Expand Down
4 changes: 2 additions & 2 deletions apps/frontend/src/components/MainActionBar/PowerControls.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { Center, Grid, Stack, Text, Tooltip } from '@chakra-ui/react';
import { useSmartTrainer } from '../../context/SmartTrainerContext';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';
import { PowerControlButton } from './PowerControlButton';
import { PowerControlInput } from './PowerControlInput';

export const PowerControls = () => {
const { isConnected: smartTrainerIsConnected } = useSmartTrainer();

const { activeFtp } = useActiveWorkout();
const { activeFtp } = useActiveWorkoutSession();

const controlValues = [1, 5, 10, -1, -5, -10];
return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
Tooltip,
} from '@chakra-ui/react';
import { LightningChargeFill } from 'react-bootstrap-icons';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';
import { useSmartTrainer } from '../../context/SmartTrainerContext';
import { wattFromFtpPercent } from '../../utils/general';

Expand All @@ -22,7 +22,7 @@ export const QuickPowerButton = () => {
setResistance: setSmartTrainerResistance,
isConnected: smartTrainerIsConnected,
} = useSmartTrainer();
const { activeFtp } = useActiveWorkout();
const { activeFtp } = useActiveWorkoutSession();

return (
<Menu placement="top">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import { Icon, IconButton, Tooltip } from '@chakra-ui/react';
import { BarChartLine, BarChartLineFill } from 'react-bootstrap-icons';
import { useNavigate } from 'react-router-dom';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';

export const SelectWorkoutButton = () => {
const navigate = useNavigate();
const { activeWorkout } = useActiveWorkout();
const { activeWorkoutSession } = useActiveWorkoutSession();

const text = activeWorkout.workout ? 'Change workout' : 'Select workout';
const text = activeWorkoutSession.workout
? 'Change workout'
: 'Select workout';
return (
<Tooltip label={text}>
<IconButton
aria-label={text}
icon={
<Icon as={activeWorkout.workout ? BarChartLineFill : BarChartLine} />
<Icon
as={activeWorkoutSession.workout ? BarChartLineFill : BarChartLine}
/>
}
onClick={() => navigate('/workout')}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import * as api from '../../api';
import { useUser } from '../../context/UserContext';
import { ApiStatus } from '@dundring/types';
import { useState } from 'react';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';

export const UploadToStravaButton = () => {
const { data, distance } = useData();
const { user } = useUser();
const { activeWorkout } = useActiveWorkout();
const { activeWorkoutSession } = useActiveWorkoutSession();

const [state, setState] = useState<UploadState>({ type: 'NotAsked' });

Expand Down Expand Up @@ -53,7 +53,7 @@ export const UploadToStravaButton = () => {
.uploadActivity(
user.token,
toTcxString(data, distance),
activeWorkout.workout?.name ?? null
activeWorkoutSession.workout?.name ?? null
)
.then((response) => {
if (response.status === ApiStatus.FAILURE) {
Expand Down
48 changes: 27 additions & 21 deletions apps/frontend/src/components/MainActionBar/WorkoutControls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,15 @@ import {
SkipStartFill,
} from 'react-bootstrap-icons';
import { useNavigate } from 'react-router-dom';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';
import { useData } from '../../context/DataContext';
import { useWorkoutEditorModal } from '../../context/ModalContext';
import { useLinkColor } from '../../hooks/useLinkColor';
import { ActiveWorkout } from '../../types';
import { ActiveWorkoutSession } from '../../types';

const getPlayButtonText = (activeWorkout: ActiveWorkout) => {
if (!activeWorkout.workout) return 'No workout selected.';
const getPlayButtonText = (activeWorkoutSession: ActiveWorkoutSession) => {
if (!activeWorkoutSession.workout) return 'No workout selected.';

switch (activeWorkout.status) {
switch (activeWorkoutSession.status) {
case 'not_started':
return 'Start workout';
case 'paused':
Expand All @@ -40,15 +39,20 @@ const getPlayButtonText = (activeWorkout: ActiveWorkout) => {
}
};
export const WorkoutControls = () => {
const { activeWorkout, syncResistance, changeActivePart, pause, start } =
useActiveWorkout();
const {
activeWorkoutSession,
syncResistance,
changeActivePart,
pause,
start,
} = useActiveWorkoutSession();
const { addLap } = useData();
const linkColor = useLinkColor();
const navigate = useNavigate();

const isWorkoutSelected = activeWorkout.workout !== null;
const activeWorkoutPart = activeWorkout.activePart;
const playButtonText = getPlayButtonText(activeWorkout);
const isWorkoutSelected = activeWorkoutSession.workout !== null;
const activeWorkoutPart = activeWorkoutSession.activePart;
const playButtonText = getPlayButtonText(activeWorkoutSession);

return (
<Stack>
Expand Down Expand Up @@ -80,14 +84,14 @@ export const WorkoutControls = () => {
isDisabled={
!isWorkoutSelected ||
(activeWorkoutPart === 0 &&
activeWorkout.status !== 'finished')
activeWorkoutSession.status !== 'finished')
}
onClick={() => {
if (!activeWorkout.workout) return;
if (!activeWorkoutSession.workout) return;

if (activeWorkout.status === 'finished') {
if (activeWorkoutSession.status === 'finished') {
changeActivePart(
activeWorkout.workout.parts.length - 1,
activeWorkoutSession.workout.parts.length - 1,
addLap
);
return;
Expand All @@ -106,7 +110,7 @@ export const WorkoutControls = () => {
icon={<Icon as={SkipStartFill} />}
isDisabled={!isWorkoutSelected}
onClick={() => {
if (!activeWorkout.workout) return;
if (!activeWorkoutSession.workout) return;

changeActivePart(activeWorkoutPart, addLap);
}}
Expand All @@ -120,15 +124,17 @@ export const WorkoutControls = () => {
icon={
<Icon
as={
activeWorkout.status === 'active' ? PauseFill : PlayFill
activeWorkoutSession.status === 'active'
? PauseFill
: PlayFill
}
/>
}
isDisabled={!isWorkoutSelected}
onClick={() => {
if (!activeWorkout.workout) return;
if (!activeWorkoutSession.workout) return;

switch (activeWorkout.status) {
switch (activeWorkoutSession.status) {
case 'finished': {
changeActivePart(0, addLap);
return;
Expand All @@ -153,9 +159,9 @@ export const WorkoutControls = () => {
icon={<Icon as={SkipForwardFill} />}
isDisabled={!isWorkoutSelected}
onClick={() => {
if (!activeWorkout.workout) return;
if (!activeWorkoutSession.workout) return;

if (activeWorkout.status === 'finished') {
if (activeWorkoutSession.status === 'finished') {
changeActivePart(0, addLap);
} else {
changeActivePart(activeWorkoutPart + 1, addLap);
Expand Down
4 changes: 2 additions & 2 deletions apps/frontend/src/components/Modals/WorkoutEditorModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { Workout, WorkoutType } from '../../types';
import { WorkoutEditor } from '../WorkoutMenu/WorkoutEditor';
import { useUser } from '../../context/UserContext';
import { useWorkoutEditorModal } from '../../context/ModalContext';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';
import {
AlertDialog,
AlertDialogBody,
Expand All @@ -36,7 +36,7 @@ export const WorkoutEditorModal = () => {
const { refetchData: refetchUserData } = useUser();
const [workoutToEdit, setWorkoutToEdit] =
React.useState<WorkoutToEdit | null>(null);
const { setActiveWorkout } = useActiveWorkout();
const { setActiveWorkout } = useActiveWorkoutSession();
const [isWorkoutUnsaved, setIsWorkoutUnsaved] = React.useState(false);
const [showDiscardDialog, setShowDiscardDialog] = React.useState(false);
const cancelRef = React.useRef<HTMLButtonElement>(null);
Expand Down
8 changes: 4 additions & 4 deletions apps/frontend/src/components/TopBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import theme from '../theme';
import { useData } from '../context/DataContext';
import {
getRemainingTime,
useActiveWorkout,
} from '../context/ActiveWorkoutContext';
useActiveWorkoutSession,
} from '../context/ActiveWorkoutSessionContext';
import { secondsToHoursMinutesAndSecondsString } from '@dundring/utils';
import { Lap } from '../types';

Expand All @@ -19,9 +19,9 @@ const secondaryFontSize = ['m', 'xl', '2xl'];
export const TopBar = () => {
const { cadence, currentResistance } = useSmartTrainer();
const { heartRate } = useHeartRateMonitor();
const { activeWorkout } = useActiveWorkout();
const { activeWorkoutSession } = useActiveWorkoutSession();
const { data: laps, timeElapsed, distance, speed, smoothedPower } = useData();
const remainingTime = getRemainingTime(activeWorkout);
const remainingTime = getRemainingTime(activeWorkoutSession);

const secondsElapsed = Math.floor(timeElapsed / 1000);

Expand Down
9 changes: 5 additions & 4 deletions apps/frontend/src/components/WorkoutDisplay.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Text, Stack } from '@chakra-ui/layout';
import * as React from 'react';
import { useActiveWorkout } from '../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../context/ActiveWorkoutSessionContext';
import { useData } from '../context/DataContext';
import { Workout } from '../types';
import { wattFromFtpPercent } from '../utils/general';
Expand All @@ -10,13 +10,14 @@ import {
} from '@dundring/utils';

export const WorkoutDisplay = () => {
const { activeWorkout, activeFtp, changeActivePart } = useActiveWorkout();
const { activeWorkoutSession, activeFtp, changeActivePart } =
useActiveWorkoutSession();
const { addLap } = useData();
if (!activeWorkout.workout) {
if (!activeWorkoutSession.workout) {
return null;
}

const { activePart, status, partElapsedTime, workout } = activeWorkout;
const { activePart, status, partElapsedTime, workout } = activeWorkoutSession;

return (
<Stack fontSize="sm">
Expand Down
5 changes: 3 additions & 2 deletions apps/frontend/src/components/WorkoutMenu/WorkoutEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import {
Tr,
useToast,
} from '@chakra-ui/react';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';
import { createZoneTableInfo } from '../../utils/zones';
import {
getTotalWorkoutTime,
Expand Down Expand Up @@ -64,7 +64,8 @@ export const WorkoutEditor = ({
closeModal,
setIsWorkoutUnsaved,
}: Props) => {
const { activeFtp, setActiveFtp, setActiveWorkout } = useActiveWorkout();
const { activeFtp, setActiveFtp, setActiveWorkout } =
useActiveWorkoutSession();
const { user, saveLocalWorkout, deleteLocalWorkout } = useUser();
const toast = useToast();
const token = (user.loggedIn && user.token) || null;
Expand Down
7 changes: 4 additions & 3 deletions apps/frontend/src/components/WorkoutMenu/WorkoutOverview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { Divider, Stack } from '@chakra-ui/layout';
import { Center, Text, Icon, Select } from '@chakra-ui/react';
import * as React from 'react';
import { PencilSquare } from 'react-bootstrap-icons';
import { useActiveWorkout } from '../../context/ActiveWorkoutContext';
import { useActiveWorkoutSession } from '../../context/ActiveWorkoutSessionContext';
import { useUser } from '../../context/UserContext';
import { StoredWorkoutType, Workout } from '../../types';
import { parseInputAsInt } from '../../utils/general';
Expand All @@ -35,7 +35,8 @@ export const WorkoutOverview = ({
setActiveWorkout,
}: Props) => {
const { workouts, localWorkouts } = useUser();
const { activeWorkout, activeFtp, setActiveFtp } = useActiveWorkout();
const { activeWorkoutSession, activeFtp, setActiveFtp } =
useActiveWorkoutSession();
const [previewFtp, setPreviewFtp] = React.useState('' + activeFtp);
const previewFtpAsNumber = parseInputAsInt(previewFtp);
const { activeRoute, setActiveRoute } = useData();
Expand Down Expand Up @@ -76,7 +77,7 @@ export const WorkoutOverview = ({
Create new workout
</Button>
<EditCurrentWorkoutButton
currentWorkout={activeWorkout.workout}
currentWorkout={activeWorkoutSession.workout}
setWorkoutToEdit={setWorkoutToEdit}
allUserWorkouts={allUserWorkouts}
previewFtp={previewFtpAsNumber}
Expand Down
Loading