Skip to content

Commit

Permalink
Update timing logic (#465)
Browse files Browse the repository at this point in the history
* updated dependencies

* hour timing changes

* day timing changes

* Convert 7 day string to a week

* lint error fix
  • Loading branch information
GhostOf0days authored Mar 11, 2024
1 parent 5e47267 commit 0e6096c
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 50 deletions.
Binary file modified bun.lockb
Binary file not shown.
22 changes: 11 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
"@emotion/react": "^11.11.4",
"@emotion/styled": "^11.11.0",
"@million/lint": "latest",
"@mui/icons-material": "^5.15.11",
"@mui/material": "^5.15.11",
"@tanstack/react-query": "^5.24.7",
"@mui/icons-material": "^5.15.12",
"@mui/material": "^5.15.12",
"@tanstack/react-query": "^5.25.0",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/react": "^14.2.1",
"@testing-library/user-event": "^14.5.2",
"@types/bun": "^1.0.8",
"@types/material-ui": "^0.21.17",
"@types/react": "^18.2.61",
"@types/react": "^18.2.64",
"@types/react-router-dom": "^5.3.3",
"axios": "^1.6.7",
"css-loader": "^6.10.0",
Expand All @@ -30,7 +30,7 @@
"prettier-eslint-cli": "^8.0.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.22.2",
"react-router-dom": "^6.22.3",
"react-transition-group": "^4.4.5",
"serve": "^14.2.1",
"vitest": "^1.3.1",
Expand Down Expand Up @@ -65,13 +65,13 @@
]
},
"devDependencies": {
"bun-types": "^1.0.29",
"@happy-dom/global-registrator": "^13.6.2",
"bun-types": "^1.0.30",
"@happy-dom/global-registrator": "^13.7.1",
"@types/jest": "^29.5.12",
"@types/jsonwebtoken": "^9.0.6",
"@types/luxon": "^3.4.2",
"@typescript-eslint/eslint-plugin": "^7.1.0",
"@typescript-eslint/parser": "^7.1.0",
"@typescript-eslint/eslint-plugin": "^7.1.1",
"@typescript-eslint/parser": "^7.1.1",
"@vitejs/plugin-react": "^4.2.1",
"@vitejs/plugin-react-swc": "^3.6.0",
"@vitest/coverage-v8": "^1.3.1",
Expand All @@ -83,11 +83,11 @@
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react": "^7.34.0",
"eslint-plugin-react-hooks": "^4.6.0",
"jsdom": "^24.0.0",
"prettier": "^3.2.5",
"vite": "^5.1.4",
"vite": "^5.1.5",
"vite-plugin-checker": "^0.6.4",
"vite-plugin-pwa": "^0.19.2",
"vite-plugin-svgr": "^4.2.0",
Expand Down
4 changes: 1 addition & 3 deletions src/types/locationTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export interface ITimeSlotTime {
}

/**
* As far as I can tell, start and end are both inclusive in
* Start and end are both inclusive in
* denoting when a location is open. so [2AM today, 4AM today]
* includes both 2AM and 4AM. So, [2AM Tue,2AM Tue] is inferred to be open at exactly 2AM.
* Something like [2AM Tue, 1AM Tue] means open from 2AM Tue
Expand All @@ -29,8 +29,6 @@ export interface ITimeSlotTime {
* [Sat 10AM, Sun 12AM] = [day:6,hour:10 -> day:0, hour: 0]) (recall that Sunday has a day-value
* of 0 while Saturday has a day value of 6, so this is a wrap around) Any other time
* would be constrained to that day and possibly 12AM on the day after.
* @cirex-web author (I concluded some of the above after digging
* through the commit history of the Dining API)
*/
export interface ITimeSlot {
readonly start: ITimeSlotTime;
Expand Down
8 changes: 7 additions & 1 deletion src/util/queryLocations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,13 @@ export function getStatusMessage(
day = 'today';
}

const relTimeDiff = getApproximateTimeStringFromMinutes(diff);
let relTimeDiff = getApproximateTimeStringFromMinutes(diff);
const weekEdgeCase = Math.round(Math.floor(diff / 60) / 24);

if (weekEdgeCase === 7) {
relTimeDiff = 'a week';
}

if (relTimeDiff === '0 minutes') {
return `${action} now (${day} at ${time})`;
}
Expand Down
6 changes: 4 additions & 2 deletions src/util/time.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,11 @@ export function getApproximateTimeStringFromMinutes(minutes: number) {

let diff = minutes;
const minuteCount = diff % 60;
diff = Math.floor(diff / 60);
const hourCondition = Math.floor(diff / 60) > 23 || diff / 60 < 1;
diff = hourCondition ? Math.floor(diff / 60) : Math.round(diff / 60);
const hourCount = diff % 24;
diff = Math.floor(diff / 24);
const dayCondition = diff / 24 > 1;
diff = dayCondition ? Math.round(diff / 24) : Math.floor(diff / 24);
const dayCount = diff;
if (dayCount !== 0) return pluralTag`${dayCount} day`;
if (hourCount !== 0) return pluralTag`${hourCount} hour`;
Expand Down
62 changes: 31 additions & 31 deletions tests/util/queryLocations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ describe('queryLocations.ts', () => {
closedLongTerm: false,
isOpen: true,
locationState: LocationState.OPEN,
statusMsg: 'Closes in 3 days (Friday at 11:00 PM)',
statusMsg: 'Closes in 4 days (Friday at 11:00 PM)',
timeUntil: 3 * 1440 + 22 * 60,
});
expect(getLocationStatus([A, B], makeDateTime(5, 23, 1))).toEqual({
Expand Down Expand Up @@ -111,7 +111,7 @@ describe('queryLocations.ts', () => {
closedLongTerm: false,
isOpen: false,
locationState: LocationState.CLOSED,
statusMsg: 'Opens in 1 day (Tuesday at 12:00 AM)',
statusMsg: 'Opens in 2 days (Tuesday at 12:00 AM)',
timeUntil: 47 * 60,
});
});
Expand All @@ -120,117 +120,117 @@ describe('queryLocations.ts', () => {
const testCases: IGetStatusMessageTest[] = [
{
isOpen: false,
nextTime: { day: 2, hour: 2, minute: 2 },
now: { day: 2, hour: 2, minute: 3 },
expectedString: 'Opens in 6 days (Tuesday at 2:02 AM)',
nextTime: { day: 2, hour: 2, minute: 2 },
expectedString: 'Opens in a week (Tuesday at 2:02 AM)',
},
{
isOpen: false,
nextTime: { day: 3, hour: 2, minute: 2 },
now: { day: 2, hour: 2, minute: 3 },
expectedString: 'Opens in 23 hours (tomorrow at 2:02 AM)',
nextTime: { day: 3, hour: 2, minute: 2 },
expectedString: 'Opens in 1 day (tomorrow at 2:02 AM)',
},
{
isOpen: false,
nextTime: { day: 3, hour: 0, minute: 2 },
now: { day: 2, hour: 23, minute: 3 },
nextTime: { day: 3, hour: 0, minute: 2 },
expectedString: 'Opens in 59 minutes (tomorrow at 12:02 AM)',
},
{
isOpen: false,
nextTime: { day: 3, hour: 0, minute: 3 },
now: { day: 0, hour: 23, minute: 3 },
nextTime: { day: 3, hour: 0, minute: 3 },
expectedString: 'Opens in 2 days (Wednesday at 12:03 AM)',
},
{
isOpen: true,
nextTime: { day: 1, hour: 0, minute: 0 },
now: { day: 1, hour: 0, minute: 0 },
nextTime: { day: 1, hour: 0, minute: 0 },
expectedString: 'Closes now (today at 12:00 AM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 0, minute: 0 },
now: { day: 0, hour: 0, minute: 0 },
nextTime: { day: 1, hour: 0, minute: 0 },
expectedString: 'Opens in 1 day (tomorrow at 12:00 AM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 0, minute: 0 },
now: { day: 0, hour: 23, minute: 30 },
nextTime: { day: 1, hour: 0, minute: 0 },
expectedString: 'Opens in 30 minutes (tomorrow at 12:00 AM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 0, minute: 0 },
now: { day: 0, hour: 20, minute: 30 },
expectedString: 'Opens in 3 hours (tomorrow at 12:00 AM)',
nextTime: { day: 1, hour: 0, minute: 0 },
expectedString: 'Opens in 4 hours (tomorrow at 12:00 AM)',
},
{
isOpen: false,
nextTime: { day: 0, hour: 0, minute: 0 },
now: { day: 0, hour: 20, minute: 30 },
nextTime: { day: 0, hour: 0, minute: 0 },
expectedString: 'Opens in 6 days (Sunday at 12:00 AM)',
},
{
isOpen: false,
nextTime: { day: 0, hour: 20, minute: 0 },
now: { day: 0, hour: 0, minute: 30 },
expectedString: 'Opens in 19 hours (today at 8:00 PM)',
nextTime: { day: 0, hour: 20, minute: 0 },
expectedString: 'Opens in 20 hours (today at 8:00 PM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 2, minute: 0 },
now: { day: 0, hour: 0, minute: 30 },
nextTime: { day: 1, hour: 2, minute: 0 },
expectedString: 'Opens in 1 day (tomorrow at 2:00 AM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 5, minute: 0 },
now: { day: 0, hour: 0, minute: 30 },
nextTime: { day: 1, hour: 5, minute: 0 },
expectedString: 'Opens in 1 day (tomorrow at 5:00 AM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 5, minute: 1 },
now: { day: 0, hour: 0, minute: 30 },
nextTime: { day: 1, hour: 5, minute: 1 },
expectedString: 'Opens in 1 day (tomorrow at 5:01 AM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 6, minute: 0 },
now: { day: 0, hour: 0, minute: 30 },
nextTime: { day: 1, hour: 6, minute: 0 },
expectedString: 'Opens in 1 day (tomorrow at 6:00 AM)',
},
{
isOpen: false,
nextTime: { day: 0, hour: 20, minute: 0 },
now: { day: 0, hour: 19, minute: 30 },
nextTime: { day: 0, hour: 20, minute: 0 },
expectedString: 'Opens in 30 minutes (today at 8:00 PM)',
},
{
isOpen: false,
nextTime: { day: 0, hour: 20, minute: 0 },
now: { day: 0, hour: 20, minute: 0 },
nextTime: { day: 0, hour: 20, minute: 0 },
expectedString: 'Opens now (today at 8:00 PM)',
},
{
isOpen: false,
nextTime: { day: 1, hour: 5, minute: 0 },
now: { day: 0, hour: 19, minute: 30 },
expectedString: 'Opens in 9 hours (tomorrow at 5:00 AM)',
nextTime: { day: 1, hour: 5, minute: 0 },
expectedString: 'Opens in 10 hours (tomorrow at 5:00 AM)',
},
{
isOpen: false,
nextTime: { day: 5, hour: 8, minute: 0 },
now: { day: 4, hour: 23, minute: 59 },
nextTime: { day: 5, hour: 8, minute: 0 },
expectedString: 'Opens in 8 hours (tomorrow at 8:00 AM)',
},
{
isOpen: false,
nextTime: { day: 5, hour: 8, minute: 0 },
now: { day: 5, hour: 8, minute: 1 },
expectedString: 'Opens in 6 days (Friday at 8:00 AM)',
nextTime: { day: 5, hour: 8, minute: 0 },
expectedString: 'Opens in a week (Friday at 8:00 AM)',
},
{
isOpen: false,
Expand All @@ -242,7 +242,7 @@ describe('queryLocations.ts', () => {
isOpen: false,
now: { day: 6, hour: 13, minute: 0 },
nextTime: { day: 6, hour: 12, minute: 0 },
expectedString: 'Opens in 6 days (Saturday at 12:00 PM)',
expectedString: 'Opens in a week (Saturday at 12:00 PM)',
},
{
isOpen: false,
Expand All @@ -254,7 +254,7 @@ describe('queryLocations.ts', () => {
isOpen: false,
now: { day: 5, hour: 12, minute: 0 },
nextTime: { day: 0, hour: 8, minute: 0 },
expectedString: 'Opens in 1 day (Sunday at 8:00 AM)',
expectedString: 'Opens in 2 days (Sunday at 8:00 AM)',
},
{
isOpen: false,
Expand Down Expand Up @@ -290,13 +290,13 @@ describe('queryLocations.ts', () => {
isOpen: false,
now: { day: 6, hour: 10, minute: 28 },
nextTime: { day: 0, hour: 9, minute: 0 },
expectedString: 'Opens in 22 hours (tomorrow at 9:00 AM)',
expectedString: 'Opens in 23 hours (tomorrow at 9:00 AM)',
},
{
isOpen: false,
now: { day: 6, hour: 10, minute: 28 },
nextTime: { day: 3, hour: 9, minute: 0 },
expectedString: 'Opens in 3 days (Wednesday at 9:00 AM)',
expectedString: 'Opens in 4 days (Wednesday at 9:00 AM)',
},
]

Expand Down
4 changes: 2 additions & 2 deletions tests/util/time.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,9 @@ describe('getApproximateTimeStringFromMinutes', () => {
[59, '59 minutes'],
[62, '1 hour'],
[60, '1 hour'],
[119, '1 hour'],
[119, '2 hours'],
[120, '2 hours'],
[60 * 24 - 1, '23 hours'],
[60 * 24 - 1, '1 day'],
[60 * 24, '1 day'],
[60 * 24 * 2, '2 days'],
[60 * 24 * 5, '5 days'],
Expand Down

0 comments on commit 0e6096c

Please sign in to comment.