diff --git a/app/renderer/components/break.tsx b/app/renderer/components/break.tsx index 0732d0c8..2ac5a98e 100644 --- a/app/renderer/components/break.tsx +++ b/app/renderer/components/break.tsx @@ -183,6 +183,7 @@ export default function Break() { breakMessage={settings.breakMessage} breakTitle={settings.breakTitle} endBreakEnabled={settings.endBreakEnabled} + returnFromBreakEnabled={settings.returnFromBreakEnabled} onEndBreak={handleEndBreak} settings={settings} textColor={settings.textColor} diff --git a/app/renderer/components/break/break-progress.tsx b/app/renderer/components/break/break-progress.tsx index 3df47fa5..b912e9d4 100644 --- a/app/renderer/components/break/break-progress.tsx +++ b/app/renderer/components/break/break-progress.tsx @@ -9,6 +9,7 @@ interface BreakProgressProps { breakMessage: string; breakTitle: string; endBreakEnabled: boolean; + returnFromBreakEnabled: boolean; onEndBreak: () => void; settings: Settings; textColor: string; @@ -20,6 +21,7 @@ export function BreakProgress({ breakMessage, breakTitle, endBreakEnabled, + returnFromBreakEnabled, onEndBreak, settings, textColor, @@ -76,25 +78,30 @@ export function BreakProgress({ const now = moment(); if (now > moment(breakEndTime)) { - // Always track break completion, regardless of which window triggers it - const breakDurationMs = - new Date().getTime() - breakStartTime.getTime(); - ipcRenderer.invokeCompleteBreakTracking(breakDurationMs); - - onEndBreak(); - return; + if(!returnFromBreakEnabled) { + // Always track break completion, regardless of which window triggers it + const breakDurationMs = + new Date().getTime() - breakStartTime.getTime(); + ipcRenderer.invokeCompleteBreakTracking(breakDurationMs); + + onEndBreak(); + return; + } else { + setProgress(1); + } } - - const msRemaining = moment(breakEndTime).diff(now, "milliseconds"); - setProgress(1 - msRemaining / startMsRemaining); - setTimeRemaining({ - hours: Math.floor(msRemaining / 1000 / 3600), - minutes: Math.floor(msRemaining / 1000 / 60), - seconds: (msRemaining / 1000) % 60, - }); - - if (!isClosingRef.current) { - timeoutId = setTimeout(tick, 50); + else { + const msRemaining = moment(breakEndTime).diff(now, "milliseconds"); + setProgress(1 - msRemaining / startMsRemaining); + setTimeRemaining({ + hours: Math.floor(msRemaining / 1000 / 3600), + minutes: Math.floor(msRemaining / 1000 / 60), + seconds: (msRemaining / 1000) % 60, + }); + + if (!isClosingRef.current) { + timeoutId = setTimeout(tick, 50); + } } }; @@ -107,6 +114,7 @@ export function BreakProgress({ } }; }, [ + returnFromBreakEnabled, onEndBreak, settings, breakStartTime, @@ -149,9 +157,26 @@ export function BreakProgress({ borderColor: "rgba(255, 255, 255, 0.2)", }} > - {progress < 0.5 ? "Cancel Break" : "End Break"} + {returnFromBreakEnabled && progress == 1 ? "I'm back" : (progress < 0.5 ? "Cancel Break" : "End Break")} )} + {!endBreakEnabled && returnFromBreakEnabled && progress == 1 && ( + + + + )} {/* Break message */} diff --git a/app/renderer/components/settings/advanced-card.tsx b/app/renderer/components/settings/advanced-card.tsx index 2eb2e1ef..284b72ee 100644 --- a/app/renderer/components/settings/advanced-card.tsx +++ b/app/renderer/components/settings/advanced-card.tsx @@ -35,6 +35,16 @@ export default function AdvancedCard({ /> + +
+ + onSwitchChange("returnFromBreakEnabled", checked) + } + /> + +
); diff --git a/app/types/settings.ts b/app/types/settings.ts index 9d0a171f..e6b85d8a 100644 --- a/app/types/settings.ts +++ b/app/types/settings.ts @@ -57,6 +57,7 @@ export interface Settings { showBackdrop: boolean; backdropOpacity: number; endBreakEnabled: boolean; + returnFromBreakEnabled: boolean; skipBreakEnabled: boolean; postponeBreakEnabled: boolean; immediatelyStartBreaks: boolean; @@ -118,6 +119,7 @@ export const defaultSettings: Settings = { showBackdrop: true, backdropOpacity: 0.7, endBreakEnabled: true, + returnFromBreakEnabled: false, skipBreakEnabled: false, postponeBreakEnabled: true, immediatelyStartBreaks: false,