diff --git a/dev-dist/registerSW.js b/dev-dist/registerSW.js new file mode 100644 index 0000000..c0add48 --- /dev/null +++ b/dev-dist/registerSW.js @@ -0,0 +1,2 @@ +if ('serviceWorker' in navigator) + navigator.serviceWorker.register('/dev-sw.js?dev-sw', { scope: '/', type: 'classic' }); diff --git a/dev-dist/sw.js b/dev-dist/sw.js index 7a0a0a8..8d59ee2 100644 --- a/dev-dist/sw.js +++ b/dev-dist/sw.js @@ -79,9 +79,13 @@ define(['./workbox-5357ef54'], function (workbox) { */ workbox.precacheAndRoute( [ + { + url: 'registerSW.js', + revision: 'e0e9e1c501d0b08450003debc476f5d1', + }, { url: 'index.html', - revision: '0.3rdphr8mv9', + revision: '0.tgisoegou88', }, ], {}, diff --git a/src/App.tsx b/src/App.tsx index a289226..882b13e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -28,12 +28,14 @@ import CompetitionScramblerSchedule from './pages/Competition/ScramblerSchedule' import CompetitionStats from './pages/Competition/Stats'; import CompetitionStreamSchedule from './pages/Competition/StreamSchedule'; import Home from './pages/Home'; +import Settings from './pages/Settings'; import Support from './pages/Support'; import Test from './pages/Test'; import UserLogin from './pages/UserLogin'; import { AppProvider } from './providers/AppProvider'; import { AuthProvider, useAuth } from './providers/AuthProvider'; import { QueryProvider } from './providers/QueryProvider/QueryProvider'; +import { UserSettingsProvider } from './providers/UserSettingsProvider'; import { useWCIF } from './providers/WCIFProvider'; const PersonalSchedule = () => { @@ -119,6 +121,7 @@ const Navigation = () => { } /> } /> + } /> } /> } /> @@ -129,15 +132,17 @@ const Navigation = () => { const App = () => ( - - - - - - - - - + + + + + + + + + + + ); diff --git a/src/components/ActivityRow/ActivityRow.tsx b/src/components/ActivityRow/ActivityRow.tsx index aec2ac4..008525e 100644 --- a/src/components/ActivityRow/ActivityRow.tsx +++ b/src/components/ActivityRow/ActivityRow.tsx @@ -6,7 +6,7 @@ import { Stage } from '@/extensions/org.cubingusa.natshelper.v1/types'; import { useNow } from '@/hooks/useNow'; import { activityCodeToName } from '@/lib/activityCodes'; import { formatTimeRange } from '@/lib/time'; -import { Pill } from '../Pill'; +import { RoomPill } from '../Pill'; interface ActivityRowProps { activity: Activity; @@ -31,22 +31,22 @@ export function ActivityRow({ activity, stage, timeZone, showRoom = true }: Acti - {activityName} - + {activityName} + {showRoom && stage && ( - {stage.name} - + )} {formatTimeRange(activity.startTime, activity.endTime, 5, timeZone)} diff --git a/src/components/AssignmentCodeCell/AssignmentCodeCell.tsx b/src/components/AssignmentCodeCell/AssignmentCodeCell.tsx index b414f89..868e757 100644 --- a/src/components/AssignmentCodeCell/AssignmentCodeCell.tsx +++ b/src/components/AssignmentCodeCell/AssignmentCodeCell.tsx @@ -1,6 +1,8 @@ +import classNames from 'classnames'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { AssignmentsMap, SupportedAssignmentCode } from '@/lib/assignments'; +import { getAssignmentColorClasses } from '@/lib/colors'; interface AssignmentCodeCellProps { children?: React.ReactNode; @@ -58,28 +60,21 @@ export function AssignmentCodeCell({ const Component = as || 'td'; - const twColor = assignment?.color; - const twBorderColor = assignment?.colorClass?.[300]; + const colorClasses = assignmentCode ? getAssignmentColorClasses(assignmentCode) : null; return ( {content} {count ? ( <> {' '} - ({count}) + ({count}) ) : null} diff --git a/src/components/AssignmentLabel/AssignmentLabel.tsx b/src/components/AssignmentLabel/AssignmentLabel.tsx index 9fdad74..f827683 100644 --- a/src/components/AssignmentLabel/AssignmentLabel.tsx +++ b/src/components/AssignmentLabel/AssignmentLabel.tsx @@ -1,6 +1,7 @@ import { AssignmentCode } from '@wca/helpers'; import { useTranslation } from 'react-i18next'; -import { Pill } from '../Pill'; +import { getAssignmentColorClasses } from '@/lib/colors'; +import { BaseAssignmentPill } from '../Pill'; interface AssignmentLabelProps { assignmentCode: AssignmentCode; @@ -9,40 +10,11 @@ interface AssignmentLabelProps { export function AssignmentLabel({ assignmentCode }: AssignmentLabelProps) { const { t } = useTranslation(); - if (assignmentCode.match(/judge/i)) { - return ( - - {t('common.assignments.staff-judge.noun', { - defaultValue: assignmentCode.replace('staff-', ''), - })} - - ); - } - const name = t(`common.assignments.${assignmentCode}.noun`, { defaultValue: assignmentCode.replace('staff-', ''), }); - switch (assignmentCode) { - case 'competitor': - return {name}; - case 'staff-scrambler': - return {name}; - case 'staff-runner': - return {name}; - case 'staff-dataentry': - return {name}; - case 'staff-announcer': - return {name}; - case 'staff-delegate': - return {name}; - case 'staff-stagelead': - return {name}; - case 'staff-stream': - return {name}; - case 'staff-photo': - return {name}; - default: - return {name}; - } + const colorClasses = getAssignmentColorClasses(assignmentCode); + + return {name}; } diff --git a/src/components/Breadcrumbs/Breadcrumbs.tsx b/src/components/Breadcrumbs/Breadcrumbs.tsx index 397694d..3545198 100644 --- a/src/components/Breadcrumbs/Breadcrumbs.tsx +++ b/src/components/Breadcrumbs/Breadcrumbs.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import { Fragment } from 'react'; import { Link } from 'react-router-dom'; -import { Pill, PillProps } from '../Pill'; +import { BreadcrumbPill, PillProps } from '../Pill'; export type Breadcrumb = | { @@ -22,17 +22,17 @@ export const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {
{breadcrumbs.map(({ label, ...breadcrumb }, index) => ( - {index > 0 && Β·} + {index > 0 && Β·} {'href' in breadcrumb ? ( - {label} - + ) : ( {label} diff --git a/src/components/Button/Button.tsx b/src/components/Button/Button.tsx index 4ca5e2c..cd40cb8 100644 --- a/src/components/Button/Button.tsx +++ b/src/components/Button/Button.tsx @@ -1,10 +1,20 @@ import classNames from 'classnames'; import { ButtonHTMLAttributes, PropsWithChildren } from 'react'; +export type ButtonVariant = 'blue' | 'green' | 'gray' | 'light'; + export interface ButtonProps extends PropsWithChildren> { className?: string; + variant?: ButtonVariant; } -export const Button = ({ className, ...props }: ButtonProps) => { - return
); }; diff --git a/src/components/ExternalLink/ExternalLink.tsx b/src/components/ExternalLink/ExternalLink.tsx index 0b557d5..1600470 100644 --- a/src/components/ExternalLink/ExternalLink.tsx +++ b/src/components/ExternalLink/ExternalLink.tsx @@ -14,10 +14,7 @@ export function ExternalLink({ href={href} target="_blank" rel="noreferrer" - className={classNames( - 'flex align-center justify-between w-full bg-blue-200 px-4 py-2 rounded hover:opacity-80', - className, - )}> + className={classNames('link-external', className)}> {children} diff --git a/src/components/LastFetchedAt/LastFetchedAt.tsx b/src/components/LastFetchedAt/LastFetchedAt.tsx index 38f659a..76d2c81 100644 --- a/src/components/LastFetchedAt/LastFetchedAt.tsx +++ b/src/components/LastFetchedAt/LastFetchedAt.tsx @@ -9,7 +9,7 @@ export const LastFetchedAt = ({ lastFetchedAt }: LastFetchAtProps) => { const { t } = useTranslation(); return ( -
+
{t('common.lastFetched', { date: intlFormatDistance(lastFetchedAt, new Date(), { locale: navigator.language, diff --git a/src/components/LinkButton/LinkButton.tsx b/src/components/LinkButton/LinkButton.tsx index 0b0e0f0..25e7f11 100644 --- a/src/components/LinkButton/LinkButton.tsx +++ b/src/components/LinkButton/LinkButton.tsx @@ -4,22 +4,22 @@ import { Link, LinkProps } from 'react-router-dom'; export interface LinkButtonProps { to: LinkProps['to']; title: string; - color: 'blue' | 'green'; + variant?: 'blue' | 'green' | 'gray' | 'light'; className?: string; } -export const LinkButton = ({ to, title, color, className }: LinkButtonProps) => { +export const LinkButton = ({ to, title, variant = 'blue', className }: LinkButtonProps) => { + const variantClasses = { + blue: 'btn-blue', + green: 'btn-green', + gray: 'btn-gray', + light: 'btn-light', + } satisfies Record, string>; + return ( + className={classNames('btn btn-block cursor-pointer', variantClasses[variant], className)}> {title} ); diff --git a/src/components/Notebox/Notebox.tsx b/src/components/Notebox/Notebox.tsx index c76f712..fee2f61 100644 --- a/src/components/Notebox/Notebox.tsx +++ b/src/components/Notebox/Notebox.tsx @@ -10,7 +10,7 @@ export function NoteBox({ text, prefix = 'Note', className }: NoteBoxProps) { return (

{prefix && {prefix}: } diff --git a/src/components/Pill/Pill.tsx b/src/components/Pill/Pill.tsx index ab8b124..071f14a 100644 --- a/src/components/Pill/Pill.tsx +++ b/src/components/Pill/Pill.tsx @@ -6,7 +6,43 @@ export const Pill = ({ className, ...props }: PillProps) => { return ( + ); +}; + +export const BreadcrumbPill = ({ className, ...props }: PillProps) => { + return ( + + ); +}; + +export const BaseAssignmentPill = ({ className, ...props }: PillProps) => { + return ( + + ); +}; + +export const RoomPill = ({ className, ...props }: PillProps) => { + return ( +