diff --git a/apps/web/components/App.tsx b/apps/web/components/App.tsx index be404f32..34d9f749 100644 --- a/apps/web/components/App.tsx +++ b/apps/web/components/App.tsx @@ -81,7 +81,7 @@ export default function App({ } } getInstalledApp(type); - }, []); + }, [type]); return ( <> @@ -94,7 +94,10 @@ export default function App({
- {name} + { + // eslint-disable-next-line @next/next/no-img-element + {name} + }

{name}

diff --git a/apps/web/components/CustomBranding.tsx b/apps/web/components/CustomBranding.tsx index 314443e3..8dd83e22 100644 --- a/apps/web/components/CustomBranding.tsx +++ b/apps/web/components/CustomBranding.tsx @@ -274,7 +274,17 @@ const BrandColor = ({ "--brand-text-color-dark-mode", getContrastingTextColor(darkVal, true) ); - }, [lightVal, darkVal]); + }, [ + embedBrandingColors.highlightColor, + embedBrandingColors.lightestColor, + embedBrandingColors.lighterColor, + embedBrandingColors.lightColor, + embedBrandingColors.medianColor, + embedBrandingColors.darkColor, + embedBrandingColors.darkerColor, + lightVal, + darkVal, + ]); return null; }; diff --git a/apps/web/components/ImageUploader.tsx b/apps/web/components/ImageUploader.tsx index 26aae806..92c87024 100644 --- a/apps/web/components/ImageUploader.tsx +++ b/apps/web/components/ImageUploader.tsx @@ -134,7 +134,10 @@ export default function ImageUploader({ {t("no_target", { target })}

)} - {imageSrc && {target}} + {imageSrc && ( + // eslint-disable-next-line @next/next/no-img-element + {target} + )}

)} {result && } diff --git a/apps/web/components/Logo.tsx b/apps/web/components/Logo.tsx index 40923b4a..08bc6632 100644 --- a/apps/web/components/Logo.tsx +++ b/apps/web/components/Logo.tsx @@ -3,8 +3,10 @@ export default function Logo({ small, icon }: { small?: boolean; icon?: boolean

{icon ? ( + // eslint-disable-next-line @next/next/no-img-element Cal ) : ( + // eslint-disable-next-line @next/next/no-img-element Cal {/* logo icon for tablet */} - + @@ -460,7 +460,6 @@ function UserDropdown({ small }: { small?: boolean }) { }, }); const utils = trpc.useContext(); - return ( @@ -470,11 +469,14 @@ function UserDropdown({ small }: { small?: boolean }) { small ? "h-8 w-8" : "h-10 w-10", "relative flex-shrink-0 rounded-full bg-gray-300 ltr:mr-3 rtl:ml-3" )}> - {user?.username + { + // eslint-disable-next-line @next/next/no-img-element + {user?.username + } {!user?.away && (
)} diff --git a/apps/web/components/apps/AppCard.tsx b/apps/web/components/apps/AppCard.tsx index 45957bb6..2512e786 100644 --- a/apps/web/components/apps/AppCard.tsx +++ b/apps/web/components/apps/AppCard.tsx @@ -20,7 +20,10 @@ export default function AppCard(props: AppCardProps) { className="block h-full rounded-sm border border-gray-300 p-5 hover:bg-neutral-50" data-testid={`app-store-app-card-${props.slug}`}>
- {props.name + { + // eslint-disable-next-line @next/next/no-img-element + {props.name + } ); @@ -103,7 +106,10 @@ const CryptoSection = (props: CryptoSectionProps) => { const connectButton = useMemo(() => { return ( ); @@ -118,7 +124,10 @@ const CryptoSection = (props: CryptoSectionProps) => { await connectMetamask(); await verifyWallet(); }}> - + { + // eslint-disable-next-line @next/next/no-img-element + MetaMask + } {t("verify_wallet")} ); diff --git a/apps/web/lib/hooks/useSlots.ts b/apps/web/lib/hooks/useSlots.ts index a54e31e5..2b1a28c2 100644 --- a/apps/web/lib/hooks/useSlots.ts +++ b/apps/web/lib/hooks/useSlots.ts @@ -122,6 +122,31 @@ export const useSlots = (props: UseSlotsProps) => { const dateTo = date.endOf("day").format(); const query = stringify({ dateFrom, dateTo, eventTypeId }); + const handleAvailableSlots = async (res: Response) => { + const responseBody: AvailabilityUserResponse = await res.json(); + const times = getSlots({ + frequency: slotInterval || eventLength, + inviteeDate: date, + workingHours: responseBody.workingHours, + minimumBookingNotice, + eventLength, + }); + const filterTimeProps = { + times, + busy: responseBody.busy, + eventLength, + beforeBufferTime, + afterBufferTime, + }; + const filteredTimes = getFilteredTimes(filterTimeProps); + // temporary + const user = res.url.substring(res.url.lastIndexOf("/") + 1, res.url.indexOf("?")); + return filteredTimes.map((time) => ({ + time, + users: [user], + })); + }; + Promise.all( users.map((user) => fetch(`/api/availability/${user.username}?${query}`).then(handleAvailableSlots)) ) @@ -173,32 +198,17 @@ export const useSlots = (props: UseSlotsProps) => { console.error(e); setError(e); }); - }, [date]); - - const handleAvailableSlots = async (res: Response) => { - const responseBody: AvailabilityUserResponse = await res.json(); - const times = getSlots({ - frequency: slotInterval || eventLength, - inviteeDate: date, - workingHours: responseBody.workingHours, - minimumBookingNotice, - eventLength, - }); - const filterTimeProps = { - times, - busy: responseBody.busy, - eventLength, - beforeBufferTime, - afterBufferTime, - }; - const filteredTimes = getFilteredTimes(filterTimeProps); - // temporary - const user = res.url.substring(res.url.lastIndexOf("/") + 1, res.url.indexOf("?")); - return filteredTimes.map((time) => ({ - time, - users: [user], - })); - }; + }, [ + afterBufferTime, + beforeBufferTime, + eventLength, + minimumBookingNotice, + slotInterval, + eventTypeId, + props.schedulingType, + users, + date, + ]); return { slots, diff --git a/apps/web/pages/404.tsx b/apps/web/pages/404.tsx index 45ca57c2..6a00ece9 100644 --- a/apps/web/pages/404.tsx +++ b/apps/web/pages/404.tsx @@ -35,7 +35,7 @@ export default function Custom404() { const [url, setUrl] = useState("https://cal.com/signup?username="); useEffect(() => { setUrl(`https://cal.com/signup?username=${username.replace("/", "")}`); - }, [router.query]); + }, [username, router.query]); const isSubpage = router.asPath.includes("/", 2); const isSignup = router.asPath.includes("/signup"); diff --git a/apps/web/pages/500.tsx b/apps/web/pages/500.tsx index 3ebc6b87..bb32c17a 100644 --- a/apps/web/pages/500.tsx +++ b/apps/web/pages/500.tsx @@ -11,7 +11,12 @@ export default function Error500() {

- 50 + 5 + { + // eslint-disable-next-line @next/next/no-img-element + 0 + } + 0

It's not you, it's us.

diff --git a/apps/web/pages/auth/error.tsx b/apps/web/pages/auth/error.tsx index c9febbca..9ad15b53 100644 --- a/apps/web/pages/auth/error.tsx +++ b/apps/web/pages/auth/error.tsx @@ -32,7 +32,7 @@ export default function Error() {

- +
diff --git a/apps/web/pages/auth/forgot-password/[id].tsx b/apps/web/pages/auth/forgot-password/[id].tsx index b7bae37b..6bbdf86a 100644 --- a/apps/web/pages/auth/forgot-password/[id].tsx +++ b/apps/web/pages/auth/forgot-password/[id].tsx @@ -63,13 +63,16 @@ export default function Page({ resetPasswordRequest, csrfToken }: Props) {

{t("password_has_been_reset_login")}

- - - + { + // eslint-disable-next-line @next/next/link-passhref + + + + } ); @@ -84,7 +87,7 @@ export default function Page({ resetPasswordRequest, csrfToken }: Props) {

{t("request_is_expired")}

{t("request_is_expired_instructions")}

- + diff --git a/apps/web/pages/auth/sso/[provider].tsx b/apps/web/pages/auth/sso/[provider].tsx index 8627edd9..1c8e914d 100644 --- a/apps/web/pages/auth/sso/[provider].tsx +++ b/apps/web/pages/auth/sso/[provider].tsx @@ -38,7 +38,7 @@ export default function Provider(props: SSOProviderPageProps) { } else { signIn(props.provider); } - }, []); + }, [props.isSAMLLoginEnabled, props.product, props.provider, props.tenant, router]); return null; } diff --git a/apps/web/pages/availability/troubleshoot.tsx b/apps/web/pages/availability/troubleshoot.tsx index 2b223073..9d6330cc 100644 --- a/apps/web/pages/availability/troubleshoot.tsx +++ b/apps/web/pages/availability/troubleshoot.tsx @@ -48,7 +48,7 @@ const AvailabilityView = ({ user }: { user: User }) => { }); }; fetchAvailability(selectedDate); - }, [selectedDate]); + }, [user.username, selectedDate]); return (
diff --git a/apps/web/pages/event-types/[type].tsx b/apps/web/pages/event-types/[type].tsx index 87e55076..a88cb3c5 100644 --- a/apps/web/pages/event-types/[type].tsx +++ b/apps/web/pages/event-types/[type].tsx @@ -329,6 +329,7 @@ const EventTypePage = (props: inferSSRProps) => { fetchTokens(); !hashedUrl && setHashedUrl(generateHashedLink(eventType.users[0].id)); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function deleteEventTypeHandler(event: React.MouseEvent) { diff --git a/apps/web/pages/getting-started.tsx b/apps/web/pages/getting-started.tsx index e14d6bf7..b8313674 100644 --- a/apps/web/pages/getting-started.tsx +++ b/apps/web/pages/getting-started.tsx @@ -12,7 +12,7 @@ import { NextPageContext } from "next"; import { useSession } from "next-auth/react"; import Head from "next/head"; import { useRouter } from "next/router"; -import React, { useEffect, useRef, useState } from "react"; +import React, { useEffect, useRef, useState, useCallback } from "react"; import { useForm } from "react-hook-form"; import TimezoneSelect from "react-timezone-select"; import * as z from "zod"; @@ -102,21 +102,24 @@ export default function Onboarding(props: inferSSRProps(null); - const updateUser = async (data: Prisma.UserUpdateInput) => { - const res = await fetch(`/api/user/${props.user.id}`, { - method: "PATCH", - body: JSON.stringify({ data: { ...data } }), - headers: { - "Content-Type": "application/json", - }, - }); + const updateUser = useCallback( + async (data: Prisma.UserUpdateInput) => { + const res = await fetch(`/api/user/${props.user.id}`, { + method: "PATCH", + body: JSON.stringify({ data: { ...data } }), + headers: { + "Content-Type": "application/json", + }, + }); - if (!res.ok) { - throw new Error((await res.json()).message); - } - const responseData = await res.json(); - return responseData.data; - }; + if (!res.ok) { + throw new Error((await res.json()).message); + } + const responseData = await res.json(); + return responseData.data; + }, + [props.user.id] + ); const createEventType = async (data: Prisma.EventTypeCreateInput) => { const res = await fetch(`/api/availability/eventtype`, { @@ -288,7 +291,7 @@ export default function Onboarding(props: inferSSRProps - {giphyImage && !needsConfirmation && {"Gif} + {giphyImage && !needsConfirmation && ( + // eslint-disable-next-line @next/next/no-img-element + {"Gif + )} {!giphyImage && !needsConfirmation && ( )} diff --git a/apps/web/pages/video/[uid].tsx b/apps/web/pages/video/[uid].tsx index 488dc0d4..5353ae9b 100644 --- a/apps/web/pages/video/[uid].tsx +++ b/apps/web/pages/video/[uid].tsx @@ -96,8 +96,14 @@ export default function JoinCall(props: JoinCallPageProps) { token: props.booking.dailyRef?.dailytoken, }); } - }, []); - + }, [ + emptyBooking, + meetingUnavailable, + props.booking?.dailyRef?.dailytoken, + props.booking?.dailyRef?.dailyurl, + props.booking?.user?.id, + session?.userid, + ]); return ( <> @@ -116,16 +122,19 @@ export default function JoinCall(props: JoinCallPageProps) {
- - Cal.com Logo + + { + // eslint-disable-next-line @next/next/no-img-element + Cal.com Logo + } {JoinCall}
diff --git a/apps/web/public/cal-logo-word-dark.svg b/apps/web/public/cal-logo-word-dark.svg new file mode 100644 index 00000000..e12d2875 --- /dev/null +++ b/apps/web/public/cal-logo-word-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/app-store/googlevideo/_metadata.ts b/packages/app-store/googlevideo/_metadata.ts index 32889bc4..aa1e85ee 100644 --- a/packages/app-store/googlevideo/_metadata.ts +++ b/packages/app-store/googlevideo/_metadata.ts @@ -12,9 +12,9 @@ export const metadata = { category: "video", type: "google_video", title: "Google Meet", - imageSrc: "https://cdn.iconscout.com/icon/free/png-256/google-meet-2923654-2416657.png", + imageSrc: "/api/app-store/googlevideo/logo.webp", variant: "conferencing", - logo: "https://cdn.iconscout.com/icon/free/png-256/google-meet-2923654-2416657.png", + logo: "/api/app-store/googlevideo/logo.webp", publisher: "Cal.com", rating: 5, reviews: 69, diff --git a/packages/app-store/googlevideo/static/logo.webp b/packages/app-store/googlevideo/static/logo.webp new file mode 100644 index 00000000..5443580f Binary files /dev/null and b/packages/app-store/googlevideo/static/logo.webp differ diff --git a/packages/app-store/metamask/_metadata.ts b/packages/app-store/metamask/_metadata.ts index 784d5bd1..5a73508c 100644 --- a/packages/app-store/metamask/_metadata.ts +++ b/packages/app-store/metamask/_metadata.ts @@ -14,7 +14,7 @@ export const metadata = { rating: 5, reviews: 69, slug: "metamask", - title: "Meta Mask", + title: "MetaMask", trending: true, type: "metamask_web3", url: "https://cal.com/", diff --git a/packages/app-store/wipemycalother/_metadata.ts b/packages/app-store/wipemycalother/_metadata.ts index 7371fde5..67432309 100644 --- a/packages/app-store/wipemycalother/_metadata.ts +++ b/packages/app-store/wipemycalother/_metadata.ts @@ -8,8 +8,8 @@ export const metadata = { installed: true, category: "other", // If using static next public folder, can then be referenced from the base URL (/). - imageSrc: "/api/app-store/_example/icon.svg", - logo: "/api/app-store/_example/icon.svg", + imageSrc: "/api/app-store/wipemycalother/icon.svg", + logo: "/api/app-store/wipemycalother/icon.svg", publisher: "Cal.com", rating: 0, reviews: 0, diff --git a/packages/ui/Button.tsx b/packages/ui/Button.tsx index 664a269f..de3561c7 100644 --- a/packages/ui/Button.tsx +++ b/packages/ui/Button.tsx @@ -94,7 +94,7 @@ export const Button = forwardRef )}