generated from LASER-Yi/frontend-template
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
129 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,79 @@ | ||
import { RetireVersion } from "@/constants"; | ||
import { useLocalStorage } from "@mantine/hooks"; | ||
import { getTimeNum } from "./time"; | ||
import { useInterval, useLocalStorage } from "@mantine/hooks"; | ||
import { useMemo, useState } from "react"; | ||
import { getTotalHours, timeUtilities } from "./time"; | ||
|
||
export function useSaveData() { | ||
return useLocalStorage<SaveData>({ | ||
key: "retire-save-data", | ||
defaultValue: { | ||
version: RetireVersion, | ||
edited: false, | ||
work: { | ||
start: getTimeNum(9, 0), | ||
end: getTimeNum(18, 0), | ||
workTime: { | ||
start: timeUtilities.serialize({ hour: 9, minute: 0, second: 0 }), | ||
end: timeUtilities.serialize({ hour: 18, minute: 0, second: 0 }), | ||
}, | ||
enabled_break: false, | ||
break: { | ||
start: getTimeNum(12, 0), | ||
end: getTimeNum(13, 0), | ||
breakTime: { | ||
start: timeUtilities.serialize({ hour: 12, minute: 0, second: 0 }), | ||
end: timeUtilities.serialize({ hour: 13, minute: 0, second: 0 }), | ||
}, | ||
salary: 0, | ||
working_days: 20, | ||
}, | ||
}); | ||
} | ||
|
||
export function useLiveTime() { | ||
const [time, setTime] = useState<Time>(() => { | ||
const date = new Date(); | ||
return { | ||
hour: date.getHours(), | ||
minute: date.getMinutes(), | ||
second: date.getSeconds(), | ||
}; | ||
}); | ||
|
||
useInterval(() => { | ||
// TODO: optimize this | ||
const date = new Date(); | ||
setTime({ | ||
hour: date.getHours(), | ||
minute: date.getMinutes(), | ||
second: date.getSeconds(), | ||
}); | ||
}, 1 * 1000); | ||
|
||
return time; | ||
} | ||
|
||
export function useStatistics() { | ||
const [saveData] = useSaveData(); | ||
|
||
return useMemo(() => { | ||
const { workTime, breakTime, enabled_break, salary, working_days } = | ||
saveData; | ||
|
||
const salaryPerDay = salary / working_days; | ||
|
||
const workingHours = getTotalHours( | ||
timeUtilities.deserialize(workTime.start), | ||
timeUtilities.deserialize(workTime.end) | ||
); | ||
|
||
const breakHours = getTotalHours( | ||
timeUtilities.deserialize(breakTime.start), | ||
timeUtilities.deserialize(breakTime.end) | ||
); | ||
|
||
const effectiveWorkingHours = | ||
workingHours - (enabled_break ? breakHours : 0.0); | ||
|
||
return { | ||
salaryPerDay, | ||
workingHours, | ||
effectiveWorkingHours, | ||
breakHours, | ||
}; | ||
}, [saveData]); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,41 @@ | ||
export function getTime(num: number): Time { | ||
const hour = num % 60; | ||
const minute = Math.floor(num / 60); | ||
export const timeUtilities = { | ||
serialize: (time: Time): number => { | ||
return toMinutes(time); | ||
}, | ||
deserialize: (inValue: number): Time => { | ||
const hour = inValue % 60; | ||
const minute = Math.floor(inValue / 60); | ||
|
||
return { hour, minute }; | ||
return { hour, minute, second: 0 }; | ||
}, | ||
}; | ||
|
||
export function toSeconds(time: Time): number { | ||
const hourToSec = time.hour * 60 * 60; | ||
const minuteToSec = time.minute * 60; | ||
return hourToSec + minuteToSec + time.second; | ||
} | ||
|
||
export function toMinutes(time: Time): number { | ||
const hourToMin = time.hour * 60; | ||
const secondToMin = time.second / 60; | ||
return hourToMin + time.minute + secondToMin; | ||
} | ||
|
||
export function toHours(time: Time): number { | ||
const minuteToHour = time.minute / 60; | ||
const secondToHour = time.second / 60 / 60; | ||
return time.hour + minuteToHour + secondToHour; | ||
} | ||
|
||
export function getTotalSeconds(from: Time, to: Time): number { | ||
return toSeconds(from) - toSeconds(to); | ||
} | ||
|
||
export function getTimeNumber(time: Time): number { | ||
return time.hour * 60 + time.minute; | ||
export function getTotalMinutes(from: Time, to: Time): number { | ||
return toMinutes(to) - toMinutes(from); | ||
} | ||
|
||
export function getTimeNum(hour: number, minute: number): number { | ||
return getTimeNumber({ hour, minute }); | ||
export function getTotalHours(from: Time, to: Time): number { | ||
return toHours(from) - toHours(to); | ||
} |