diff --git a/apps/app/src/components/ai.tsx b/apps/app/src/components/ai.tsx index 8f0bd1e4..a072e85f 100644 --- a/apps/app/src/components/ai.tsx +++ b/apps/app/src/components/ai.tsx @@ -43,8 +43,6 @@ const renderToolPart = ( part: ChatMessagePart, index: number, ): React.ReactNode => { - if (!part.type?.startsWith("tool-")) return null; - return ; }; @@ -52,7 +50,7 @@ export function MessageComponent({ message, isLastMessage, }: MessageComponentProps) { - const isAssistant = message?.role === "assistant"; + const isAssistant = message.role === "assistant"; return (
- {message?.parts - .filter((part) => part.type?.startsWith("tool-")) + {message.parts + .filter((part) => part.type.startsWith("tool-")) .map((part, index) => renderToolPart(part, index))}
- {message?.parts + {message.parts .filter((part) => part.type === "text") - .map((part) => (part.type === "text" ? part.text : "")) + .map((part) => part.text) .join("")} @@ -104,7 +102,7 @@ export function MessageComponent({ ) : (
- {message?.parts + {message.parts .map((part) => (part.type === "text" ? part.text : "")) .join("")} @@ -193,7 +191,7 @@ function ThreadChatbot() {
)} - {messages?.map((message, index) => { + {messages.map((message, index) => { const isLastMessage = index === messages.length - 1; return ( diff --git a/apps/app/src/components/prompt-kit/response-stream.tsx b/apps/app/src/components/prompt-kit/response-stream.tsx index 8aa4daec..dae0dffd 100644 --- a/apps/app/src/components/prompt-kit/response-stream.tsx +++ b/apps/app/src/components/prompt-kit/response-stream.tsx @@ -76,8 +76,6 @@ function useTextStream({ if (modeRef.current === "typewriter") { if (normalizedSpeed < 25) return 1; return Math.max(1, Math.round((normalizedSpeed - 25) / 10)); - } else if (modeRef.current === "fade") { - return 1; } return 1; @@ -234,7 +232,7 @@ function useTextStream({ if (typeof textStream === "string") { processStringTypewriter(textStream); - } else if (textStream) { + } else { processAsyncIterable(textStream); } }, [textStream, reset, processStringTypewriter, processAsyncIterable]); @@ -388,7 +386,7 @@ function ResponseStream({ } }; - const Container = as as keyof React.JSX.IntrinsicElements; + const Container = as; return {renderContent()}; } diff --git a/apps/app/src/components/sign-in-with-google-button.tsx b/apps/app/src/components/sign-in-with-google-button.tsx index 0be73121..45c68d83 100644 --- a/apps/app/src/components/sign-in-with-google-button.tsx +++ b/apps/app/src/components/sign-in-with-google-button.tsx @@ -22,7 +22,7 @@ export function SignInWithGoogleButton() { return data; }, onError: (error) => { - toast.error(error.message ?? "An unknown error occurred"); + toast.error(error.message); }, }); diff --git a/apps/app/src/components/ui/field.tsx b/apps/app/src/components/ui/field.tsx index 2d4e7f88..64516e36 100644 --- a/apps/app/src/components/ui/field.tsx +++ b/apps/app/src/components/ui/field.tsx @@ -194,7 +194,7 @@ function FieldError({ ...new Map(errors.map((error) => [error?.message, error])).values(), ]; - if (uniqueErrors?.length == 1) { + if (uniqueErrors.length === 1) { return uniqueErrors[0]?.message; } diff --git a/apps/app/src/lib/trpc/query-client.ts b/apps/app/src/lib/trpc/query-client.ts index 30592e68..db3033e8 100644 --- a/apps/app/src/lib/trpc/query-client.ts +++ b/apps/app/src/lib/trpc/query-client.ts @@ -29,7 +29,7 @@ export function makeQueryClient() { }, queryCache: new QueryCache({ onError: (error) => { - console.error(error.message ?? "Something went wrong"); + console.error(error.message); }, }), }); diff --git a/apps/app/src/routes/login.tsx b/apps/app/src/routes/login.tsx index 489f8eda..d51ee7bc 100644 --- a/apps/app/src/routes/login.tsx +++ b/apps/app/src/routes/login.tsx @@ -61,7 +61,7 @@ function Login() { toast.success("Magic link printed to the server logs"); }, onError: (error) => { - toast.error(error.message ?? "An unknown error occurred"); + toast.error(error.message); }, }); diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts index ce4e94a6..a419cbe4 100644 --- a/apps/web/next-env.d.ts +++ b/apps/web/next-env.d.ts @@ -1,7 +1,7 @@ /// /// -import "./.next/types/routes.d.ts"; -import "./.next/types/root-params.d.ts"; +import "./.next/dev/types/routes.d.ts"; +import "./.next/dev/types/root-params.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/web/src/app/api/[...trpc]/route.ts b/apps/web/src/app/api/[...trpc]/route.ts index 6ba37876..e71d9fba 100644 --- a/apps/web/src/app/api/[...trpc]/route.ts +++ b/apps/web/src/app/api/[...trpc]/route.ts @@ -2,14 +2,13 @@ import { createOpenApiFetchHandler } from "trpc-to-openapi"; import { appRouter, createContext } from "@repo/api"; -const handler = (req: Request) => { - return createOpenApiFetchHandler({ +const handler = (req: Request) => + createOpenApiFetchHandler({ endpoint: "/api/v1", req, router: appRouter, createContext: () => createContext({ headers: req.headers }), }); -}; export { handler as GET, diff --git a/apps/web/src/components/calendar/flows/create-event/create-queue-provider.tsx b/apps/web/src/components/calendar/flows/create-event/create-queue-provider.tsx index a1a5b731..1bd50874 100644 --- a/apps/web/src/components/calendar/flows/create-event/create-queue-provider.tsx +++ b/apps/web/src/components/calendar/flows/create-event/create-queue-provider.tsx @@ -38,12 +38,14 @@ export function CreateQueueProvider({ children }: CreateQueueProviderProps) { [createMutation, removeOptimisticAction], ); - const logic = React.useMemo(() => { - return createCreateQueueMachine({ - createEvent, - removeOptimisticAction, - }); - }, [createEvent, removeOptimisticAction]); + const logic = React.useMemo( + () => + createCreateQueueMachine({ + createEvent, + removeOptimisticAction, + }), + [createEvent, removeOptimisticAction], + ); return ( diff --git a/apps/web/src/components/calendar/flows/create-event/create-queue.ts b/apps/web/src/components/calendar/flows/create-event/create-queue.ts index 59a31f2b..d09a4d90 100644 --- a/apps/web/src/components/calendar/flows/create-event/create-queue.ts +++ b/apps/web/src/components/calendar/flows/create-event/create-queue.ts @@ -20,7 +20,7 @@ export interface CreateQueueItem { } export function hasAttendees(event: CalendarEvent) { - return !!event.attendees && event.attendees.length > 0; + return (event.attendees?.length ?? 0) > 0; } export type CreateEvent = (item: CreateQueueItem) => Promise; diff --git a/apps/web/src/components/calendar/flows/delete-event/delete-queue-provider.tsx b/apps/web/src/components/calendar/flows/delete-event/delete-queue-provider.tsx index 0a7ce159..2c658729 100644 --- a/apps/web/src/components/calendar/flows/delete-event/delete-queue-provider.tsx +++ b/apps/web/src/components/calendar/flows/delete-event/delete-queue-provider.tsx @@ -55,12 +55,14 @@ export function DeleteQueueProvider({ children }: DeleteQueueProviderProps) { [deleteMutation, removeOptimisticAction], ); - const logic = React.useMemo(() => { - return createDeleteQueueMachine({ - deleteEvent, - removeOptimisticAction, - }); - }, [deleteEvent, removeOptimisticAction]); + const logic = React.useMemo( + () => + createDeleteQueueMachine({ + deleteEvent, + removeOptimisticAction, + }), + [deleteEvent, removeOptimisticAction], + ); return ( diff --git a/apps/web/src/components/calendar/flows/delete-event/delete-queue.ts b/apps/web/src/components/calendar/flows/delete-event/delete-queue.ts index 540e57b2..2c4fd146 100644 --- a/apps/web/src/components/calendar/flows/delete-event/delete-queue.ts +++ b/apps/web/src/components/calendar/flows/delete-event/delete-queue.ts @@ -20,11 +20,11 @@ export interface DeleteQueueItem { } export function isRecurring(event: CalendarEvent) { - return !!event.recurringEventId; + return Boolean(event.recurringEventId); } export function hasAttendees(event: CalendarEvent) { - return !!event.attendees && event.attendees.length > 0; + return (event.attendees?.length ?? 0) > 0; } export type DeleteEvent = (item: DeleteQueueItem) => Promise; diff --git a/apps/web/src/components/calendar/flows/event-form/event-form-state-provider.tsx b/apps/web/src/components/calendar/flows/event-form/event-form-state-provider.tsx index c0f773c6..bd8fb343 100644 --- a/apps/web/src/components/calendar/flows/event-form/event-form-state-provider.tsx +++ b/apps/web/src/components/calendar/flows/event-form/event-form-state-provider.tsx @@ -26,11 +26,13 @@ export function EventFormStateProvider({ return item; }, []); - const logic = React.useMemo(() => { - return createEventFormMachine({ - updateEvent, - }); - }, [updateEvent]); + const logic = React.useMemo( + () => + createEventFormMachine({ + updateEvent, + }), + [updateEvent], + ); return ( diff --git a/apps/web/src/components/calendar/flows/update-event/update-queue-provider.tsx b/apps/web/src/components/calendar/flows/update-event/update-queue-provider.tsx index 2dfb2584..0c4f52b9 100644 --- a/apps/web/src/components/calendar/flows/update-event/update-queue-provider.tsx +++ b/apps/web/src/components/calendar/flows/update-event/update-queue-provider.tsx @@ -101,12 +101,14 @@ export function UpdateQueueProvider({ children }: UpdateQueueProviderProps) { [updateMutation, removeOptimisticAction], ); - const logic = React.useMemo(() => { - return createUpdateQueueMachine({ - updateEvent, - removeOptimisticAction, - }); - }, [updateEvent, removeOptimisticAction]); + const logic = React.useMemo( + () => + createUpdateQueueMachine({ + updateEvent, + removeOptimisticAction, + }), + [updateEvent, removeOptimisticAction], + ); return ( diff --git a/apps/web/src/components/calendar/flows/update-event/update-queue.ts b/apps/web/src/components/calendar/flows/update-event/update-queue.ts index 7ea58e6b..c3debdde 100644 --- a/apps/web/src/components/calendar/flows/update-event/update-queue.ts +++ b/apps/web/src/components/calendar/flows/update-event/update-queue.ts @@ -40,11 +40,11 @@ export interface UpdateQueueItem { } export function isRecurring(event: CalendarEvent) { - return !!event.recurringEventId; + return Boolean(event.recurringEventId); } export function hasAttendees(event: CalendarEvent) { - return !!event.attendees && event.attendees.length > 0; + return (event.attendees?.length ?? 0) > 0; } export type UpdateEvent = (item: UpdateQueueItem) => Promise; diff --git a/apps/web/src/components/calendar/header/calendar-picker/calendar-picker.tsx b/apps/web/src/components/calendar/header/calendar-picker/calendar-picker.tsx index 880e1806..be8f3318 100644 --- a/apps/web/src/components/calendar/header/calendar-picker/calendar-picker.tsx +++ b/apps/web/src/components/calendar/header/calendar-picker/calendar-picker.tsx @@ -87,18 +87,20 @@ function CalendarPickerContent() { const calendarPreferences = useCalendarStore((s) => s.calendarPreferences); const { isActionMenuOpen } = useCalendarPickerContext(); - const visibleCalendars = React.useMemo(() => { - return data?.accounts - .flatMap((account) => account.calendars) - .filter((calendar) => { - const preference = getCalendarPreference( - calendarPreferences, - calendar.provider.accountId, - calendar.id, - ); - return !preference?.hidden; - }); - }, [data, calendarPreferences]); + const visibleCalendars = React.useMemo( + () => + data?.accounts + .flatMap((account) => account.calendars) + .filter((calendar) => { + const preference = getCalendarPreference( + calendarPreferences, + calendar.provider.accountId, + calendar.id, + ); + return !preference?.hidden; + }), + [data, calendarPreferences], + ); if (!data) { return null; diff --git a/apps/web/src/components/calendar/timeline/header/solar-terminator-map/solar-terminator-map.tsx b/apps/web/src/components/calendar/timeline/header/solar-terminator-map/solar-terminator-map.tsx index 0445ced8..5355f5dd 100644 --- a/apps/web/src/components/calendar/timeline/header/solar-terminator-map/solar-terminator-map.tsx +++ b/apps/web/src/components/calendar/timeline/header/solar-terminator-map/solar-terminator-map.tsx @@ -127,7 +127,7 @@ export function SolarTerminatorMap({ if (terminator.length > 0) { // Go to right edge at same latitude dayCoords.push([180, terminator[terminator.length - 1]?.[1] || 0]); - if ((sunDeclination ?? 0) >= 0) { + if (sunDeclination >= 0) { // Close across the northern boundary when the sun is over the northern hemisphere dayCoords.push([180, 90]); dayCoords.push([-180, 90]); @@ -156,7 +156,7 @@ export function SolarTerminatorMap({ ); }); - return lineGenerator(dayCoords) + "Z" || ""; + return lineGenerator(dayCoords) + "Z"; }, [terminator, projection, sunDeclination]); return ( diff --git a/apps/web/src/components/calendar/timeline/header/timezone.tsx b/apps/web/src/components/calendar/timeline/header/timezone.tsx index bc3c2e10..29aef70b 100644 --- a/apps/web/src/components/calendar/timeline/header/timezone.tsx +++ b/apps/web/src/components/calendar/timeline/header/timezone.tsx @@ -64,9 +64,10 @@ function TimeDisplay({ className, timeZoneId }: TimeDisplayProps) { const use12Hour = useCalendarStore((s) => s.calendarSettings.use12Hour); const locale = useCalendarStore((s) => s.calendarSettings.locale); - const time = React.useMemo(() => { - return currentTime.withTimeZone(timeZoneId); - }, [currentTime, timeZoneId]); + const time = React.useMemo( + () => currentTime.withTimeZone(timeZoneId), + [currentTime, timeZoneId], + ); return (
diff --git a/apps/web/src/components/calendar/timeline/timeline.tsx b/apps/web/src/components/calendar/timeline/timeline.tsx index c986408e..3e56f349 100644 --- a/apps/web/src/components/calendar/timeline/timeline.tsx +++ b/apps/web/src/components/calendar/timeline/timeline.tsx @@ -41,9 +41,9 @@ function useHours(timeZone: string) { const start = startOfDay(date, { timeZone: defaultTimeZone }); - const hours = HOURS.map((time) => { - return start.add({ hours: time.hour }).withTimeZone(timeZone); - }); + const hours = HOURS.map((time) => + start.add({ hours: time.hour }).withTimeZone(timeZone), + ); return hours.map((hour) => ({ label: formatTime({ diff --git a/apps/web/src/components/command-bar/window-stack-provider.tsx b/apps/web/src/components/command-bar/window-stack-provider.tsx index 4196c804..80455072 100644 --- a/apps/web/src/components/command-bar/window-stack-provider.tsx +++ b/apps/web/src/components/command-bar/window-stack-provider.tsx @@ -49,9 +49,10 @@ export function WindowStackProvider({ children }: WindowStackProviderProps) { ]; }, [selectedEvents]); - const windows = React.useMemo(() => { - return [...eventWindows, ...stack]; - }, [eventWindows, stack]); + const windows = React.useMemo( + () => [...eventWindows, ...stack], + [eventWindows, stack], + ); const [activeWindowId, setActiveWindowId] = React.useState( () => windows[0]?.id ?? null, diff --git a/apps/web/src/components/date-picker.tsx b/apps/web/src/components/date-picker.tsx index 9a1a529b..11eb179b 100644 --- a/apps/web/src/components/date-picker.tsx +++ b/apps/web/src/components/date-picker.tsx @@ -14,12 +14,14 @@ export function DatePicker() { const displayedDays = useDisplayedDays(); - const displayedMonth = React.useMemo(() => { - return Temporal.PlainYearMonth.from({ - year: currentDate.year, - month: currentDate.month, - }); - }, [currentDate.year, currentDate.month]); + const displayedMonth = React.useMemo( + () => + Temporal.PlainYearMonth.from({ + year: currentDate.year, + month: currentDate.month, + }), + [currentDate.year, currentDate.month], + ); const calendarRef = React.useRef(null); diff --git a/apps/web/src/components/event-form/ai-input/hooks/use-expanding-input.ts b/apps/web/src/components/event-form/ai-input/hooks/use-expanding-input.ts index 475b3a25..71e6f945 100644 --- a/apps/web/src/components/event-form/ai-input/hooks/use-expanding-input.ts +++ b/apps/web/src/components/event-form/ai-input/hooks/use-expanding-input.ts @@ -11,8 +11,8 @@ export const useExpandingInput = (value: string) => { const placeCursorAtEnd = useCallback(() => { if (!textareaRef.current) return; textareaRef.current.focus(); - textareaRef.current.selectionStart = textareaRef.current.value.length ?? 0; - textareaRef.current.selectionEnd = textareaRef.current.value.length ?? 0; + textareaRef.current.selectionStart = textareaRef.current.value.length; + textareaRef.current.selectionEnd = textareaRef.current.value.length; }, []); useUpdateEffect(() => { diff --git a/apps/web/src/components/event-form/fields/attendees/attendee-list.tsx b/apps/web/src/components/event-form/fields/attendees/attendee-list.tsx index 8fe570a1..c40b84f5 100644 --- a/apps/web/src/components/event-form/fields/attendees/attendee-list.tsx +++ b/apps/web/src/components/event-form/fields/attendees/attendee-list.tsx @@ -37,10 +37,7 @@ interface AttendeeAvatarProps { function AttendeeAvatar({ name, email, className }: AttendeeAvatarProps) { const initials = React.useMemo(() => { - const initials = - name?.trim().length && name?.trim().length > 0 - ? name?.charAt(0) - : email.charAt(0); + const initials = name?.trim() ? name.charAt(0) : email.charAt(0); return initials.toUpperCase(); }, [name, email]); @@ -70,7 +67,7 @@ function AttendeeInfo({ organizer, className, }: AttendeeInfoProps) { - const showName = name?.trim()?.length && name?.trim().length > 0; + const showName = name?.trim().length && name.trim().length > 0; return (
@@ -125,10 +122,6 @@ function AttendeeStatusIcon({ status, className }: AttendeeStatusProps) { } }; - if (!Icon) { - return null; - } - return (
{ - return data?.accounts ?? []; - }, [data]); + const items = React.useMemo(() => data?.accounts ?? [], [data]); const onSelect = React.useCallback( (calendar: Calendar) => { @@ -65,11 +63,13 @@ export function CalendarField({ [onChange, onBlur], ); - const selected = React.useMemo(() => { - return data?.accounts - .flatMap((item) => item.calendars) - .find((item) => item.id === value.id); - }, [data, value]); + const selected = React.useMemo( + () => + data?.accounts + .flatMap((item) => item.calendars) + .find((item) => item.id === value.id), + [data, value], + ); return ( diff --git a/apps/web/src/components/event-form/fields/date/date-input.tsx b/apps/web/src/components/event-form/fields/date/date-input.tsx index 3974ff52..486a2084 100644 --- a/apps/web/src/components/event-form/fields/date/date-input.tsx +++ b/apps/web/src/components/event-form/fields/date/date-input.tsx @@ -89,9 +89,10 @@ export function DateInput({ return value.toPlainDate(); }, [value, allDay, start]); - const defaultMonth = React.useMemo(() => { - return value.toPlainDate().toPlainYearMonth(); - }, [value]); + const defaultMonth = React.useMemo( + () => value.toPlainDate().toPlainYearMonth(), + [value], + ); const [displayedMonth, setDisplayedMonth] = React.useState(date.toPlainYearMonth()); @@ -296,9 +297,10 @@ function TemporalCalendar({ onMonthChange, min, }: TemporalCalendarProps) { - const legacySelected = React.useMemo(() => { - return toDate(selected, { timeZone }); - }, [selected, timeZone]); + const legacySelected = React.useMemo( + () => toDate(selected, { timeZone }), + [selected, timeZone], + ); const legacyOnSelect = React.useCallback( (date: Date) => { diff --git a/apps/web/src/components/event-form/fields/date/use-time-suggestions.ts b/apps/web/src/components/event-form/fields/date/use-time-suggestions.ts index 53f35f74..4585fa19 100644 --- a/apps/web/src/components/event-form/fields/date/use-time-suggestions.ts +++ b/apps/web/src/components/event-form/fields/date/use-time-suggestions.ts @@ -75,13 +75,15 @@ export function useTimeSuggestionsList() { const settings = useCalendarSettings(); const defaultTimeZone = useDefaultTimeZone(); - return React.useMemo(() => { - return generateList({ - locale: settings.locale, - timeZone: defaultTimeZone, - use12Hour: settings.use12Hour, - }); - }, [settings.locale, defaultTimeZone, settings.use12Hour]); + return React.useMemo( + () => + generateList({ + locale: settings.locale, + timeZone: defaultTimeZone, + use12Hour: settings.use12Hour, + }), + [settings.locale, defaultTimeZone, settings.use12Hour], + ); } export function useTimeSuggestions(searchValue: string) { diff --git a/apps/web/src/components/event-form/fields/description-field.tsx b/apps/web/src/components/event-form/fields/description-field.tsx index 88852c51..4cce0150 100644 --- a/apps/web/src/components/event-form/fields/description-field.tsx +++ b/apps/web/src/components/event-form/fields/description-field.tsx @@ -22,7 +22,7 @@ export function DescriptionField({ const onTextareaChange = React.useCallback( (e: React.ChangeEvent) => { - onChange?.(e.target.value); + onChange(e.target.value); }, [onChange], ); diff --git a/apps/web/src/components/event-form/recurrences/fields/day-of-week-field.tsx b/apps/web/src/components/event-form/recurrences/fields/day-of-week-field.tsx index 35834786..beb781f8 100644 --- a/apps/web/src/components/event-form/recurrences/fields/day-of-week-field.tsx +++ b/apps/web/src/components/event-form/recurrences/fields/day-of-week-field.tsx @@ -32,7 +32,7 @@ export function DayOfWeekField({ value, onValueChange }: DayOfWeekFieldProps) { onValueChange(v as Weekday[])} className="w-full" > diff --git a/apps/web/src/components/event-form/recurrences/recurrence-dialog.tsx b/apps/web/src/components/event-form/recurrences/recurrence-dialog.tsx index e97fe9d3..64d4dcb6 100644 --- a/apps/web/src/components/event-form/recurrences/recurrence-dialog.tsx +++ b/apps/web/src/components/event-form/recurrences/recurrence-dialog.tsx @@ -110,9 +110,7 @@ export function RecurrenceDialog({ }, }); - const min = React.useMemo(() => { - return toDate(start); - }, [start]); + const min = React.useMemo(() => toDate(start), [start]); return ( diff --git a/apps/web/src/components/event-form/recurrences/recurrence-field.tsx b/apps/web/src/components/event-form/recurrences/recurrence-field.tsx index c88e4440..60ef6d72 100644 --- a/apps/web/src/components/event-form/recurrences/recurrence-field.tsx +++ b/apps/web/src/components/event-form/recurrences/recurrence-field.tsx @@ -54,9 +54,7 @@ export function RecurrenceField({ return baseEvent?.recurrence; }, [value, baseEvent?.recurrence]); - const timeZone = React.useMemo(() => { - return date.timeZoneId; - }, [date]); + const timeZone = React.useMemo(() => date.timeZoneId, [date]); const recurrence = useRecurrence({ recurrence: displayRecurrence ?? undefined, @@ -75,7 +73,7 @@ export function RecurrenceField({