mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-05-09 04:02:40 -05:00
* Add DB tables
* Toggle TO Tools in new calendar event page
* TO tools page initial
* Add counter pick map pool UI
* Save tie breaker map pool
* Save team name
* Layout initial
* Load users own team
* Make team name input required
* Rename team
* Divide to sections
* Submit team map pool
* New style for counter pick map pool section expand
* Fix tiebreaker map pool not saved when new event made
* Split to many forms
* According for team name
* Small UI consistency tweaks
* Add explanation to tie breaker maps
* Remove redundant prop
* Fix new calendar event todos
* Use required hidden input component in new build page
* Fix to tools page showing even when toToolsEnabled = 0
* Delete team
* Map list generation tests initial
* Add tournament map list generation tests
* First version of map list generation
* Add seeded RNG
* Rearrange files
* Generation with strats initial
* Default map pool + allow one team not to have any maps
* Implement map generation via backtracking
* Make order of stages irrelevant
* Add one more TODO
* Seed
* Fixes
* Tournament map list generator initial
* More functional maplist
* Fix any
* Persist in search params initial
* Add date to calendar seed
* Revert "Persist in search params initial"
This reverts commit f01a9e6982.
* Allow admin to start tournament
* Rate maplist instead of optimal / suboptimal
* Add fallback if map list generation errors out
* Hide TO Tools if not admin
* Submit team roster and delete members
* Teams page
* Give roster s p a c e
* Clear user combobox on sent + layout tweaks
* Gracefully handle updating after tournament has started
* Add title
* Persist map list in search params
* Add i18n
96 lines
2.4 KiB
TypeScript
96 lines
2.4 KiB
TypeScript
import { getWeek } from "date-fns";
|
|
|
|
export function databaseTimestampToDate(timestamp: number) {
|
|
return new Date(timestamp * 1000);
|
|
}
|
|
|
|
export function dateToDatabaseTimestamp(date: Date) {
|
|
return Math.floor(date.getTime() / 1000);
|
|
}
|
|
|
|
export function databaseCreatedAt() {
|
|
return dateToDatabaseTimestamp(new Date());
|
|
}
|
|
|
|
export function dateToWeekNumber(date: Date) {
|
|
return getWeek(date, { weekStartsOn: 1, firstWeekContainsDate: 4 });
|
|
}
|
|
|
|
// https://stackoverflow.com/a/71336659
|
|
export function weekNumberToDate({
|
|
week,
|
|
year,
|
|
position = "start",
|
|
}: {
|
|
week: number;
|
|
year: number;
|
|
/** start = Date of Monday, end = Date of Sunday */
|
|
position?: "start" | "end";
|
|
}) {
|
|
const result = new Date(Date.UTC(year, 0, 4));
|
|
|
|
result.setDate(
|
|
result.getDate() - (result.getDay() || 7) + 1 + 7 * (week - 1)
|
|
);
|
|
if (position === "end") {
|
|
result.setDate(result.getDate() + 6);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Checks if a date is valid or not.
|
|
*
|
|
* Returns:
|
|
* - True if date is valid
|
|
* - False otherwise
|
|
*/
|
|
export function isValidDate(date: Date) {
|
|
return !isNaN(date.getTime());
|
|
}
|
|
|
|
/** Returns date as a string with the format YYYY-MM-DDThh:mm in user's time zone */
|
|
export function dateToYearMonthDayHourMinuteString(date: Date) {
|
|
const copiedDate = new Date(date.getTime());
|
|
|
|
if (!isValidDate(copiedDate)) {
|
|
throw new Error("tried to format string from invalid date");
|
|
}
|
|
|
|
const year = copiedDate.getFullYear();
|
|
const month = copiedDate.getMonth() + 1;
|
|
const day = copiedDate.getDate();
|
|
const hour = copiedDate.getHours();
|
|
const minute = copiedDate.getMinutes();
|
|
|
|
return `${year}-${prefixZero(month)}-${prefixZero(day)}T${prefixZero(
|
|
hour
|
|
)}:${prefixZero(minute)}`;
|
|
}
|
|
|
|
function prefixZero(number: number) {
|
|
return number < 10 ? `0${number}` : number;
|
|
}
|
|
|
|
/**
|
|
* Retrieves a new Date object that is offset by several hours.
|
|
*
|
|
* NOTE: it is important that we work with & return a copy of the date here,
|
|
* otherwise we will just be mutating the original date passed into this function.
|
|
*/
|
|
export function getDateWithHoursOffset(date: Date, hoursOffset: number) {
|
|
const copiedDate = new Date(date.getTime());
|
|
copiedDate.setHours(date.getHours() + hoursOffset);
|
|
return copiedDate;
|
|
}
|
|
|
|
export function getDateAtNextFullHour(date: Date) {
|
|
const copiedDate = new Date(date.getTime());
|
|
if (date.getMinutes() > 0) {
|
|
copiedDate.setHours(date.getHours() + 1);
|
|
copiedDate.setMinutes(0);
|
|
}
|
|
copiedDate.setSeconds(0);
|
|
return copiedDate;
|
|
}
|