From 9be12f28d95ab14bd8ba843b86cbb67aedb18e59 Mon Sep 17 00:00:00 2001 From: Luke Vella Date: Tue, 15 Jul 2025 11:18:28 +0100 Subject: [PATCH] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Upgrade=20to=20biome=202?= =?UTF-8?q?=20(#1825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/[locale]/(main)/blog/[slug]/page.tsx | 2 +- .../[locale]/(main)/cookie-policy/page.tsx | 70 ++-- .../src/app/[locale]/(main)/layout.tsx | 6 +- .../[locale]/(main)/open-source-banner.tsx | 5 +- .../[locale]/(main)/privacy-policy/page.tsx | 203 +++++----- apps/landing/src/app/[locale]/layout.tsx | 5 +- .../app/[locale]/licensing/thank-you/page.tsx | 2 +- apps/landing/src/app/api/og-image/route.tsx | 1 + apps/landing/src/components/home/hero.tsx | 3 +- apps/landing/src/components/login-button.tsx | 4 +- .../landing/src/components/sign-up-button.tsx | 4 +- apps/landing/src/lib/api.ts | 1 - apps/web/src/app/[locale]/(auth)/layout.tsx | 2 +- .../login/components/login-email-form.tsx | 4 +- .../(auth)/login/components/sso-provider.tsx | 2 +- .../src/app/[locale]/(auth)/login/page.tsx | 3 +- .../src/app/[locale]/(auth)/register/page.tsx | 5 +- .../register/verify/components/otp-form.tsx | 2 +- .../[locale]/(space)/account/billing/page.tsx | 6 +- .../account/components/sign-out-button.tsx | 2 +- .../(space)/account/profile/actions.ts | 4 +- .../[locale]/(space)/account/profile/page.tsx | 3 +- .../account/profile/profile-email-address.tsx | 3 +- .../account/profile/profile-picture.tsx | 3 +- .../components/sidebar/space-sidebar-menu.tsx | 2 +- .../components/sidebar/space-sidebar.tsx | 18 +- .../src/app/[locale]/(space)/events/page.tsx | 3 +- .../app/[locale]/(space)/feedback-alert.tsx | 5 +- apps/web/src/app/[locale]/(space)/layout.tsx | 3 +- apps/web/src/app/[locale]/(space)/page.tsx | 3 +- .../(space)/polls/polls-tabbed-view.tsx | 7 +- .../src/app/[locale]/(space)/polls/schema.ts | 2 +- .../src/app/[locale]/admin-setup/actions.ts | 3 +- .../admin-setup/make-me-admin-button.tsx | 2 +- .../web/src/app/[locale]/admin-setup/page.tsx | 10 +- .../src/app/[locale]/control-panel/layout.tsx | 6 +- .../[locale]/control-panel/license/page.tsx | 34 +- .../src/app/[locale]/control-panel/page.tsx | 20 +- .../settings/instance-settings-form.tsx | 28 +- .../[locale]/control-panel/settings/page.tsx | 2 +- .../users/dialogs/delete-user-dialog.tsx | 8 +- .../app/[locale]/control-panel/users/page.tsx | 8 +- .../[locale]/control-panel/users/user-row.tsx | 14 +- .../control-panel/users/users-tabbed-view.tsx | 7 +- .../src/app/[locale]/invite/[urlId]/page.tsx | 2 +- apps/web/src/app/[locale]/layout.tsx | 9 +- apps/web/src/app/[locale]/new/page.tsx | 3 +- .../poll/[urlId]/edit-details/page.tsx | 2 +- .../poll/[urlId]/edit-options/page.tsx | 2 +- .../src/app/[locale]/poll/[urlId]/layout.tsx | 2 +- .../src/app/[locale]/quick-create/page.tsx | 2 +- .../src/app/api/auth/[...nextauth]/route.ts | 2 +- .../app/api/licensing/v1/[...route]/route.ts | 18 +- .../src/app/api/stripe/buy-license/route.ts | 2 +- .../webhook/handlers/checkout/completed.ts | 6 +- apps/web/src/app/api/stripe/webhook/route.ts | 4 +- apps/web/src/app/components/page-icons.tsx | 2 +- apps/web/src/auth/adapters/prisma.ts | 3 +- apps/web/src/auth/edge/with-auth.ts | 2 +- apps/web/src/auth/helpers/merge-user.ts | 10 +- apps/web/src/auth/queries.ts | 4 +- apps/web/src/components/create-poll.tsx | 4 +- .../src/components/discussion/discussion.tsx | 4 +- apps/web/src/components/event-card.tsx | 3 +- .../poll-options-form/dayjs-localizer.ts | 3 +- .../month-calendar/month-calendar.tsx | 5 +- .../poll-options-form/poll-options-form.tsx | 360 +++++++++--------- .../forms/poll-options-form/rbc-overrides.css | 13 +- .../forms/poll-options-form/week-calendar.tsx | 1 + apps/web/src/components/full-width-layout.tsx | 13 +- .../src/components/new-participant-modal.tsx | 3 +- apps/web/src/components/participant.tsx | 1 + apps/web/src/components/poll-context.tsx | 2 - .../desktop-poll/participant-row-form.tsx | 3 +- .../poll/desktop-poll/poll-header.tsx | 3 +- .../poll/manage-poll/finalize-poll-dialog.tsx | 3 - apps/web/src/components/poll/mobile-poll.tsx | 2 +- .../poll/mobile-poll/poll-option.tsx | 5 +- .../poll/mobile-poll/poll-options.tsx | 3 +- apps/web/src/components/poll/mutations.ts | 4 +- .../src/components/poll/scheduled-event.tsx | 3 +- apps/web/src/components/poll/vote-icon.tsx | 5 +- apps/web/src/components/settings-group.tsx | 16 +- apps/web/src/components/user-provider.tsx | 2 +- apps/web/src/contexts/environment.tsx | 4 +- .../src/features/ability-manager/ability.ts | 2 +- .../feedback/components/feedback-toggle.tsx | 7 +- .../features/instance-settings/mutations.ts | 2 +- .../licensing/actions/validate-license.ts | 2 +- .../licensing/components/license-key-form.tsx | 6 +- .../components/license-limit-warning.tsx | 2 +- .../components/remove-license-button.tsx | 2 +- .../licensing/lib/licensing-client.ts | 2 +- apps/web/src/features/licensing/mutations.ts | 6 +- .../moderation/libs/pattern-moderation.ts | 4 +- .../navigation/command-menu/command-menu.tsx | 10 +- apps/web/src/features/poll/api/get-polls.ts | 2 +- apps/web/src/features/safe-action/client.ts | 2 +- apps/web/src/features/safe-action/server.ts | 4 +- .../src/features/scheduled-event/actions.ts | 4 +- .../components/scheduled-event-list.tsx | 10 +- .../src/features/scheduled-event/queries.ts | 3 +- apps/web/src/features/spaces/actions.ts | 4 +- apps/web/src/features/spaces/client.tsx | 7 +- .../spaces/components/new-space-dialog.tsx | 8 +- .../spaces/components/space-dropdown.tsx | 8 +- apps/web/src/features/spaces/queries.ts | 4 +- apps/web/src/features/timezone/utils.ts | 1 - apps/web/src/features/user/actions.ts | 2 +- apps/web/src/features/user/mutations.ts | 2 +- apps/web/src/i18n/i18n.ts | 2 +- apps/web/src/next-auth.config.ts | 2 +- apps/web/src/next-auth.ts | 2 +- apps/web/src/style.css | 4 +- apps/web/src/trpc/client/provider.tsx | 6 +- apps/web/src/trpc/routers/auth.ts | 8 +- apps/web/src/trpc/routers/polls.ts | 10 +- apps/web/src/trpc/trpc.ts | 2 +- apps/web/src/types.ts | 2 +- apps/web/src/utils/dayjs.tsx | 4 +- apps/web/src/utils/is-valid-name.ts | 2 +- apps/web/tests/test-utils.ts | 2 +- biome.json | 23 +- package.json | 2 +- .../database/prisma/seed/scheduled-events.ts | 5 +- .../emails/src/components/email-layout.tsx | 2 +- .../emails/src/templates/event-canceled.tsx | 2 +- .../emails/src/templates/finalized-host.tsx | 2 +- .../src/templates/finalized-participant.tsx | 2 +- .../languages/src/get-preferred-locale.ts | 2 +- packages/posthog/src/client.tsx | 1 + packages/ui/package.json | 2 + packages/ui/src/alert.tsx | 2 +- packages/ui/src/avatar.tsx | 2 +- packages/ui/src/badge.tsx | 2 +- packages/ui/src/dialog.tsx | 3 +- packages/ui/src/sheet.tsx | 2 +- packages/ui/src/sidebar.tsx | 1 + packages/ui/src/text-field.tsx | 93 ----- packages/utils/src/absolute-url.test.ts | 1 - pnpm-lock.yaml | 82 ++-- 141 files changed, 663 insertions(+), 790 deletions(-) delete mode 100644 packages/ui/src/text-field.tsx diff --git a/apps/landing/src/app/[locale]/(main)/blog/[slug]/page.tsx b/apps/landing/src/app/[locale]/(main)/blog/[slug]/page.tsx index 3942fdc50..4bd32b927 100644 --- a/apps/landing/src/app/[locale]/(main)/blog/[slug]/page.tsx +++ b/apps/landing/src/app/[locale]/(main)/blog/[slug]/page.tsx @@ -1,8 +1,8 @@ import { absoluteUrl } from "@rallly/utils/absolute-url"; import { ArrowLeftIcon } from "lucide-react"; -import { MDXRemote } from "next-mdx-remote/rsc"; import Image from "next/image"; import Link from "next/link"; +import { MDXRemote } from "next-mdx-remote/rsc"; import PostHeader from "@/components/blog/post-header"; import { getAllPosts, getPostBySlug } from "@/lib/api"; diff --git a/apps/landing/src/app/[locale]/(main)/cookie-policy/page.tsx b/apps/landing/src/app/[locale]/(main)/cookie-policy/page.tsx index cfa77df0c..ea469e621 100644 --- a/apps/landing/src/app/[locale]/(main)/cookie-policy/page.tsx +++ b/apps/landing/src/app/[locale]/(main)/cookie-policy/page.tsx @@ -1,45 +1,43 @@ export default function CookiePolicy() { return ( - <> -
-

Cookie Policy

-

Last updated: 19 April 2023

-

- This Policy explains how we use cookies and other similar technologies - on our website, and your options to control them. -

+
+

Cookie Policy

+

Last updated: 19 April 2023

+

+ This Policy explains how we use cookies and other similar technologies + on our website, and your options to control them. +

-

What are cookies?

-

- Cookies are small text files that are placed on your device (e.g. - computer, tablet, or smartphone) when you visit a website. Cookies are - widely used by website owners to make their websites work, or to work - more efficiently, as well as to provide reporting information. -

+

What are cookies?

+

+ Cookies are small text files that are placed on your device (e.g. + computer, tablet, or smartphone) when you visit a website. Cookies are + widely used by website owners to make their websites work, or to work + more efficiently, as well as to provide reporting information. +

-

How we use cookies

-

- We use only essential cookies on our website, which are necessary for - our website to function properly and enable you to access secure areas - of the website. -

+

How we use cookies

+

+ We use only essential cookies on our website, which are necessary for + our website to function properly and enable you to access secure areas + of the website. +

-

Your options

-

- Most web browsers allow you to control cookies through their settings - preferences. However, please be aware that disabling essential cookies - may prevent you from accessing certain parts of our website. -

+

Your options

+

+ Most web browsers allow you to control cookies through their settings + preferences. However, please be aware that disabling essential cookies + may prevent you from accessing certain parts of our website. +

-

Changes to this policy

-

- We may update this Cookie Policy from time to time to reflect changes - in our website or relevant regulations. We encourage you to review - this policy regularly to stay informed about how we use cookies on our - website. -

-
- +

Changes to this policy

+

+ We may update this Cookie Policy from time to time to reflect changes in + our website or relevant regulations. We encourage you to review this + policy regularly to stay informed about how we use cookies on our + website. +

+
); } diff --git a/apps/landing/src/app/[locale]/(main)/layout.tsx b/apps/landing/src/app/[locale]/(main)/layout.tsx index 4d1c211bf..4393ae000 100644 --- a/apps/landing/src/app/[locale]/(main)/layout.tsx +++ b/apps/landing/src/app/[locale]/(main)/layout.tsx @@ -14,12 +14,10 @@ import type { Viewport } from "next"; import Image from "next/image"; import Link from "next/link"; import { Trans } from "react-i18next/TransWithoutContext"; - -import { getTranslation } from "@/i18n/server"; -import { linkToApp } from "@/lib/linkToApp"; - import { LoginButton } from "@/components/login-button"; import { SignUpButton } from "@/components/sign-up-button"; +import { getTranslation } from "@/i18n/server"; +import { linkToApp } from "@/lib/linkToApp"; import { Footer } from "./footer"; import { NavLink } from "./nav-link"; diff --git a/apps/landing/src/app/[locale]/(main)/open-source-banner.tsx b/apps/landing/src/app/[locale]/(main)/open-source-banner.tsx index 69c162d42..11ea881ee 100644 --- a/apps/landing/src/app/[locale]/(main)/open-source-banner.tsx +++ b/apps/landing/src/app/[locale]/(main)/open-source-banner.tsx @@ -1,11 +1,10 @@ "use client"; +import { cn } from "@rallly/ui"; import { ArrowUpRightIcon } from "lucide-react"; - +import React from "react"; import GithubIcon from "@/assets/github.svg"; import { Trans } from "@/i18n/client/trans"; -import { cn } from "@rallly/ui"; -import React from "react"; export function OpenSourceBanner() { const [visible, setVisible] = React.useState(true); diff --git a/apps/landing/src/app/[locale]/(main)/privacy-policy/page.tsx b/apps/landing/src/app/[locale]/(main)/privacy-policy/page.tsx index 503e9f31a..2143e521e 100644 --- a/apps/landing/src/app/[locale]/(main)/privacy-policy/page.tsx +++ b/apps/landing/src/app/[locale]/(main)/privacy-policy/page.tsx @@ -1,125 +1,122 @@ export default function PrivacyPolicy() { return ( - <> -
-

Privacy Policy

-

Last updated: 1 August 2023

-

- At rallly.co, we take your privacy seriously. This privacy policy - explains how we collect, use, and disclose your personal data, and - your rights in relation to your personal data under the General Data - Protection Regulation (GDPR). -

+
+

Privacy Policy

+

Last updated: 1 August 2023

+

+ At rallly.co, we take your privacy seriously. This privacy policy + explains how we collect, use, and disclose your personal data, and your + rights in relation to your personal data under the General Data + Protection Regulation (GDPR). +

-

Information we collect

+

Information we collect

-

- We store personal data (names and email addresses) on - DigitalOcean's servers, which are located in the United States. - The reason for storing data in the US is to improve performance for - users by having the data stored closer to where our compute services - are running. By using our services, you acknowledge that your personal - data may be transferred to and stored in the United States. -

+

+ We store personal data (names and email addresses) on + DigitalOcean's servers, which are located in the United States. The + reason for storing data in the US is to improve performance for users by + having the data stored closer to where our compute services are running. + By using our services, you acknowledge that your personal data may be + transferred to and stored in the United States. +

-

- We collect this information to enable the functionality of our - website, and to provide support and communication to our users. We - also use Posthog as a data processor to analyze trends and debug - issues. -

+

+ We collect this information to enable the functionality of our website, + and to provide support and communication to our users. We also use + Posthog as a data processor to analyze trends and debug issues. +

-

- Posthog collects certain properties automatically, such as device - information and IP address, to help us understand how the website is - being used and to identify and resolve any issues. This information is - stored securely on Posthog's EU based servers and is used solely - for the purpose of providing and improving the functionality of the - website. -

+

+ Posthog collects certain properties automatically, such as device + information and IP address, to help us understand how the website is + being used and to identify and resolve any issues. This information is + stored securely on Posthog's EU based servers and is used solely + for the purpose of providing and improving the functionality of the + website. +

-

Legal basis for processing

+

Legal basis for processing

-

- We process your personal data on the legal bases of consent and - contract. By using our website, you consent to the collection and use - of your personal data as described in this privacy policy. We process - your personal data to provide you with our services, and to fulfill - our contractual obligations to you. -

+

+ We process your personal data on the legal bases of consent and + contract. By using our website, you consent to the collection and use of + your personal data as described in this privacy policy. We process your + personal data to provide you with our services, and to fulfill our + contractual obligations to you. +

-

Retention of personal data

+

Retention of personal data

-

- We retain your personal data only for as long as necessary to provide - our services to you, and for as long as required by law. We will - delete your personal data when you delete your account or when it is - no longer necessary for the purposes for which it was collected. -

+

+ We retain your personal data only for as long as necessary to provide + our services to you, and for as long as required by law. We will delete + your personal data when you delete your account or when it is no longer + necessary for the purposes for which it was collected. +

-

Sharing of personal data

+

Sharing of personal data

-

- We do not share your personal data with any third parties for - marketing or commercial purposes. We may share your personal data with - third parties to provide you with our services, to comply with - applicable laws and regulations, to respond to a subpoena, search - warrant or other lawful request for information we receive, or to - otherwise protect our rights. -

+

+ We do not share your personal data with any third parties for marketing + or commercial purposes. We may share your personal data with third + parties to provide you with our services, to comply with applicable laws + and regulations, to respond to a subpoena, search warrant or other + lawful request for information we receive, or to otherwise protect our + rights. +

-

- For example, we use Featurebase to make it easy for users to submit - feedback. Your name and email may be shared with Featurbase to provide - a seamless transition between the two services. -

+

+ For example, we use Featurebase to make it easy for users to submit + feedback. Your name and email may be shared with Featurbase to provide a + seamless transition between the two services. +

-

Your rights

+

Your rights

-

You have the following rights in relation to your personal data:

+

You have the following rights in relation to your personal data:

-
    -
  • - Right to access: You have the right to access the personal data we - hold about you. -
  • -
  • - Right to rectification: You have the right to have inaccurate - personal data corrected or completed if it is incomplete. -
  • -
  • - Right to erasure: You have the right to request that we delete your - personal data. -
  • -
  • - Right to restrict processing: You have the right to request that we - restrict the processing of your personal data. -
  • -
  • - Right to data portability: You have the right to receive the - personal data we hold about you in a structured, commonly used, and - machine-readable format, and to transmit it to another controller. -
  • -
  • - Right to object: You have the right to object to the processing of - your personal data in certain circumstances. -
  • -
+
    +
  • + Right to access: You have the right to access the personal data we + hold about you. +
  • +
  • + Right to rectification: You have the right to have inaccurate personal + data corrected or completed if it is incomplete. +
  • +
  • + Right to erasure: You have the right to request that we delete your + personal data. +
  • +
  • + Right to restrict processing: You have the right to request that we + restrict the processing of your personal data. +
  • +
  • + Right to data portability: You have the right to receive the personal + data we hold about you in a structured, commonly used, and + machine-readable format, and to transmit it to another controller. +
  • +
  • + Right to object: You have the right to object to the processing of + your personal data in certain circumstances. +
  • +
-

- To exercise any of these rights, please contact us at{" "} - support@rallly.co. -

+

+ To exercise any of these rights, please contact us at{" "} + support@rallly.co. +

-

Contact

+

Contact

-

- If you have any questions or concerns about our privacy policy or our - practices with regards to your personal data, please contact us at{" "} - support@rallly.co. -

-
- +

+ If you have any questions or concerns about our privacy policy or our + practices with regards to your personal data, please contact us at{" "} + support@rallly.co. +

+
); } diff --git a/apps/landing/src/app/[locale]/layout.tsx b/apps/landing/src/app/[locale]/layout.tsx index 8bedc0012..72c1baaf2 100644 --- a/apps/landing/src/app/[locale]/layout.tsx +++ b/apps/landing/src/app/[locale]/layout.tsx @@ -1,14 +1,13 @@ import "../../style.css"; import languages from "@rallly/languages"; +import { PostHogProvider } from "@rallly/posthog/client"; import { Analytics } from "@vercel/analytics/react"; -import { LazyMotion, domAnimation } from "motion/react"; +import { domAnimation, LazyMotion } from "motion/react"; import type { Viewport } from "next"; - import { PostHogPageView } from "@/components/posthog-page-view"; import { sans } from "@/fonts/sans"; import { I18nProvider } from "@/i18n/client/i18n-provider"; -import { PostHogProvider } from "@rallly/posthog/client"; export async function generateStaticParams() { return Object.keys(languages).map((locale) => ({ locale })); diff --git a/apps/landing/src/app/[locale]/licensing/thank-you/page.tsx b/apps/landing/src/app/[locale]/licensing/thank-you/page.tsx index 3bcf8541d..9d4c5571f 100644 --- a/apps/landing/src/app/[locale]/licensing/thank-you/page.tsx +++ b/apps/landing/src/app/[locale]/licensing/thank-you/page.tsx @@ -1,6 +1,6 @@ -import { Trans } from "@/i18n/client/trans"; import Image from "next/image"; import Link from "next/link"; +import { Trans } from "@/i18n/client/trans"; export default function LicensingThankYouPage() { return ( diff --git a/apps/landing/src/app/api/og-image/route.tsx b/apps/landing/src/app/api/og-image/route.tsx index ca1935421..c0faf614a 100644 --- a/apps/landing/src/app/api/og-image/route.tsx +++ b/apps/landing/src/app/api/og-image/route.tsx @@ -36,6 +36,7 @@ export async function GET(req: NextRequest) {
+ {/** biome-ignore lint/performance/noImgElement: it's ok to use img here */} Rallly { const [isLoaded, setIsLoaded] = React.useState(false); diff --git a/apps/landing/src/components/login-button.tsx b/apps/landing/src/components/login-button.tsx index c772a311f..ccba8a081 100644 --- a/apps/landing/src/components/login-button.tsx +++ b/apps/landing/src/components/login-button.tsx @@ -1,10 +1,10 @@ "use client"; -import { Trans } from "@/i18n/client/trans"; -import { linkToApp } from "@/lib/linkToApp"; import { usePostHog } from "@rallly/posthog/client"; import { Button } from "@rallly/ui/button"; import Link from "next/link"; +import { Trans } from "@/i18n/client/trans"; +import { linkToApp } from "@/lib/linkToApp"; export const LoginButton = () => { const posthog = usePostHog(); diff --git a/apps/landing/src/components/sign-up-button.tsx b/apps/landing/src/components/sign-up-button.tsx index c0042306d..564ad46ae 100644 --- a/apps/landing/src/components/sign-up-button.tsx +++ b/apps/landing/src/components/sign-up-button.tsx @@ -1,10 +1,10 @@ "use client"; -import { Trans } from "@/i18n/client/trans"; -import { linkToApp } from "@/lib/linkToApp"; import { usePostHog } from "@rallly/posthog/client"; import { Button } from "@rallly/ui/button"; import Link from "next/link"; +import { Trans } from "@/i18n/client/trans"; +import { linkToApp } from "@/lib/linkToApp"; export function SignUpButton() { const posthog = usePostHog(); diff --git a/apps/landing/src/lib/api.ts b/apps/landing/src/lib/api.ts index acf8fdaad..d317b2242 100644 --- a/apps/landing/src/lib/api.ts +++ b/apps/landing/src/lib/api.ts @@ -21,7 +21,6 @@ export function getPostBySlug(slug: string, fields: string[] = []) { const items: Items = {}; // Ensure only the minimal needed data is exposed - // biome-ignore lint/complexity/noForEach: Fix this later fields.forEach((field) => { if (field === "slug") { items[field] = realSlug; diff --git a/apps/web/src/app/[locale]/(auth)/layout.tsx b/apps/web/src/app/[locale]/(auth)/layout.tsx index 989ae6acb..940d6702d 100644 --- a/apps/web/src/app/[locale]/(auth)/layout.tsx +++ b/apps/web/src/app/[locale]/(auth)/layout.tsx @@ -2,9 +2,9 @@ import { cn } from "@rallly/ui"; import { DotPattern } from "@rallly/ui/dot-pattern"; import { + isQuickCreateEnabled, QuickCreateButton, QuickCreateWidget, - isQuickCreateEnabled, } from "@/features/quick-create"; export default async function Layout({ diff --git a/apps/web/src/app/[locale]/(auth)/login/components/login-email-form.tsx b/apps/web/src/app/[locale]/(auth)/login/components/login-email-form.tsx index a42df5819..c64af0ca7 100644 --- a/apps/web/src/app/[locale]/(auth)/login/components/login-email-form.tsx +++ b/apps/web/src/app/[locale]/(auth)/login/components/login-email-form.tsx @@ -10,8 +10,8 @@ import { FormMessage, } from "@rallly/ui/form"; import { Input } from "@rallly/ui/input"; -import { signIn } from "next-auth/react"; import { useRouter, useSearchParams } from "next/navigation"; +import { signIn } from "next-auth/react"; import React from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; @@ -70,7 +70,7 @@ export function LoginWithEmailForm() { : "" }`, ); - } catch (e) { + } catch (_e) { form.setError("identifier", { message: t("userNotFound", { defaultValue: "A user with that email doesn't exist", diff --git a/apps/web/src/app/[locale]/(auth)/login/components/sso-provider.tsx b/apps/web/src/app/[locale]/(auth)/login/components/sso-provider.tsx index 8c7b841fb..7c7c3e84c 100644 --- a/apps/web/src/app/[locale]/(auth)/login/components/sso-provider.tsx +++ b/apps/web/src/app/[locale]/(auth)/login/components/sso-provider.tsx @@ -2,8 +2,8 @@ import { Button } from "@rallly/ui/button"; import { Icon } from "@rallly/ui/icon"; import { UserIcon } from "lucide-react"; -import { signIn } from "next-auth/react"; import Image from "next/image"; +import { signIn } from "next-auth/react"; import { Trans } from "@/components/trans"; import { useTranslation } from "@/i18n/client"; diff --git a/apps/web/src/app/[locale]/(auth)/login/page.tsx b/apps/web/src/app/[locale]/(auth)/login/page.tsx index 9be81d6a5..b9e2bbc1a 100644 --- a/apps/web/src/app/[locale]/(auth)/login/page.tsx +++ b/apps/web/src/app/[locale]/(auth)/login/page.tsx @@ -3,9 +3,8 @@ import { Trans } from "react-i18next/TransWithoutContext"; import { GoogleProvider } from "@/auth/providers/google"; import { MicrosoftProvider } from "@/auth/providers/microsoft"; import { OIDCProvider } from "@/auth/providers/oidc"; -import { getTranslation } from "@/i18n/server"; - import { getInstanceSettings } from "@/features/instance-settings/queries"; +import { getTranslation } from "@/i18n/server"; import { AuthPageContainer, AuthPageContent, diff --git a/apps/web/src/app/[locale]/(auth)/register/page.tsx b/apps/web/src/app/[locale]/(auth)/register/page.tsx index 3f2621473..0f46f40bf 100644 --- a/apps/web/src/app/[locale]/(auth)/register/page.tsx +++ b/apps/web/src/app/[locale]/(auth)/register/page.tsx @@ -1,9 +1,8 @@ +import { notFound } from "next/navigation"; import { Trans } from "react-i18next/TransWithoutContext"; -import { getTranslation } from "@/i18n/server"; - import { getInstanceSettings } from "@/features/instance-settings/queries"; -import { notFound } from "next/navigation"; +import { getTranslation } from "@/i18n/server"; import { AuthPageContainer, AuthPageContent, diff --git a/apps/web/src/app/[locale]/(auth)/register/verify/components/otp-form.tsx b/apps/web/src/app/[locale]/(auth)/register/verify/components/otp-form.tsx index 5a492ca62..5520ec165 100644 --- a/apps/web/src/app/[locale]/(auth)/register/verify/components/otp-form.tsx +++ b/apps/web/src/app/[locale]/(auth)/register/verify/components/otp-form.tsx @@ -10,8 +10,8 @@ import { FormItem, FormMessage, } from "@rallly/ui/form"; -import { signIn } from "next-auth/react"; import { useSearchParams } from "next/navigation"; +import { signIn } from "next-auth/react"; import { useForm } from "react-hook-form"; import { z } from "zod"; diff --git a/apps/web/src/app/[locale]/(space)/account/billing/page.tsx b/apps/web/src/app/[locale]/(space)/account/billing/page.tsx index 1f3a1a49c..33aae8166 100644 --- a/apps/web/src/app/[locale]/(space)/account/billing/page.tsx +++ b/apps/web/src/app/[locale]/(space)/account/billing/page.tsx @@ -14,7 +14,7 @@ import { } from "lucide-react"; import Link from "next/link"; import { notFound, redirect } from "next/navigation"; - +import { requireUser } from "@/auth/queries"; import { DescriptionDetails, DescriptionList, @@ -30,10 +30,8 @@ import { import { PayWallDialog } from "@/components/pay-wall-dialog"; import { Trans } from "@/components/trans"; import { FormattedDateTime } from "@/features/timezone/client/formatted-date-time"; -import { isSelfHosted } from "@/utils/constants"; - -import { requireUser } from "@/auth/queries"; import { getTranslation } from "@/i18n/server"; +import { isSelfHosted } from "@/utils/constants"; import { SettingsContent, SettingsSection, diff --git a/apps/web/src/app/[locale]/(space)/account/components/sign-out-button.tsx b/apps/web/src/app/[locale]/(space)/account/components/sign-out-button.tsx index cd80c0fe0..c2bdf66e0 100644 --- a/apps/web/src/app/[locale]/(space)/account/components/sign-out-button.tsx +++ b/apps/web/src/app/[locale]/(space)/account/components/sign-out-button.tsx @@ -1,11 +1,11 @@ "use client"; -import { Trans } from "@/components/trans"; import { usePostHog } from "@rallly/posthog/client"; import { Button } from "@rallly/ui/button"; import { Icon } from "@rallly/ui/icon"; import { LogOutIcon } from "lucide-react"; import { signOut } from "next-auth/react"; +import { Trans } from "@/components/trans"; export const SignOutButton = () => { const posthog = usePostHog(); diff --git a/apps/web/src/app/[locale]/(space)/account/profile/actions.ts b/apps/web/src/app/[locale]/(space)/account/profile/actions.ts index dd3aca198..9e23a3538 100644 --- a/apps/web/src/app/[locale]/(space)/account/profile/actions.ts +++ b/apps/web/src/app/[locale]/(space)/account/profile/actions.ts @@ -1,9 +1,9 @@ "use server"; -import { ActionError, authActionClient } from "@/features/safe-action/server"; -import { signOut } from "@/next-auth"; import { subject } from "@casl/ability"; import { prisma } from "@rallly/database"; +import { ActionError, authActionClient } from "@/features/safe-action/server"; +import { signOut } from "@/next-auth"; export const deleteCurrentUserAction = authActionClient .metadata({ actionName: "delete_current_user" }) diff --git a/apps/web/src/app/[locale]/(space)/account/profile/page.tsx b/apps/web/src/app/[locale]/(space)/account/profile/page.tsx index f116a0fe7..5a071dc06 100644 --- a/apps/web/src/app/[locale]/(space)/account/profile/page.tsx +++ b/apps/web/src/app/[locale]/(space)/account/profile/page.tsx @@ -3,10 +3,9 @@ import { DialogTrigger } from "@rallly/ui/dialog"; import { TrashIcon } from "lucide-react"; import type { Params } from "@/app/[locale]/types"; +import { requireUser } from "@/auth/queries"; import { Trans } from "@/components/trans"; import { getTranslation } from "@/i18n/server"; - -import { requireUser } from "@/auth/queries"; import { SettingsContent, SettingsSection, diff --git a/apps/web/src/app/[locale]/(space)/account/profile/profile-email-address.tsx b/apps/web/src/app/[locale]/(space)/account/profile/profile-email-address.tsx index 7a0d8f128..dc0d3fe50 100644 --- a/apps/web/src/app/[locale]/(space)/account/profile/profile-email-address.tsx +++ b/apps/web/src/app/[locale]/(space)/account/profile/profile-email-address.tsx @@ -13,17 +13,16 @@ import { FormMessage, } from "@rallly/ui/form"; import { Input } from "@rallly/ui/input"; +import { toast } from "@rallly/ui/sonner"; import Cookies from "js-cookie"; import { InfoIcon } from "lucide-react"; import React from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { z } from "zod"; - import { Trans } from "@/components/trans"; import { useUser } from "@/components/user-provider"; import { trpc } from "@/trpc/client"; -import { toast } from "@rallly/ui/sonner"; const emailChangeFormData = z.object({ email: z.string().email(), diff --git a/apps/web/src/app/[locale]/(space)/account/profile/profile-picture.tsx b/apps/web/src/app/[locale]/(space)/account/profile/profile-picture.tsx index 591a43029..0f05f0da0 100644 --- a/apps/web/src/app/[locale]/(space)/account/profile/profile-picture.tsx +++ b/apps/web/src/app/[locale]/(space)/account/profile/profile-picture.tsx @@ -2,16 +2,15 @@ import { usePostHog } from "@rallly/posthog/client"; import { Button } from "@rallly/ui/button"; +import { toast } from "@rallly/ui/sonner"; import React, { useState } from "react"; import { z } from "zod"; - import { OptimizedAvatarImage } from "@/components/optimized-avatar-image"; import { Trans } from "@/components/trans"; import { useUser } from "@/components/user-provider"; import { useFeatureFlag } from "@/features/feature-flags/client"; import { useTranslation } from "@/i18n/client"; import { trpc } from "@/trpc/client"; -import { toast } from "@rallly/ui/sonner"; const allowedMimeTypes = z.enum(["image/jpeg", "image/png"]); diff --git a/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar-menu.tsx b/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar-menu.tsx index ab99d1374..35ebeac11 100644 --- a/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar-menu.tsx +++ b/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar-menu.tsx @@ -1,6 +1,5 @@ "use client"; -import { useTranslation } from "@/i18n/client"; import { Icon } from "@rallly/ui/icon"; import { SidebarMenu, @@ -10,6 +9,7 @@ import { import { BarChart2Icon, CalendarIcon, HomeIcon } from "lucide-react"; import Link from "next/link"; import { usePathname } from "next/navigation"; +import { useTranslation } from "@/i18n/client"; const useSpaceMenuItems = () => { const { t } = useTranslation(); diff --git a/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar.tsx b/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar.tsx index eb805af3e..1680eb175 100644 --- a/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar.tsx +++ b/apps/web/src/app/[locale]/(space)/components/sidebar/space-sidebar.tsx @@ -1,12 +1,3 @@ -import { SpaceSidebarMenu } from "@/app/[locale]/(space)/components/sidebar/space-sidebar-menu"; -import { LogoLink } from "@/app/components/logo-link"; -import { getActiveSpace, requireUserAbility } from "@/auth/queries"; -import { Trans } from "@/components/trans"; -import { FeedbackToggle } from "@/features/feedback/components/feedback-toggle"; -import { SpaceDropdown } from "@/features/spaces/components/space-dropdown"; -import { SpaceIcon } from "@/features/spaces/components/space-icon"; -import { isSpacesEnabled } from "@/features/spaces/constants"; -import { loadSpaces } from "@/features/spaces/queries"; import { Button } from "@rallly/ui/button"; import { Icon } from "@rallly/ui/icon"; import { @@ -21,6 +12,15 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@rallly/ui/tooltip"; import { ChevronsUpDownIcon, PlusIcon, SparklesIcon } from "lucide-react"; import Link from "next/link"; import type React from "react"; +import { SpaceSidebarMenu } from "@/app/[locale]/(space)/components/sidebar/space-sidebar-menu"; +import { LogoLink } from "@/app/components/logo-link"; +import { getActiveSpace, requireUserAbility } from "@/auth/queries"; +import { Trans } from "@/components/trans"; +import { FeedbackToggle } from "@/features/feedback/components/feedback-toggle"; +import { SpaceDropdown } from "@/features/spaces/components/space-dropdown"; +import { SpaceIcon } from "@/features/spaces/components/space-icon"; +import { isSpacesEnabled } from "@/features/spaces/constants"; +import { loadSpaces } from "@/features/spaces/queries"; import { UpgradeButton } from "../upgrade-button"; import { NavUser } from "./nav-user"; diff --git a/apps/web/src/app/[locale]/(space)/events/page.tsx b/apps/web/src/app/[locale]/(space)/events/page.tsx index 90f68dd2b..31fc7bdb8 100644 --- a/apps/web/src/app/[locale]/(space)/events/page.tsx +++ b/apps/web/src/app/[locale]/(space)/events/page.tsx @@ -10,6 +10,7 @@ import { PageTitle, } from "@/app/components/page-layout"; import { SearchInput } from "@/app/components/search-input"; +import { getActiveSpace } from "@/auth/queries"; import { EmptyState, EmptyStateDescription, @@ -24,8 +25,6 @@ import { getScheduledEvents } from "@/features/scheduled-event/queries"; import type { Status } from "@/features/scheduled-event/schema"; import { statusSchema } from "@/features/scheduled-event/schema"; import { getTranslation } from "@/i18n/server"; - -import { getActiveSpace } from "@/auth/queries"; import { EventsTabbedView } from "./events-tabbed-view"; async function loadData({ diff --git a/apps/web/src/app/[locale]/(space)/feedback-alert.tsx b/apps/web/src/app/[locale]/(space)/feedback-alert.tsx index 8e213568d..42529aa28 100644 --- a/apps/web/src/app/[locale]/(space)/feedback-alert.tsx +++ b/apps/web/src/app/[locale]/(space)/feedback-alert.tsx @@ -1,11 +1,10 @@ "use client"; -import { useLocalStorage } from "react-use"; - -import { Trans } from "@/components/trans"; import { usePostHog } from "@rallly/posthog/client"; import { Button } from "@rallly/ui/button"; import { HeartIcon } from "lucide-react"; import Link from "next/link"; +import { useLocalStorage } from "react-use"; +import { Trans } from "@/components/trans"; export function FeedbackAlert() { const [value, setValue] = useLocalStorage("home_feedback_dismissed"); diff --git a/apps/web/src/app/[locale]/(space)/layout.tsx b/apps/web/src/app/[locale]/(space)/layout.tsx index 284205fa5..be3a1e0f8 100644 --- a/apps/web/src/app/[locale]/(space)/layout.tsx +++ b/apps/web/src/app/[locale]/(space)/layout.tsx @@ -3,11 +3,10 @@ import { SidebarInset, SidebarTrigger } from "@rallly/ui/sidebar"; import Link from "next/link"; import { OptimizedAvatarImage } from "@/components/optimized-avatar-image"; +import { LicenseLimitWarning } from "@/features/licensing/components/license-limit-warning"; import { CommandMenu } from "@/features/navigation/command-menu"; import { getOnboardedUser } from "@/features/setup/queries"; import { TimezoneProvider } from "@/features/timezone/client/context"; - -import { LicenseLimitWarning } from "@/features/licensing/components/license-limit-warning"; import { SpaceSidebar } from "./components/sidebar/space-sidebar"; import { SpaceSidebarProvider } from "./components/sidebar/space-sidebar-provider"; import { TopBar, TopBarLeft, TopBarRight } from "./components/top-bar"; diff --git a/apps/web/src/app/[locale]/(space)/page.tsx b/apps/web/src/app/[locale]/(space)/page.tsx index 3cbec76a0..c91aba67c 100644 --- a/apps/web/src/app/[locale]/(space)/page.tsx +++ b/apps/web/src/app/[locale]/(space)/page.tsx @@ -1,6 +1,6 @@ +import { prisma } from "@rallly/database"; import { Tile, TileDescription, TileGrid, TileTitle } from "@rallly/ui/tile"; import Link from "next/link"; - import { BillingPageIcon, CreatePageIcon, @@ -22,7 +22,6 @@ import { Trans } from "@/components/trans"; import { IfCloudHosted } from "@/contexts/environment"; import { getUpcomingEventsCount } from "@/features/scheduled-event/queries"; import { getTranslation } from "@/i18n/server"; -import { prisma } from "@rallly/database"; import { FeedbackAlert } from "./feedback-alert"; async function loadData() { diff --git a/apps/web/src/app/[locale]/(space)/polls/polls-tabbed-view.tsx b/apps/web/src/app/[locale]/(space)/polls/polls-tabbed-view.tsx index 80fd86557..092332f7b 100644 --- a/apps/web/src/app/[locale]/(space)/polls/polls-tabbed-view.tsx +++ b/apps/web/src/app/[locale]/(space)/polls/polls-tabbed-view.tsx @@ -1,11 +1,10 @@ "use client"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@rallly/ui/page-tabs"; -import { useRouter, useSearchParams } from "next/navigation"; - -import { Trans } from "@/components/trans"; import { cn } from "@rallly/ui"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@rallly/ui/page-tabs"; +import { useRouter, useSearchParams } from "next/navigation"; import React from "react"; +import { Trans } from "@/components/trans"; import { statusSchema } from "./schema"; export function PollsTabbedView({ children }: { children: React.ReactNode }) { diff --git a/apps/web/src/app/[locale]/(space)/polls/schema.ts b/apps/web/src/app/[locale]/(space)/polls/schema.ts index eac5fe4a5..13a91a321 100644 --- a/apps/web/src/app/[locale]/(space)/polls/schema.ts +++ b/apps/web/src/app/[locale]/(space)/polls/schema.ts @@ -1,5 +1,5 @@ -import { pollStatusSchema } from "@/features/poll/schema"; import { z } from "zod"; +import { pollStatusSchema } from "@/features/poll/schema"; export const DEFAULT_PAGE_SIZE = 10; diff --git a/apps/web/src/app/[locale]/admin-setup/actions.ts b/apps/web/src/app/[locale]/admin-setup/actions.ts index ca69e0ace..e35b49378 100644 --- a/apps/web/src/app/[locale]/admin-setup/actions.ts +++ b/apps/web/src/app/[locale]/admin-setup/actions.ts @@ -1,9 +1,8 @@ "use server"; -import { authActionClient } from "@/features/safe-action/server"; -import { ActionError } from "@/features/safe-action/server"; import { subject } from "@casl/ability"; import { prisma } from "@rallly/database"; import { redirect } from "next/navigation"; +import { ActionError, authActionClient } from "@/features/safe-action/server"; export const makeMeAdminAction = authActionClient .metadata({ actionName: "make_admin" }) diff --git a/apps/web/src/app/[locale]/admin-setup/make-me-admin-button.tsx b/apps/web/src/app/[locale]/admin-setup/make-me-admin-button.tsx index e056286d3..7fc937c39 100644 --- a/apps/web/src/app/[locale]/admin-setup/make-me-admin-button.tsx +++ b/apps/web/src/app/[locale]/admin-setup/make-me-admin-button.tsx @@ -1,8 +1,8 @@ "use client"; +import { Button } from "@rallly/ui/button"; import { Trans } from "@/components/trans"; import { useSafeAction } from "@/features/safe-action/client"; -import { Button } from "@rallly/ui/button"; import { makeMeAdminAction } from "./actions"; export function MakeMeAdminButton() { diff --git a/apps/web/src/app/[locale]/admin-setup/page.tsx b/apps/web/src/app/[locale]/admin-setup/page.tsx index 5d13b2b74..a7da33e35 100644 --- a/apps/web/src/app/[locale]/admin-setup/page.tsx +++ b/apps/web/src/app/[locale]/admin-setup/page.tsx @@ -1,3 +1,8 @@ +import { subject } from "@casl/ability"; +import { Button } from "@rallly/ui/button"; +import { CrownIcon } from "lucide-react"; +import Link from "next/link"; +import { notFound, redirect } from "next/navigation"; import { requireUserAbility } from "@/auth/queries"; import { EmptyState, @@ -8,11 +13,6 @@ import { } from "@/components/empty-state"; import { Trans } from "@/components/trans"; import { getTranslation } from "@/i18n/server"; -import { subject } from "@casl/ability"; -import { Button } from "@rallly/ui/button"; -import { CrownIcon } from "lucide-react"; -import Link from "next/link"; -import { notFound, redirect } from "next/navigation"; import { MakeMeAdminButton } from "./make-me-admin-button"; export default async function AdminSetupPage() { diff --git a/apps/web/src/app/[locale]/control-panel/layout.tsx b/apps/web/src/app/[locale]/control-panel/layout.tsx index 29d347306..67434ce4c 100644 --- a/apps/web/src/app/[locale]/control-panel/layout.tsx +++ b/apps/web/src/app/[locale]/control-panel/layout.tsx @@ -1,14 +1,16 @@ +import { SidebarInset } from "@rallly/ui/sidebar"; import { requireAdmin } from "@/auth/queries"; import { LicenseLimitWarning } from "@/features/licensing/components/license-limit-warning"; import { CommandMenu } from "@/features/navigation/command-menu"; import { getTranslation } from "@/i18n/server"; -import { SidebarInset } from "@rallly/ui/sidebar"; import { ControlPanelSidebarProvider } from "./control-panel-sidebar-provider"; import { ControlPanelSidebar } from "./sidebar"; export default async function AdminLayout({ children, -}: { children: React.ReactNode }) { +}: { + children: React.ReactNode; +}) { await requireAdmin(); return ( diff --git a/apps/web/src/app/[locale]/control-panel/license/page.tsx b/apps/web/src/app/[locale]/control-panel/license/page.tsx index d715e4ff9..a15f0f906 100644 --- a/apps/web/src/app/[locale]/control-panel/license/page.tsx +++ b/apps/web/src/app/[locale]/control-panel/license/page.tsx @@ -1,3 +1,14 @@ +import { Button } from "@rallly/ui/button"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@rallly/ui/dialog"; +import { Icon } from "@rallly/ui/icon"; +import dayjs from "dayjs"; +import { KeySquareIcon, PlusIcon, ShoppingBagIcon } from "lucide-react"; import { PageIcon } from "@/app/components/page-icons"; import { requireAdmin } from "@/auth/queries"; import { @@ -18,17 +29,6 @@ import { LicenseKeyForm } from "@/features/licensing/components/license-key-form import { RemoveLicenseButton } from "@/features/licensing/components/remove-license-button"; import { getLicense } from "@/features/licensing/queries"; import { getTranslation } from "@/i18n/server"; -import { Button } from "@rallly/ui/button"; -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@rallly/ui/dialog"; -import { Icon } from "@rallly/ui/icon"; -import dayjs from "dayjs"; -import { KeySquareIcon, PlusIcon, ShoppingBagIcon } from "lucide-react"; async function loadData() { await requireAdmin(); @@ -40,19 +40,11 @@ function DescriptionList({ children }: { children: React.ReactNode }) { return
{children}
; } -function DescriptionListTitle({ - children, -}: { - children: React.ReactNode; -}) { +function DescriptionListTitle({ children }: { children: React.ReactNode }) { return
{children}
; } -function DescriptionListValue({ - children, -}: { - children: React.ReactNode; -}) { +function DescriptionListValue({ children }: { children: React.ReactNode }) { return
{children}
; } diff --git a/apps/web/src/app/[locale]/control-panel/page.tsx b/apps/web/src/app/[locale]/control-panel/page.tsx index c4ec2bbb7..900cea55d 100644 --- a/apps/web/src/app/[locale]/control-panel/page.tsx +++ b/apps/web/src/app/[locale]/control-panel/page.tsx @@ -1,13 +1,3 @@ -import { PageIcon } from "@/app/components/page-icons"; -import { requireAdmin } from "@/auth/queries"; -import { - FullWidthLayout, - FullWidthLayoutContent, - FullWidthLayoutHeader, - FullWidthLayoutTitle, -} from "@/components/full-width-layout"; -import { Trans } from "@/components/trans"; -import { getLicense } from "@/features/licensing/queries"; import { prisma } from "@rallly/database"; import { cn } from "@rallly/ui"; import { Icon } from "@rallly/ui/icon"; @@ -20,6 +10,16 @@ import { UsersIcon, } from "lucide-react"; import Link from "next/link"; +import { PageIcon } from "@/app/components/page-icons"; +import { requireAdmin } from "@/auth/queries"; +import { + FullWidthLayout, + FullWidthLayoutContent, + FullWidthLayoutHeader, + FullWidthLayoutTitle, +} from "@/components/full-width-layout"; +import { Trans } from "@/components/trans"; +import { getLicense } from "@/features/licensing/queries"; async function loadData() { await requireAdmin(); diff --git a/apps/web/src/app/[locale]/control-panel/settings/instance-settings-form.tsx b/apps/web/src/app/[locale]/control-panel/settings/instance-settings-form.tsx index 97643da84..0e53c9713 100644 --- a/apps/web/src/app/[locale]/control-panel/settings/instance-settings-form.tsx +++ b/apps/web/src/app/[locale]/control-panel/settings/instance-settings-form.tsx @@ -1,19 +1,5 @@ "use client"; -import { - SettingsGroup, - SettingsGroupContent, - SettingsGroupDescription, - SettingsGroupHeader, - SettingsGroupTitle, -} from "@/components/settings-group"; -import { Trans } from "@/components/trans"; -import { updateInstanceSettings } from "@/features/instance-settings/mutations"; -import { - type InstanceSettings, - instanceSettingsSchema, -} from "@/features/instance-settings/schema"; -import { useTranslation } from "@/i18n/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { ActionBar, @@ -32,6 +18,20 @@ import { import { toast } from "@rallly/ui/sonner"; import { Switch } from "@rallly/ui/switch"; import { useForm } from "react-hook-form"; +import { + SettingsGroup, + SettingsGroupContent, + SettingsGroupDescription, + SettingsGroupHeader, + SettingsGroupTitle, +} from "@/components/settings-group"; +import { Trans } from "@/components/trans"; +import { updateInstanceSettings } from "@/features/instance-settings/mutations"; +import { + type InstanceSettings, + instanceSettingsSchema, +} from "@/features/instance-settings/schema"; +import { useTranslation } from "@/i18n/client"; export function InstanceSettingsForm({ defaultValue, diff --git a/apps/web/src/app/[locale]/control-panel/settings/page.tsx b/apps/web/src/app/[locale]/control-panel/settings/page.tsx index 1fae795ba..07a6772b9 100644 --- a/apps/web/src/app/[locale]/control-panel/settings/page.tsx +++ b/apps/web/src/app/[locale]/control-panel/settings/page.tsx @@ -1,3 +1,4 @@ +import { SettingsIcon } from "lucide-react"; import { PageIcon } from "@/app/components/page-icons"; import { requireAdmin } from "@/auth/queries"; import { @@ -8,7 +9,6 @@ import { } from "@/components/full-width-layout"; import { Trans } from "@/components/trans"; import { getInstanceSettings } from "@/features/instance-settings/queries"; -import { SettingsIcon } from "lucide-react"; import { InstanceSettingsForm } from "./instance-settings-form"; async function loadData() { diff --git a/apps/web/src/app/[locale]/control-panel/users/dialogs/delete-user-dialog.tsx b/apps/web/src/app/[locale]/control-panel/users/dialogs/delete-user-dialog.tsx index eeb57f4d9..b04a95d45 100644 --- a/apps/web/src/app/[locale]/control-panel/users/dialogs/delete-user-dialog.tsx +++ b/apps/web/src/app/[locale]/control-panel/users/dialogs/delete-user-dialog.tsx @@ -1,8 +1,4 @@ "use client"; -import { Trans } from "@/components/trans"; -import { useSafeAction } from "@/features/safe-action/client"; -import { deleteUserAction } from "@/features/user/actions"; -import { useTranslation } from "@/i18n/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@rallly/ui/button"; import { @@ -26,6 +22,10 @@ import { import { Input } from "@rallly/ui/input"; import { useForm } from "react-hook-form"; import { z } from "zod"; +import { Trans } from "@/components/trans"; +import { useSafeAction } from "@/features/safe-action/client"; +import { deleteUserAction } from "@/features/user/actions"; +import { useTranslation } from "@/i18n/client"; const useSchema = (email: string) => { const { t } = useTranslation(); diff --git a/apps/web/src/app/[locale]/control-panel/users/page.tsx b/apps/web/src/app/[locale]/control-panel/users/page.tsx index d1485fe8b..97583340e 100644 --- a/apps/web/src/app/[locale]/control-panel/users/page.tsx +++ b/apps/web/src/app/[locale]/control-panel/users/page.tsx @@ -1,3 +1,6 @@ +import { type Prisma, prisma } from "@rallly/database"; +import { UsersIcon } from "lucide-react"; +import z from "zod"; import { PageIcon } from "@/app/components/page-icons"; import { requireAdmin } from "@/auth/queries"; import { @@ -16,9 +19,6 @@ import { Pagination } from "@/components/pagination"; import { StackedList } from "@/components/stacked-list"; import { Trans } from "@/components/trans"; import { getTranslation } from "@/i18n/server"; -import { type Prisma, prisma } from "@rallly/database"; -import { UsersIcon } from "lucide-react"; -import z from "zod"; import { UserRow } from "./user-row"; import { UserSearchInput } from "./user-search-input"; import { UsersTabbedView } from "./users-tabbed-view"; @@ -102,7 +102,7 @@ export default async function AdminPage(props: { const searchParams = await props.searchParams; const { page, pageSize } = searchParamsSchema.parse(searchParams); - const { adminUser, allUsers, totalUsers } = await loadData({ + const { allUsers, totalUsers } = await loadData({ page, pageSize, q: searchParams.q ? String(searchParams.q) : undefined, diff --git a/apps/web/src/app/[locale]/control-panel/users/user-row.tsx b/apps/web/src/app/[locale]/control-panel/users/user-row.tsx index d52a9278f..856268cb1 100644 --- a/apps/web/src/app/[locale]/control-panel/users/user-row.tsx +++ b/apps/web/src/app/[locale]/control-panel/users/user-row.tsx @@ -1,11 +1,4 @@ "use client"; -import { OptimizedAvatarImage } from "@/components/optimized-avatar-image"; -import { StackedListItem } from "@/components/stacked-list"; -import { Trans } from "@/components/trans"; -import { useUser } from "@/components/user-provider"; -import { useSafeAction } from "@/features/safe-action/client"; -import { changeRoleAction } from "@/features/user/actions"; -import { userRoleSchema } from "@/features/user/schema"; import { cn } from "@rallly/ui"; import { Button } from "@rallly/ui/button"; import { useDialog } from "@rallly/ui/dialog"; @@ -24,6 +17,13 @@ import { import { Icon } from "@rallly/ui/icon"; import { MoreHorizontal, TrashIcon, UserPenIcon } from "lucide-react"; import { useTransition } from "react"; +import { OptimizedAvatarImage } from "@/components/optimized-avatar-image"; +import { StackedListItem } from "@/components/stacked-list"; +import { Trans } from "@/components/trans"; +import { useUser } from "@/components/user-provider"; +import { useSafeAction } from "@/features/safe-action/client"; +import { changeRoleAction } from "@/features/user/actions"; +import { userRoleSchema } from "@/features/user/schema"; import { DeleteUserDialog } from "./dialogs/delete-user-dialog"; export function UserRow({ diff --git a/apps/web/src/app/[locale]/control-panel/users/users-tabbed-view.tsx b/apps/web/src/app/[locale]/control-panel/users/users-tabbed-view.tsx index dae2bb613..a8c3bc968 100644 --- a/apps/web/src/app/[locale]/control-panel/users/users-tabbed-view.tsx +++ b/apps/web/src/app/[locale]/control-panel/users/users-tabbed-view.tsx @@ -1,11 +1,10 @@ "use client"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@rallly/ui/page-tabs"; -import { useRouter, useSearchParams } from "next/navigation"; - -import { Trans } from "@/components/trans"; import { cn } from "@rallly/ui"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@rallly/ui/page-tabs"; +import { useRouter, useSearchParams } from "next/navigation"; import React from "react"; +import { Trans } from "@/components/trans"; export function UsersTabbedView({ children }: { children: React.ReactNode }) { const searchParams = useSearchParams(); diff --git a/apps/web/src/app/[locale]/invite/[urlId]/page.tsx b/apps/web/src/app/[locale]/invite/[urlId]/page.tsx index bb9392ab1..90bbebf14 100644 --- a/apps/web/src/app/[locale]/invite/[urlId]/page.tsx +++ b/apps/web/src/app/[locale]/invite/[urlId]/page.tsx @@ -1,6 +1,6 @@ import { prisma } from "@rallly/database"; import { absoluteUrl } from "@rallly/utils/absolute-url"; -import { HydrationBoundary, dehydrate } from "@tanstack/react-query"; +import { dehydrate, HydrationBoundary } from "@tanstack/react-query"; import { notFound } from "next/navigation"; import { InvitePage } from "@/app/[locale]/invite/[urlId]/invite-page"; diff --git a/apps/web/src/app/[locale]/layout.tsx b/apps/web/src/app/[locale]/layout.tsx index 24d4b7b29..5b3c3020c 100644 --- a/apps/web/src/app/[locale]/layout.tsx +++ b/apps/web/src/app/[locale]/layout.tsx @@ -4,7 +4,7 @@ import { supportedLngs } from "@rallly/languages"; import { PostHogProvider } from "@rallly/posthog/client"; import { Toaster } from "@rallly/ui/sonner"; import { TooltipProvider } from "@rallly/ui/tooltip"; -import { LazyMotion, domAnimation } from "motion/react"; +import { domAnimation, LazyMotion } from "motion/react"; import type { Viewport } from "next"; import { Inter } from "next/font/google"; import type React from "react"; @@ -12,16 +12,15 @@ import type React from "react"; import { TimeZoneChangeDetector } from "@/app/[locale]/timezone-change-detector"; import { UserProvider } from "@/components/user-provider"; import { PreferencesProvider } from "@/contexts/preferences"; +import { FeatureFlagsProvider } from "@/features/feature-flags/client"; +import { isStorageEnabled } from "@/features/storage"; import { TimezoneProvider } from "@/features/timezone/client/context"; +import { getUser } from "@/features/user/queries"; import { I18nProvider } from "@/i18n/client"; import { getLocale } from "@/i18n/server/get-locale"; import { auth } from "@/next-auth"; import { TRPCProvider } from "@/trpc/client/provider"; import { ConnectedDayjsProvider } from "@/utils/dayjs"; - -import { FeatureFlagsProvider } from "@/features/feature-flags/client"; -import { isStorageEnabled } from "@/features/storage"; -import { getUser } from "@/features/user/queries"; import { PostHogPageView } from "../posthog-page-view"; const inter = Inter({ diff --git a/apps/web/src/app/[locale]/new/page.tsx b/apps/web/src/app/[locale]/new/page.tsx index ce9c3cc38..6d81cd262 100644 --- a/apps/web/src/app/[locale]/new/page.tsx +++ b/apps/web/src/app/[locale]/new/page.tsx @@ -5,10 +5,9 @@ import { PollPageIcon } from "@/app/components/page-icons"; import { CreatePoll } from "@/components/create-poll"; import { Trans } from "@/components/trans"; import { UserDropdown } from "@/components/user-dropdown"; +import { getInstanceSettings } from "@/features/instance-settings/queries"; import { getTranslation } from "@/i18n/server"; import { getLoggedIn } from "@/next-auth"; - -import { getInstanceSettings } from "@/features/instance-settings/queries"; import { BackButton } from "./back-button"; export default async function Page() { diff --git a/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx b/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx index 0418b15b4..6330520ad 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx @@ -15,8 +15,8 @@ import { useForm } from "react-hook-form"; import type { PollDetailsData } from "@/components/forms/poll-details-form"; import { PollDetailsForm } from "@/components/forms/poll-details-form"; -import { usePoll } from "@/components/poll-context"; import { useUpdatePollMutation } from "@/components/poll/mutations"; +import { usePoll } from "@/components/poll-context"; import { Trans } from "@/components/trans"; const Page = () => { diff --git a/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx b/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx index 84d2c1f0f..c1a20fca3 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx @@ -10,8 +10,8 @@ import { useForm } from "react-hook-form"; import type { PollOptionsData } from "@/components/forms"; import PollOptionsForm from "@/components/forms/poll-options-form"; import { useModalContext } from "@/components/modal/modal-provider"; -import { usePoll } from "@/components/poll-context"; import { useUpdatePollMutation } from "@/components/poll/mutations"; +import { usePoll } from "@/components/poll-context"; import { Trans } from "@/components/trans"; import { useTranslation } from "@/i18n/client"; import { encodeDateOption } from "@/utils/date-time-utils"; diff --git a/apps/web/src/app/[locale]/poll/[urlId]/layout.tsx b/apps/web/src/app/[locale]/poll/[urlId]/layout.tsx index 56c8eb11e..5c194edf7 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/layout.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/layout.tsx @@ -1,5 +1,5 @@ import { prisma } from "@rallly/database"; -import { HydrationBoundary, dehydrate } from "@tanstack/react-query"; +import { dehydrate, HydrationBoundary } from "@tanstack/react-query"; import { notFound, redirect } from "next/navigation"; import { PollLayout } from "@/components/layouts/poll-layout"; diff --git a/apps/web/src/app/[locale]/quick-create/page.tsx b/apps/web/src/app/[locale]/quick-create/page.tsx index e85d4b76f..742b06246 100644 --- a/apps/web/src/app/[locale]/quick-create/page.tsx +++ b/apps/web/src/app/[locale]/quick-create/page.tsx @@ -5,8 +5,8 @@ import Link from "next/link"; import { notFound } from "next/navigation"; import { - QuickCreateWidget, isQuickCreateEnabled, + QuickCreateWidget, } from "@/features/quick-create"; import { getTranslation } from "@/i18n/server"; diff --git a/apps/web/src/app/api/auth/[...nextauth]/route.ts b/apps/web/src/app/api/auth/[...nextauth]/route.ts index ded00e870..7b2b2bcb8 100644 --- a/apps/web/src/app/api/auth/[...nextauth]/route.ts +++ b/apps/web/src/app/api/auth/[...nextauth]/route.ts @@ -1,7 +1,7 @@ +import type { NextRequest } from "next/server"; import { rateLimit } from "@/features/rate-limit"; import { handlers } from "@/next-auth"; import { withPosthog } from "@/utils/posthog"; -import type { NextRequest } from "next/server"; export const GET = withPosthog(async (req: NextRequest) => { if (req.nextUrl.pathname.includes("callback/email")) { diff --git a/apps/web/src/app/api/licensing/v1/[...route]/route.ts b/apps/web/src/app/api/licensing/v1/[...route]/route.ts index 27de96e2b..5b0b332be 100644 --- a/apps/web/src/app/api/licensing/v1/[...route]/route.ts +++ b/apps/web/src/app/api/licensing/v1/[...route]/route.ts @@ -1,20 +1,20 @@ +import { zValidator } from "@hono/zod-validator"; +import { RedisStore } from "@hono-rate-limiter/redis"; +import { prisma } from "@rallly/database"; +import { kv } from "@vercel/kv"; +import { Hono } from "hono"; +import { bearerAuth } from "hono/bearer-auth"; +import { handle } from "hono/vercel"; +import { rateLimiter } from "hono-rate-limiter"; import { env } from "@/env"; import { generateLicenseKey } from "@/features/licensing/helpers/generate-license-key"; import { type CreateLicenseResponse, - type ValidateLicenseKeyResponse, createLicenseInputSchema, + type ValidateLicenseKeyResponse, validateLicenseKeyInputSchema, } from "@/features/licensing/schema"; import { isSelfHosted } from "@/utils/constants"; -import { RedisStore } from "@hono-rate-limiter/redis"; -import { zValidator } from "@hono/zod-validator"; -import { prisma } from "@rallly/database"; -import { kv } from "@vercel/kv"; -import { Hono } from "hono"; -import { rateLimiter } from "hono-rate-limiter"; -import { bearerAuth } from "hono/bearer-auth"; -import { handle } from "hono/vercel"; const isKvAvailable = process.env.KV_REST_API_URL && process.env.KV_REST_API_TOKEN; diff --git a/apps/web/src/app/api/stripe/buy-license/route.ts b/apps/web/src/app/api/stripe/buy-license/route.ts index d080646f8..cfb8feb50 100644 --- a/apps/web/src/app/api/stripe/buy-license/route.ts +++ b/apps/web/src/app/api/stripe/buy-license/route.ts @@ -1,8 +1,8 @@ -import type { LicenseCheckoutMetadata } from "@/features/licensing/schema"; import type { LicenseType } from "@prisma/client"; import { stripe } from "@rallly/billing"; import { type NextRequest, NextResponse } from "next/server"; import { z } from "zod"; +import type { LicenseCheckoutMetadata } from "@/features/licensing/schema"; const productSchema = z.enum(["plus", "organization"]); diff --git a/apps/web/src/app/api/stripe/webhook/handlers/checkout/completed.ts b/apps/web/src/app/api/stripe/webhook/handlers/checkout/completed.ts index 12f7ae392..1b560dd1a 100644 --- a/apps/web/src/app/api/stripe/webhook/handlers/checkout/completed.ts +++ b/apps/web/src/app/api/stripe/webhook/handlers/checkout/completed.ts @@ -1,11 +1,11 @@ +import type { Stripe } from "@rallly/billing"; +import { stripe } from "@rallly/billing"; +import { posthog } from "@rallly/posthog/server"; import { env } from "@/env"; import { licensingClient } from "@/features/licensing/client"; import { licenseCheckoutMetadataSchema } from "@/features/licensing/schema"; import { subscriptionCheckoutMetadataSchema } from "@/features/subscription/schema"; import { getEmailClient } from "@/utils/emails"; -import type { Stripe } from "@rallly/billing"; -import { stripe } from "@rallly/billing"; -import { posthog } from "@rallly/posthog/server"; async function handleSubscriptionCheckoutSessionCompleted( checkoutSession: Stripe.Checkout.Session, diff --git a/apps/web/src/app/api/stripe/webhook/route.ts b/apps/web/src/app/api/stripe/webhook/route.ts index f5589b3a2..36722f981 100644 --- a/apps/web/src/app/api/stripe/webhook/route.ts +++ b/apps/web/src/app/api/stripe/webhook/route.ts @@ -3,10 +3,8 @@ import { stripe } from "@rallly/billing"; import * as Sentry from "@sentry/nextjs"; import type { NextRequest } from "next/server"; import { NextResponse } from "next/server"; - -import { withPosthog } from "@/utils/posthog"; - import { isSelfHosted } from "@/utils/constants"; +import { withPosthog } from "@/utils/posthog"; import { getEventHandler } from "./handlers"; export const POST = withPosthog(async (request: NextRequest) => { diff --git a/apps/web/src/app/components/page-icons.tsx b/apps/web/src/app/components/page-icons.tsx index 9425f2e04..6052783da 100644 --- a/apps/web/src/app/components/page-icons.tsx +++ b/apps/web/src/app/components/page-icons.tsx @@ -1,7 +1,7 @@ "use client"; import { Slot } from "@radix-ui/react-slot"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { BarChart2Icon, CalendarIcon, diff --git a/apps/web/src/auth/adapters/prisma.ts b/apps/web/src/auth/adapters/prisma.ts index f3436b0b8..2cba44a53 100644 --- a/apps/web/src/auth/adapters/prisma.ts +++ b/apps/web/src/auth/adapters/prisma.ts @@ -9,10 +9,11 @@ * * See: https://github.com/lukevella/rallly/issues/949 */ -import { createUser } from "@/features/user/mutations"; + import { PrismaAdapter } from "@auth/prisma-adapter"; import { prisma } from "@rallly/database"; import type { Adapter } from "next-auth/adapters"; +import { createUser } from "@/features/user/mutations"; export function CustomPrismaAdapter(options: { migrateData: (userId: string) => Promise; diff --git a/apps/web/src/auth/edge/with-auth.ts b/apps/web/src/auth/edge/with-auth.ts index 98b1ba5b8..eabc4c706 100644 --- a/apps/web/src/auth/edge/with-auth.ts +++ b/apps/web/src/auth/edge/with-auth.ts @@ -1,6 +1,6 @@ +import type { NextResponse } from "next/server"; import type { NextAuthRequest, Session } from "next-auth"; import NextAuth from "next-auth"; -import type { NextResponse } from "next/server"; import { nextAuthConfig } from "@/next-auth.config"; diff --git a/apps/web/src/auth/helpers/merge-user.ts b/apps/web/src/auth/helpers/merge-user.ts index 36c6f71ba..ed53fa3f1 100644 --- a/apps/web/src/auth/helpers/merge-user.ts +++ b/apps/web/src/auth/helpers/merge-user.ts @@ -1,15 +1,11 @@ -import { defineAbilityFor } from "@/features/ability-manager"; -import { getUser } from "@/features/user/queries"; import { accessibleBy } from "@casl/prisma"; import { prisma } from "@rallly/database"; import { posthog } from "@rallly/posthog/server"; import * as Sentry from "@sentry/nextjs"; +import { defineAbilityFor } from "@/features/ability-manager"; +import { getUser } from "@/features/user/queries"; -const getActiveSpaceForUser = async ({ - userId, -}: { - userId: string; -}) => { +const getActiveSpaceForUser = async ({ userId }: { userId: string }) => { const user = await getUser(userId); if (!user) { diff --git a/apps/web/src/auth/queries.ts b/apps/web/src/auth/queries.ts index 98c57f49f..e5c7c2fd9 100644 --- a/apps/web/src/auth/queries.ts +++ b/apps/web/src/auth/queries.ts @@ -1,9 +1,9 @@ +import { notFound, redirect } from "next/navigation"; +import { cache } from "react"; import { defineAbilityFor } from "@/features/ability-manager"; import { getDefaultSpace, getSpace } from "@/features/spaces/queries"; import { getUser } from "@/features/user/queries"; import { auth } from "@/next-auth"; -import { notFound, redirect } from "next/navigation"; -import { cache } from "react"; /** * @deprecated - Use requireUserAbility() instead diff --git a/apps/web/src/components/create-poll.tsx b/apps/web/src/components/create-poll.tsx index 22d6220b8..4425ceabb 100644 --- a/apps/web/src/components/create-poll.tsx +++ b/apps/web/src/components/create-poll.tsx @@ -9,18 +9,16 @@ import { CardTitle, } from "@rallly/ui/card"; import { Form } from "@rallly/ui/form"; +import { toast } from "@rallly/ui/sonner"; import { useRouter } from "next/navigation"; import type React from "react"; import { useForm } from "react-hook-form"; import useFormPersist from "react-hook-form-persist"; import { useUnmount } from "react-use"; - import { PollSettingsForm } from "@/components/forms/poll-settings"; import { Trans } from "@/components/trans"; import { useUser } from "@/components/user-provider"; import { trpc } from "@/trpc/client"; - -import { toast } from "@rallly/ui/sonner"; import type { NewEventData } from "./forms"; import { PollDetailsForm, PollOptionsForm } from "./forms"; diff --git a/apps/web/src/components/discussion/discussion.tsx b/apps/web/src/components/discussion/discussion.tsx index 05b80bba2..7b2c0c412 100644 --- a/apps/web/src/components/discussion/discussion.tsx +++ b/apps/web/src/components/discussion/discussion.tsx @@ -18,6 +18,7 @@ import { } from "@rallly/ui/dropdown-menu"; import { Icon } from "@rallly/ui/icon"; import { Input } from "@rallly/ui/input"; +import { toast } from "@rallly/ui/sonner"; import { Textarea } from "@rallly/ui/textarea"; import dayjs from "dayjs"; import { @@ -27,7 +28,6 @@ import { } from "lucide-react"; import * as React from "react"; import { Controller, useForm } from "react-hook-form"; - import { OptimizedAvatarImage } from "@/components/optimized-avatar-image"; import { Participant, ParticipantName } from "@/components/participant"; import { useParticipants } from "@/components/participants-provider"; @@ -36,8 +36,6 @@ import { usePoll } from "@/contexts/poll"; import { useRole } from "@/contexts/role"; import { useTranslation } from "@/i18n/client"; import { trpc } from "@/trpc/client"; - -import { toast } from "@rallly/ui/sonner"; import { requiredString } from "../../utils/form-validation"; import TruncatedLinkify from "../poll/truncated-linkify"; import { useUser } from "../user-provider"; diff --git a/apps/web/src/components/event-card.tsx b/apps/web/src/components/event-card.tsx index b9995b6dd..9a69cb6cf 100644 --- a/apps/web/src/components/event-card.tsx +++ b/apps/web/src/components/event-card.tsx @@ -4,10 +4,9 @@ import { Card, CardContent, CardDescription } from "@rallly/ui/card"; import { Icon } from "@rallly/ui/icon"; import dayjs from "dayjs"; import { DotIcon, MapPinIcon, PauseIcon } from "lucide-react"; - -import { PollStatusBadge } from "@/components/poll-status"; import TruncatedLinkify from "@/components/poll/truncated-linkify"; import VoteIcon from "@/components/poll/vote-icon"; +import { PollStatusBadge } from "@/components/poll-status"; import { RandomGradientBar } from "@/components/random-gradient-bar"; import { Trans } from "@/components/trans"; import { usePoll } from "@/contexts/poll"; diff --git a/apps/web/src/components/forms/poll-options-form/dayjs-localizer.ts b/apps/web/src/components/forms/poll-options-form/dayjs-localizer.ts index 0bf233e02..4e7b4e2ea 100644 --- a/apps/web/src/components/forms/poll-options-form/dayjs-localizer.ts +++ b/apps/web/src/components/forms/poll-options-form/dayjs-localizer.ts @@ -2,7 +2,6 @@ import { DateLocalizer } from "react-big-calendar"; const weekRangeFormat = ({ start, end }, culture, local) => - // biome-ignore lint/style/useTemplate: Fix this later local.format(start, "MMMM DD", culture) + " – " + local.format(end, local.eq(start, end, "month") ? "DD" : "MMMM DD", culture); @@ -245,7 +244,7 @@ export default function (dayjs) { return mStart.isBefore(mFirst, "day"); } - function continuesAfter(start, end, last) { + function continuesAfter(_start, end, last) { const mEnd = dayjs(end); const mLast = dayjs(last); return mEnd.isSameOrAfter(mLast, "minutes"); diff --git a/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx b/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx index 7d17c7756..82d10cea1 100644 --- a/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx +++ b/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx @@ -25,8 +25,6 @@ import { useFormContext } from "react-hook-form"; import type { NewEventData } from "@/components/forms"; import { Trans } from "@/components/trans"; import { useTranslation } from "@/i18n/client"; - -import type { DateTimeOption } from ".."; import { expectTimeOption, getBrowserTimeZone, @@ -35,6 +33,7 @@ import { } from "../../../../utils/date-time-utils"; import DateCard from "../../../date-card"; import { useHeadlessDatePicker } from "../../../headless-date-picker"; +import type { DateTimeOption } from ".."; import type { DateTimePickerProps } from "../types"; import { formatDateWithoutTime, formatDateWithoutTz } from "../utils"; import TimePicker from "./time-picker"; @@ -412,10 +411,8 @@ const MonthCalendar: React.FunctionComponent = ({ }, ); const newOptions: DateTimeOption[] = []; - // biome-ignore lint/complexity/noForEach: Fix this later Object.keys(optionsByDay).forEach( (dateString) => { - // biome-ignore lint/complexity/noForEach: Fix this later times.forEach((time) => { const start = dateString + time.startTime; diff --git a/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx b/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx index 6339fe655..6297640c3 100644 --- a/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx +++ b/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx @@ -96,196 +96,194 @@ const PollOptionsForm = ({ const navigationDate = new Date(watchNavigationDate ?? Date.now()); return ( - <> - - -
-
- - Calendar - - - - Select potential dates for your event - - -
-
- ( - - - - - - - - - - - - - )} - /> -
+ + +
+
+ + Calendar + + + + Select potential dates for your event + +
- - - - - - - - -

- -

- -
+
+ + + + + + + +

+ +

+ + + + +
+
+
+ { + return options.length > 0 + ? true + : t("calendarHelp", { + defaultValue: + "You can't create a poll without any options. Add at least one option to continue.", + }); + }, + }} + render={({ field }) => ( +
+ { + setValue("navigationDate", date.toISOString()); }} - > - - - - - - -
- { - return options.length > 0 - ? true - : t("calendarHelp", { - defaultValue: - "You can't create a poll without any options. Add at least one option to continue.", - }); - }, - }} - render={({ field }) => ( -
- { - setValue("navigationDate", date.toISOString()); - }} - onChange={(options) => { - field.onChange(options); - }} - duration={watchDuration} - onChangeDuration={(duration) => { - setValue("duration", duration); + duration={watchDuration} + onChangeDuration={(duration) => { + setValue("duration", duration); + }} + /> + {formState.errors.options ? ( +
+ +
+ ) : null} +
+ )} + /> +
+ {!datesOnly ? ( + ( +
+
+ { + if (checked) { + field.onChange(getBrowserTimeZone()); + } else { + field.onChange(""); + } }} /> - {formState.errors.options ? ( -
- -
- ) : null} -
- )} - /> -
- {!datesOnly ? ( - ( -
-
- { - if (checked) { - field.onChange(getBrowserTimeZone()); - } else { - field.onChange(""); - } - }} + - - - - - - - - -
- {field.value ? ( -
- - - { - field.onChange(newValue); - showTimeZoneCommandModal(false); - }} - /> - -
- ) : null} + +
- )} - /> - ) : null} - {children} - - + {field.value ? ( +
+ + + { + field.onChange(newValue); + showTimeZoneCommandModal(false); + }} + /> + +
+ ) : null} +
+ )} + /> + ) : null} + {children} + ); }; diff --git a/apps/web/src/components/forms/poll-options-form/rbc-overrides.css b/apps/web/src/components/forms/poll-options-form/rbc-overrides.css index 49f9c38e0..eee9cf579 100644 --- a/apps/web/src/components/forms/poll-options-form/rbc-overrides.css +++ b/apps/web/src/components/forms/poll-options-form/rbc-overrides.css @@ -6,13 +6,10 @@ @apply bg-gray-50 bg-opacity-50; } -.rbc-day-slot .rbc-time-slot { - @apply border-gray-100; -} - .rbc-time-content > * + * > * { @apply border-gray-200; } + .rbc-time-header.rbc-overflowing, .rbc-time-header-content, .rbc-header { @@ -34,6 +31,7 @@ .rbc-header + .rbc-header { @apply border-l-0; } + .rbc-time-slot { @apply pl-2 pt-1; } @@ -42,6 +40,10 @@ @apply border-gray-100; } +.rbc-day-slot .rbc-time-slot { + @apply border-gray-100; +} + .rbc-day-slot .rbc-time-slot { @apply border-dashed border-gray-50; } @@ -49,9 +51,11 @@ .rbc-day-slot .rbc-events-container { @apply mr-2; } + .rbc-slot-selection { @apply bg-gray-100/50 leading-tight text-gray-600; } + .rbc-header.rbc-today { @apply bg-white text-rose-600; } @@ -59,6 +63,7 @@ .rbc-button-link { @apply pointer-events-none m-1 w-full; } + .rbc-time-content > * + * > * { @apply border-gray-100; } diff --git a/apps/web/src/components/forms/poll-options-form/week-calendar.tsx b/apps/web/src/components/forms/poll-options-form/week-calendar.tsx index 31a472be0..bc17896ce 100644 --- a/apps/web/src/components/forms/poll-options-form/week-calendar.tsx +++ b/apps/web/src/components/forms/poll-options-form/week-calendar.tsx @@ -98,6 +98,7 @@ const WeekCalendar: React.FunctionComponent = ({ const start = dayjs(props.event.start); const end = dayjs(props.event.end); return ( + // biome-ignore lint/a11y/noStaticElementInteractions: fix later
@@ -21,14 +23,19 @@ export function FullWidthLayoutHeader({ export function FullWidthLayoutContent({ children, -}: { children: React.ReactNode }) { +}: { + children: React.ReactNode; +}) { return
{children}
; } export function FullWidthLayoutTitle({ children, icon, -}: { children: React.ReactNode; icon?: React.ReactNode }) { +}: { + children: React.ReactNode; + icon?: React.ReactNode; +}) { return (
{icon} diff --git a/apps/web/src/components/new-participant-modal.tsx b/apps/web/src/components/new-participant-modal.tsx index 003c3d852..a44b416a1 100644 --- a/apps/web/src/components/new-participant-modal.tsx +++ b/apps/web/src/components/new-participant-modal.tsx @@ -11,9 +11,8 @@ import { useForm } from "react-hook-form"; import z from "zod"; import { usePoll } from "@/contexts/poll"; -import { useTranslation } from "@/i18n/client"; - import { useTimezone } from "@/features/timezone"; +import { useTranslation } from "@/i18n/client"; import { useAddParticipantMutation } from "./poll/mutations"; import VoteIcon from "./poll/vote-icon"; import { useUser } from "./user-provider"; diff --git a/apps/web/src/components/participant.tsx b/apps/web/src/components/participant.tsx index 82e9004ec..8d54ad9f5 100644 --- a/apps/web/src/components/participant.tsx +++ b/apps/web/src/components/participant.tsx @@ -13,6 +13,7 @@ export const ParticipantName = ({ const ref = React.useRef(null); const [isTruncated, setIsTruncated] = React.useState(false); return ( + // biome-ignore lint/a11y/noStaticElementInteractions: fix later
{ diff --git a/apps/web/src/components/poll-context.tsx b/apps/web/src/components/poll-context.tsx index 5d88f4345..285f9e0e7 100644 --- a/apps/web/src/components/poll-context.tsx +++ b/apps/web/src/components/poll-context.tsx @@ -59,7 +59,6 @@ export const PollContextProvider: React.FunctionComponent<{ (optionId: string) => { return (participants ?? []).reduce( (acc, curr) => { - // biome-ignore lint/complexity/noForEach: Fix this later curr.votes.forEach((vote) => { if (vote.optionId !== optionId) { return; @@ -104,7 +103,6 @@ export const PollContextProvider: React.FunctionComponent<{ ); const participantsByOptionId: Record = {}; - // biome-ignore lint/complexity/noForEach: Fix this later poll.options.forEach((option) => { participantsByOptionId[option.id] = (participants ?? []).filter( (participant) => diff --git a/apps/web/src/components/poll/desktop-poll/participant-row-form.tsx b/apps/web/src/components/poll/desktop-poll/participant-row-form.tsx index 6bee40cd2..79beed44e 100644 --- a/apps/web/src/components/poll/desktop-poll/participant-row-form.tsx +++ b/apps/web/src/components/poll/desktop-poll/participant-row-form.tsx @@ -19,7 +19,7 @@ import { Trans } from "@/components/trans"; import { useTranslation } from "@/i18n/client"; import { usePoll } from "../../poll-context"; -import { VoteSelector, toggleVote } from "../vote-selector"; +import { toggleVote, VoteSelector } from "../vote-selector"; export interface ParticipantRowFormProps { name?: string; @@ -114,6 +114,7 @@ const ParticipantRowForm = ({ name={`votes.${i}`} render={({ field }) => ( // biome-ignore lint/a11y/useKeyWithClickEvents: Fix later + // biome-ignore lint/a11y/noStaticElementInteractions: Fix later
{ field.onChange({ diff --git a/apps/web/src/components/poll/desktop-poll/poll-header.tsx b/apps/web/src/components/poll/desktop-poll/poll-header.tsx index 3ca69476a..4f1bad227 100644 --- a/apps/web/src/components/poll/desktop-poll/poll-header.tsx +++ b/apps/web/src/components/poll/desktop-poll/poll-header.tsx @@ -7,9 +7,8 @@ import { } from "@rallly/ui/tooltip"; import { ClockIcon } from "lucide-react"; import type * as React from "react"; - -import { useOptions } from "@/components/poll-context"; import { ConnectedScoreSummary } from "@/components/poll/score-summary"; +import { useOptions } from "@/components/poll-context"; import { Trans } from "@/components/trans"; const TimeRange: React.FunctionComponent<{ diff --git a/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx b/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx index 6a33ff7fd..344832be4 100644 --- a/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx +++ b/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx @@ -52,7 +52,6 @@ const useScoreByOptionId = () => { return React.useMemo(() => { const scoreByOptionId: Record = {}; - // biome-ignore lint/complexity/noForEach: Fix this later options.forEach((option) => { scoreByOptionId[option.id] = { yes: [], @@ -61,9 +60,7 @@ const useScoreByOptionId = () => { }; }); - // biome-ignore lint/complexity/noForEach: Fix this later responses?.forEach((response) => { - // biome-ignore lint/complexity/noForEach: Fix this later response.votes.forEach((vote) => { scoreByOptionId[vote.optionId]?.[vote.type].push(response.id); }); diff --git a/apps/web/src/components/poll/mobile-poll.tsx b/apps/web/src/components/poll/mobile-poll.tsx index a7b42cb26..ad9b35534 100644 --- a/apps/web/src/components/poll/mobile-poll.tsx +++ b/apps/web/src/components/poll/mobile-poll.tsx @@ -19,9 +19,9 @@ import { TimesShownIn } from "@/components/clock"; import { OptimizedAvatarImage } from "@/components/optimized-avatar-image"; import { Participant, ParticipantName } from "@/components/participant"; import { ParticipantDropdown } from "@/components/participant-dropdown"; -import { useOptions, usePoll } from "@/components/poll-context"; import { useVotingForm } from "@/components/poll/voting-form"; import { YouAvatar } from "@/components/poll/you-avatar"; +import { useOptions, usePoll } from "@/components/poll-context"; import { Trans } from "@/components/trans"; import { usePermissions } from "@/contexts/permissions"; import { useTranslation } from "@/i18n/client"; diff --git a/apps/web/src/components/poll/mobile-poll/poll-option.tsx b/apps/web/src/components/poll/mobile-poll/poll-option.tsx index 2e7b451ce..d83b78ded 100644 --- a/apps/web/src/components/poll/mobile-poll/poll-option.tsx +++ b/apps/web/src/components/poll/mobile-poll/poll-option.tsx @@ -1,3 +1,6 @@ +/** biome-ignore-all lint/a11y/useSemanticElements: fix later */ +/** biome-ignore-all lint/a11y/useKeyWithClickEvents: fix later */ +/** biome-ignore-all lint/a11y/useFocusableInteractive: fix later */ "use client"; import type { Participant, VoteType } from "@rallly/database"; import { cn } from "@rallly/ui"; @@ -114,8 +117,8 @@ const PollOption: React.FunctionComponent = ({ const [active, setActive] = React.useState(false); const [isExpanded, toggle] = useToggle(false); return ( - // biome-ignore lint/a11y/useKeyWithClickEvents: Fix this later
{children}
; } export function SettingsGroupTitle({ children, -}: { children: React.ReactNode }) { +}: { + children: React.ReactNode; +}) { return

{children}

; } export function SettingsGroupDescription({ children, -}: { children: React.ReactNode }) { +}: { + children: React.ReactNode; +}) { return

{children}

; } export function SettingsGroupContent({ children, -}: { children: React.ReactNode }) { +}: { + children: React.ReactNode; +}) { return
{children}
; } diff --git a/apps/web/src/components/user-provider.tsx b/apps/web/src/components/user-provider.tsx index 77f480aae..fd388f2b9 100644 --- a/apps/web/src/components/user-provider.tsx +++ b/apps/web/src/components/user-provider.tsx @@ -1,7 +1,7 @@ "use client"; import { usePostHog } from "@rallly/posthog/client"; -import { signIn, signOut } from "next-auth/react"; import { useRouter } from "next/navigation"; +import { signIn, signOut } from "next-auth/react"; import React from "react"; import { useTranslation } from "@/i18n/client"; diff --git a/apps/web/src/contexts/environment.tsx b/apps/web/src/contexts/environment.tsx index ffbcdb6d6..af23685df 100644 --- a/apps/web/src/contexts/environment.tsx +++ b/apps/web/src/contexts/environment.tsx @@ -1,9 +1,9 @@ export const isSelfHosted = process.env.NEXT_PUBLIC_SELF_HOSTED === "true"; export const IfSelfHosted = ({ children }: React.PropsWithChildren) => { - return isSelfHosted ? <>{children} : null; + return isSelfHosted ? children : null; }; export const IfCloudHosted = ({ children }: React.PropsWithChildren) => { - return isSelfHosted ? null : <>{children}; + return isSelfHosted ? null : children; }; diff --git a/apps/web/src/features/ability-manager/ability.ts b/apps/web/src/features/ability-manager/ability.ts index 79874b0f6..692e6273e 100644 --- a/apps/web/src/features/ability-manager/ability.ts +++ b/apps/web/src/features/ability-manager/ability.ts @@ -1,9 +1,9 @@ import type { PureAbility } from "@casl/ability"; import { AbilityBuilder } from "@casl/ability"; import { + createPrismaAbility, type PrismaQuery, type Subjects, - createPrismaAbility, } from "@casl/prisma"; import type { Comment, diff --git a/apps/web/src/features/feedback/components/feedback-toggle.tsx b/apps/web/src/features/feedback/components/feedback-toggle.tsx index 30315915e..45cf4e219 100644 --- a/apps/web/src/features/feedback/components/feedback-toggle.tsx +++ b/apps/web/src/features/feedback/components/feedback-toggle.tsx @@ -30,13 +30,14 @@ import type { Feedback } from "../schema"; import { feedbackSchema } from "../schema"; export function FeedbackToggle() { + const form = useForm({ + resolver: zodResolver(feedbackSchema), + }); + if (isSelfHosted) { return null; } - const form = useForm({ - resolver: zodResolver(feedbackSchema), - }); return ( diff --git a/apps/web/src/features/instance-settings/mutations.ts b/apps/web/src/features/instance-settings/mutations.ts index a06253a4b..70778c614 100644 --- a/apps/web/src/features/instance-settings/mutations.ts +++ b/apps/web/src/features/instance-settings/mutations.ts @@ -1,8 +1,8 @@ "use server"; -import { requireAdmin } from "@/auth/queries"; import { type InstanceSettings, prisma } from "@rallly/database"; import { revalidateTag } from "next/cache"; +import { requireAdmin } from "@/auth/queries"; import { instanceSettingsTag } from "./constants"; export async function updateInstanceSettings(data: Partial) { diff --git a/apps/web/src/features/licensing/actions/validate-license.ts b/apps/web/src/features/licensing/actions/validate-license.ts index 3c3ce5b0c..df2532486 100644 --- a/apps/web/src/features/licensing/actions/validate-license.ts +++ b/apps/web/src/features/licensing/actions/validate-license.ts @@ -1,7 +1,7 @@ "use server"; -import { rateLimit } from "@/features/rate-limit"; import { prisma } from "@rallly/database"; +import { rateLimit } from "@/features/rate-limit"; import { licensingClient } from "../client"; export async function validateLicenseKey(key: string) { diff --git a/apps/web/src/features/licensing/components/license-key-form.tsx b/apps/web/src/features/licensing/components/license-key-form.tsx index 987a1b2bc..f38766da2 100644 --- a/apps/web/src/features/licensing/components/license-key-form.tsx +++ b/apps/web/src/features/licensing/components/license-key-form.tsx @@ -1,7 +1,5 @@ "use client"; -import { Trans } from "@/components/trans"; -import { useTranslation } from "@/i18n/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@rallly/ui/button"; import { @@ -16,6 +14,8 @@ import { Input } from "@rallly/ui/input"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { z } from "zod"; +import { Trans } from "@/components/trans"; +import { useTranslation } from "@/i18n/client"; import { validateLicenseKey } from "../actions/validate-license"; import { checkLicenseKey } from "../helpers/check-license-key"; @@ -68,7 +68,7 @@ export function LicenseKeyForm() { } return; } - } catch (error) { + } catch (_error) { form.setError("licenseKey", { message: t("licenseKeyGenericError", { defaultValue: "An error occurred while validating the license key", diff --git a/apps/web/src/features/licensing/components/license-limit-warning.tsx b/apps/web/src/features/licensing/components/license-limit-warning.tsx index 0f312b644..d613f4478 100644 --- a/apps/web/src/features/licensing/components/license-limit-warning.tsx +++ b/apps/web/src/features/licensing/components/license-limit-warning.tsx @@ -1,8 +1,8 @@ +import Link from "next/link"; import { Trans } from "@/components/trans"; import { getLicense } from "@/features/licensing/queries"; import { getUserCount } from "@/features/user/queries"; import { isSelfHosted } from "@/utils/constants"; -import Link from "next/link"; export async function LicenseLimitWarning() { if (!isSelfHosted) { diff --git a/apps/web/src/features/licensing/components/remove-license-button.tsx b/apps/web/src/features/licensing/components/remove-license-button.tsx index 4392c9129..eb462804b 100644 --- a/apps/web/src/features/licensing/components/remove-license-button.tsx +++ b/apps/web/src/features/licensing/components/remove-license-button.tsx @@ -1,6 +1,5 @@ "use client"; -import { Trans } from "@/components/trans"; import { Button } from "@rallly/ui/button"; import { Dialog, @@ -17,6 +16,7 @@ import { Icon } from "@rallly/ui/icon"; import { XIcon } from "lucide-react"; import { useRouter } from "next/navigation"; import { useTransition } from "react"; +import { Trans } from "@/components/trans"; import { removeInstanceLicense } from "../mutations"; export function RemoveLicenseButton() { diff --git a/apps/web/src/features/licensing/lib/licensing-client.ts b/apps/web/src/features/licensing/lib/licensing-client.ts index 76f15cb23..8b9af2c30 100644 --- a/apps/web/src/features/licensing/lib/licensing-client.ts +++ b/apps/web/src/features/licensing/lib/licensing-client.ts @@ -1,7 +1,7 @@ import { type CreateLicenseInput, - type ValidateLicenseInputKeySchema, createLicenseResponseSchema, + type ValidateLicenseInputKeySchema, validateLicenseKeyResponseSchema, } from "../schema"; diff --git a/apps/web/src/features/licensing/mutations.ts b/apps/web/src/features/licensing/mutations.ts index f1829c5ff..ee2421031 100644 --- a/apps/web/src/features/licensing/mutations.ts +++ b/apps/web/src/features/licensing/mutations.ts @@ -1,12 +1,12 @@ "use server"; -import { requireAdmin } from "@/auth/queries"; import { prisma } from "@rallly/database"; +import { requireAdmin } from "@/auth/queries"; export async function removeInstanceLicense() { try { await requireAdmin(); - } catch (error) { + } catch (_error) { return { success: false, message: "You must be an admin to delete a license", @@ -15,7 +15,7 @@ export async function removeInstanceLicense() { try { await prisma.instanceLicense.deleteMany(); - } catch (error) { + } catch (_error) { return { success: false, message: "Failed to delete license", diff --git a/apps/web/src/features/moderation/libs/pattern-moderation.ts b/apps/web/src/features/moderation/libs/pattern-moderation.ts index 41a5f192d..00fb198c4 100644 --- a/apps/web/src/features/moderation/libs/pattern-moderation.ts +++ b/apps/web/src/features/moderation/libs/pattern-moderation.ts @@ -10,7 +10,7 @@ export function containsSuspiciousPatterns(text: string) { const repetitiveCharsPattern = /(.)\1{4,}/; const allCapsPattern = /[A-Z]{5,}/; const excessiveSpecialCharsPattern = - /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]{4,}/; + /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]{4,}/; const suspiciousUrlPattern = /(bit\.ly|tinyurl|goo\.gl|t\.co|is\.gd)/i; // Email address pattern @@ -18,7 +18,7 @@ export function containsSuspiciousPatterns(text: string) { // Comprehensive phone number pattern covering various formats const phoneNumberPattern = - /(\+?\d{1,3}[-.\s]?)?(\d{3}[-.\s]?)?\d{3}[-.\s]?\d{4}|\+\d[\d\s\-\.]{5,14}|\+\d{6,15}/i; + /(\+?\d{1,3}[-.\s]?)?(\d{3}[-.\s]?)?\d{3}[-.\s]?\d{4}|\+\d[\d\s\-.]{5,14}|\+\d{6,15}/i; // Detect suspicious Unicode patterns - simplified version without surrogate pairs const suspiciousUnicodePattern = diff --git a/apps/web/src/features/navigation/command-menu/command-menu.tsx b/apps/web/src/features/navigation/command-menu/command-menu.tsx index 7bc171d39..37d922fd8 100644 --- a/apps/web/src/features/navigation/command-menu/command-menu.tsx +++ b/apps/web/src/features/navigation/command-menu/command-menu.tsx @@ -9,6 +9,7 @@ import { CommandList, } from "@rallly/ui/command"; import { DialogDescription, DialogTitle, useDialog } from "@rallly/ui/dialog"; +import { Icon } from "@rallly/ui/icon"; import { ArrowRightIcon, KeySquareIcon, @@ -17,7 +18,6 @@ import { UsersIcon, } from "lucide-react"; import { useRouter } from "next/navigation"; - import { BillingPageIcon, EventPageIcon, @@ -28,17 +28,11 @@ import { ProfilePageIcon, } from "@/app/components/page-icons"; import { Trans } from "@/components/trans"; - import { useUser } from "@/components/user-provider"; import { useTranslation } from "@/i18n/client"; -import { Icon } from "@rallly/ui/icon"; import { CommandGlobalShortcut } from "./command-global-shortcut"; -function NavigationCommandLabel({ - label, -}: { - label: string; -}) { +function NavigationCommandLabel({ label }: { label: string }) { return (
{ const { t } = useTranslation(); diff --git a/apps/web/src/features/safe-action/server.ts b/apps/web/src/features/safe-action/server.ts index fe012966a..76a696b56 100644 --- a/apps/web/src/features/safe-action/server.ts +++ b/apps/web/src/features/safe-action/server.ts @@ -1,10 +1,10 @@ "server-only"; -import { requireUserAbility } from "@/auth/queries"; import { posthog } from "@rallly/posthog/server"; import { waitUntil } from "@vercel/functions"; -import { createMiddleware, createSafeActionClient } from "next-safe-action"; import { revalidatePath } from "next/cache"; +import { createMiddleware, createSafeActionClient } from "next-safe-action"; import z from "zod"; +import { requireUserAbility } from "@/auth/queries"; type ActionErrorCode = | "UNAUTHORIZED" diff --git a/apps/web/src/features/scheduled-event/actions.ts b/apps/web/src/features/scheduled-event/actions.ts index 13d70a8c2..bdac22350 100644 --- a/apps/web/src/features/scheduled-event/actions.ts +++ b/apps/web/src/features/scheduled-event/actions.ts @@ -1,9 +1,9 @@ "use server"; -import { ActionError, authActionClient } from "@/features/safe-action/server"; -import { getEmailClient } from "@/utils/emails"; import { subject } from "@casl/ability"; import { prisma } from "@rallly/database"; import { z } from "zod"; +import { ActionError, authActionClient } from "@/features/safe-action/server"; +import { getEmailClient } from "@/utils/emails"; import { formatEventDateTime } from "./utils"; export const cancelEventAction = authActionClient diff --git a/apps/web/src/features/scheduled-event/components/scheduled-event-list.tsx b/apps/web/src/features/scheduled-event/components/scheduled-event-list.tsx index 54ea271d9..9cd807f42 100644 --- a/apps/web/src/features/scheduled-event/components/scheduled-event-list.tsx +++ b/apps/web/src/features/scheduled-event/components/scheduled-event-list.tsx @@ -1,10 +1,5 @@ "use client"; -import { ParticipantAvatarBar } from "@/components/participant-avatar-bar"; -import { StackedList } from "@/components/stacked-list"; -import { Trans } from "@/components/trans"; -import { useSafeAction } from "@/features/safe-action/client"; -import { FormattedDateTime } from "@/features/timezone/client/formatted-date-time"; import type { ScheduledEventStatus } from "@rallly/database"; import { Badge } from "@rallly/ui/badge"; import { Button } from "@rallly/ui/button"; @@ -16,6 +11,11 @@ import { } from "@rallly/ui/dropdown-menu"; import { Icon } from "@rallly/ui/icon"; import { MoreHorizontalIcon, XIcon } from "lucide-react"; +import { ParticipantAvatarBar } from "@/components/participant-avatar-bar"; +import { StackedList } from "@/components/stacked-list"; +import { Trans } from "@/components/trans"; +import { useSafeAction } from "@/features/safe-action/client"; +import { FormattedDateTime } from "@/features/timezone/client/formatted-date-time"; import { cancelEventAction } from "../actions"; export const ScheduledEventList = StackedList; diff --git a/apps/web/src/features/scheduled-event/queries.ts b/apps/web/src/features/scheduled-event/queries.ts index bec20d5a9..cc3b717b5 100644 --- a/apps/web/src/features/scheduled-event/queries.ts +++ b/apps/web/src/features/scheduled-event/queries.ts @@ -1,9 +1,9 @@ -import { getActiveSpace } from "@/auth/queries"; import type { Prisma } from "@rallly/database"; import { prisma } from "@rallly/database"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { cache } from "react"; +import { getActiveSpace } from "@/auth/queries"; import type { Status } from "./schema"; dayjs.extend(utc); @@ -27,7 +27,6 @@ function getEventsWhereInput({ const now = new Date(); const todayStart = dayjs().startOf("day").utc().toDate(); - const todayEnd = dayjs().endOf("day").utc().toDate(); const where: Prisma.ScheduledEventWhereInput = { spaceId, diff --git a/apps/web/src/features/spaces/actions.ts b/apps/web/src/features/spaces/actions.ts index 40e09936e..96eb07175 100644 --- a/apps/web/src/features/spaces/actions.ts +++ b/apps/web/src/features/spaces/actions.ts @@ -1,11 +1,11 @@ "use server"; -import { requireUserAbility } from "@/auth/queries"; -import { ActionError, authActionClient } from "@/features/safe-action/server"; import { subject } from "@casl/ability"; import { accessibleBy } from "@casl/prisma"; import { prisma } from "@rallly/database"; import { z } from "zod"; +import { requireUserAbility } from "@/auth/queries"; +import { ActionError, authActionClient } from "@/features/safe-action/server"; export const setActiveSpaceAction = authActionClient .inputSchema( diff --git a/apps/web/src/features/spaces/client.tsx b/apps/web/src/features/spaces/client.tsx index 7d12697e4..ca3a9933d 100644 --- a/apps/web/src/features/spaces/client.tsx +++ b/apps/web/src/features/spaces/client.tsx @@ -1,6 +1,6 @@ "use client"; -import type { SpaceDTO } from "@/features/spaces/queries"; import React from "react"; +import type { SpaceDTO } from "@/features/spaces/queries"; export const SpaceContext = React.createContext(null); @@ -17,7 +17,10 @@ export const useSpace = () => { export const SpaceProvider = ({ space, children, -}: { space: SpaceDTO; children?: React.ReactNode }) => { +}: { + space: SpaceDTO; + children?: React.ReactNode; +}) => { return ( {children} ); diff --git a/apps/web/src/features/spaces/components/new-space-dialog.tsx b/apps/web/src/features/spaces/components/new-space-dialog.tsx index 7629b69a1..3ecaa1d65 100644 --- a/apps/web/src/features/spaces/components/new-space-dialog.tsx +++ b/apps/web/src/features/spaces/components/new-space-dialog.tsx @@ -1,8 +1,4 @@ "use client"; -import { Trans } from "@/components/trans"; -import { useSafeAction } from "@/features/safe-action/client"; -import { createSpaceAction } from "@/features/spaces/actions"; -import { useTranslation } from "@/i18n/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button } from "@rallly/ui/button"; import { @@ -26,6 +22,10 @@ import { Input } from "@rallly/ui/input"; import { toast } from "@rallly/ui/sonner"; import { useForm } from "react-hook-form"; import { z } from "zod"; +import { Trans } from "@/components/trans"; +import { useSafeAction } from "@/features/safe-action/client"; +import { createSpaceAction } from "@/features/spaces/actions"; +import { useTranslation } from "@/i18n/client"; const newSpaceFormSchema = z.object({ name: z.string().min(1).max(100), diff --git a/apps/web/src/features/spaces/components/space-dropdown.tsx b/apps/web/src/features/spaces/components/space-dropdown.tsx index aa27c0c99..f556dec14 100644 --- a/apps/web/src/features/spaces/components/space-dropdown.tsx +++ b/apps/web/src/features/spaces/components/space-dropdown.tsx @@ -1,9 +1,5 @@ "use client"; -import { ProBadge } from "@/components/pro-badge"; -import { Trans } from "@/components/trans"; -import { useSafeAction } from "@/features/safe-action/client"; -import { setActiveSpaceAction } from "@/features/spaces/actions"; import { cn } from "@rallly/ui"; import { useDialog } from "@rallly/ui/dialog"; import { @@ -18,6 +14,10 @@ import { import { Icon } from "@rallly/ui/icon"; import { CirclePlusIcon, SettingsIcon } from "lucide-react"; import Link from "next/link"; +import { ProBadge } from "@/components/pro-badge"; +import { Trans } from "@/components/trans"; +import { useSafeAction } from "@/features/safe-action/client"; +import { setActiveSpaceAction } from "@/features/spaces/actions"; import { NewSpaceDialog } from "./new-space-dialog"; import { SpaceIcon } from "./space-icon"; diff --git a/apps/web/src/features/spaces/queries.ts b/apps/web/src/features/spaces/queries.ts index 33d33cfa4..7da9dca5d 100644 --- a/apps/web/src/features/spaces/queries.ts +++ b/apps/web/src/features/spaces/queries.ts @@ -1,8 +1,8 @@ -import { requireUserAbility } from "@/auth/queries"; import { accessibleBy } from "@casl/prisma"; -import { type SpaceMemberRole, prisma } from "@rallly/database"; +import { prisma, type SpaceMemberRole } from "@rallly/database"; import { redirect } from "next/navigation"; import { cache } from "react"; +import { requireUserAbility } from "@/auth/queries"; export type SpaceDTO = { id: string; diff --git a/apps/web/src/features/timezone/utils.ts b/apps/web/src/features/timezone/utils.ts index d91bc2319..c9ddbb2e6 100644 --- a/apps/web/src/features/timezone/utils.ts +++ b/apps/web/src/features/timezone/utils.ts @@ -98,7 +98,6 @@ export const groupTimezonesByOffset = (): Record => { const timezones = getAllTimezones(); const grouped: Record = {}; - // biome-ignore lint/complexity/noForEach: Fix this later timezones.forEach((tz) => { const offset = dayjs().tz(tz).format("Z"); if (!grouped[offset]) { diff --git a/apps/web/src/features/user/actions.ts b/apps/web/src/features/user/actions.ts index bdf0828fd..f650dbfbc 100644 --- a/apps/web/src/features/user/actions.ts +++ b/apps/web/src/features/user/actions.ts @@ -1,8 +1,8 @@ "use server"; -import { ActionError, authActionClient } from "@/features/safe-action/server"; import { subject } from "@casl/ability"; import { prisma } from "@rallly/database"; import { z } from "zod"; +import { ActionError, authActionClient } from "@/features/safe-action/server"; import { getUser } from "./queries"; export const changeRoleAction = authActionClient diff --git a/apps/web/src/features/user/mutations.ts b/apps/web/src/features/user/mutations.ts index 146982a5e..530c05620 100644 --- a/apps/web/src/features/user/mutations.ts +++ b/apps/web/src/features/user/mutations.ts @@ -1,4 +1,4 @@ -import { type TimeFormat, prisma } from "@rallly/database"; +import { prisma, type TimeFormat } from "@rallly/database"; export async function createUser({ name, diff --git a/apps/web/src/i18n/i18n.ts b/apps/web/src/i18n/i18n.ts index 7a860c9c6..590a55175 100644 --- a/apps/web/src/i18n/i18n.ts +++ b/apps/web/src/i18n/i18n.ts @@ -1,4 +1,4 @@ -import type { Namespace, i18n } from "i18next"; +import type { i18n, Namespace } from "i18next"; import { createInstance } from "i18next"; import ICU from "i18next-icu"; import { initReactI18next } from "react-i18next/initReactI18next"; diff --git a/apps/web/src/next-auth.config.ts b/apps/web/src/next-auth.config.ts index 8d36ec082..ec9ede4bc 100644 --- a/apps/web/src/next-auth.config.ts +++ b/apps/web/src/next-auth.config.ts @@ -1,5 +1,5 @@ -import type { NextAuthConfig } from "next-auth"; import { NextResponse } from "next/server"; +import type { NextAuthConfig } from "next-auth"; import { env } from "@/env"; import { isQuickCreateEnabled } from "@/features/quick-create/constants"; diff --git a/apps/web/src/next-auth.ts b/apps/web/src/next-auth.ts index 5765dceaa..f64599fac 100644 --- a/apps/web/src/next-auth.ts +++ b/apps/web/src/next-auth.ts @@ -95,7 +95,7 @@ const { }, callbacks: { ...nextAuthConfig.callbacks, - async signIn({ user, email, profile, account }) { + async signIn({ user, email, profile }) { if (email?.verificationRequest) { const isRegisteredUser = (await prisma.user.count({ diff --git a/apps/web/src/style.css b/apps/web/src/style.css index 8fb9cd1d7..50d11bdfc 100644 --- a/apps/web/src/style.css +++ b/apps/web/src/style.css @@ -8,7 +8,9 @@ } body { @apply text-foreground bg-gray-100; - font-feature-settings: "rlig" 1, "calt" 1; + font-feature-settings: + "rlig" 1, + "calt" 1; } html { @apply h-full font-sans text-base text-gray-700; diff --git a/apps/web/src/trpc/client/provider.tsx b/apps/web/src/trpc/client/provider.tsx index f76e5ab8b..70f578ce0 100644 --- a/apps/web/src/trpc/client/provider.tsx +++ b/apps/web/src/trpc/client/provider.tsx @@ -1,18 +1,16 @@ "use client"; import { usePostHog } from "@rallly/posthog/client"; +import { toast } from "@rallly/ui/sonner"; import { MutationCache, QueryClient, QueryClientProvider, } from "@tanstack/react-query"; -import { TRPCClientError, httpBatchLink } from "@trpc/client"; +import { httpBatchLink, TRPCClientError } from "@trpc/client"; import { signOut } from "next-auth/react"; import { useState } from "react"; import superjson from "superjson"; - import { useTranslation } from "@/i18n/client"; - -import { toast } from "@rallly/ui/sonner"; import { trpc } from "../client"; export function TRPCProvider(props: { children: React.ReactNode }) { diff --git a/apps/web/src/trpc/routers/auth.ts b/apps/web/src/trpc/routers/auth.ts index bda4f4917..71a7b848b 100644 --- a/apps/web/src/trpc/routers/auth.ts +++ b/apps/web/src/trpc/routers/auth.ts @@ -2,18 +2,16 @@ import { prisma } from "@rallly/database"; import { posthog } from "@rallly/posthog/server"; import { generateOtp } from "@rallly/utils/nanoid"; import * as Sentry from "@sentry/nextjs"; +import { TRPCError } from "@trpc/server"; import { z } from "zod"; - import { isEmailBlocked } from "@/auth/helpers/is-email-blocked"; import { mergeGuestsIntoUser } from "@/auth/helpers/merge-user"; import { isTemporaryEmail } from "@/auth/helpers/temp-email-domains"; +import { getInstanceSettings } from "@/features/instance-settings/queries"; +import { createUser } from "@/features/user/mutations"; import { getEmailClient } from "@/utils/emails"; import { isValidName } from "@/utils/is-valid-name"; import { createToken, decryptToken } from "@/utils/session"; - -import { getInstanceSettings } from "@/features/instance-settings/queries"; -import { createUser } from "@/features/user/mutations"; -import { TRPCError } from "@trpc/server"; import { createRateLimitMiddleware, publicProcedure, router } from "../trpc"; import type { RegistrationTokenPayload } from "../types"; diff --git a/apps/web/src/trpc/routers/polls.ts b/apps/web/src/trpc/routers/polls.ts index 7eb51a595..96bc70147 100644 --- a/apps/web/src/trpc/routers/polls.ts +++ b/apps/web/src/trpc/routers/polls.ts @@ -8,12 +8,10 @@ import dayjs from "dayjs"; import * as ics from "ics"; import { revalidatePath } from "next/cache"; import { z } from "zod"; - -import { moderateContent } from "@/features/moderation"; -import { getEmailClient } from "@/utils/emails"; - import { getActiveSpace } from "@/auth/queries"; +import { moderateContent } from "@/features/moderation"; import { formatEventDateTime } from "@/features/scheduled-event/utils"; +import { getEmailClient } from "@/utils/emails"; import { createRateLimitMiddleware, possiblyPublicProcedure, @@ -120,7 +118,7 @@ export const polls = router({ }, }); - let nextCursor: typeof cursor | undefined = undefined; + let nextCursor: typeof cursor | undefined; if (polls.length > input.limit) { const nextItem = polls.pop(); nextCursor = nextItem?.id; @@ -764,7 +762,6 @@ export const polls = router({ }> = []; if (input.notify === "all") { - // biome-ignore lint/complexity/noForEach: Fix this later poll.participants.forEach((p) => { if (p.email) { participantsToEmail.push({ @@ -778,7 +775,6 @@ export const polls = router({ } if (input.notify === "attendees") { - // biome-ignore lint/complexity/noForEach: Fix this later attendees.forEach((p) => { if (p.email) { participantsToEmail.push({ diff --git a/apps/web/src/trpc/trpc.ts b/apps/web/src/trpc/trpc.ts index 50c623f51..450567be8 100644 --- a/apps/web/src/trpc/trpc.ts +++ b/apps/web/src/trpc/trpc.ts @@ -1,6 +1,6 @@ import { prisma } from "@rallly/database"; import { posthog } from "@rallly/posthog/server"; -import { TRPCError, initTRPC } from "@trpc/server"; +import { initTRPC, TRPCError } from "@trpc/server"; import { Ratelimit } from "@upstash/ratelimit"; import { kv } from "@vercel/kv"; import superjson from "superjson"; diff --git a/apps/web/src/types.ts b/apps/web/src/types.ts index 63c0a7c68..964fac813 100644 --- a/apps/web/src/types.ts +++ b/apps/web/src/types.ts @@ -1,5 +1,5 @@ -import type { JSX } from "react"; import type React from "react"; +import type { JSX } from "react"; export type ReactTag = keyof JSX.IntrinsicElements; diff --git a/apps/web/src/utils/dayjs.tsx b/apps/web/src/utils/dayjs.tsx index 7a447cbd4..acf027234 100644 --- a/apps/web/src/utils/dayjs.tsx +++ b/apps/web/src/utils/dayjs.tsx @@ -1,6 +1,7 @@ "use client"; import type { TimeFormat } from "@rallly/database"; +import type { SupportedLocale } from "@rallly/languages"; import dayjs from "dayjs"; import advancedFormat from "dayjs/plugin/advancedFormat"; import duration from "dayjs/plugin/duration"; @@ -16,12 +17,9 @@ import updateLocale from "dayjs/plugin/updateLocale"; import utc from "dayjs/plugin/utc"; import * as React from "react"; import { useAsync } from "react-use"; - import { usePreferences } from "@/contexts/preferences"; import { useTranslation } from "@/i18n/client"; import { getBrowserTimeZone, normalizeTimeZone } from "@/utils/date-time-utils"; - -import type { SupportedLocale } from "@rallly/languages"; import { useRequiredContext } from "../components/use-required-context"; const dayjsLocales: Record< diff --git a/apps/web/src/utils/is-valid-name.ts b/apps/web/src/utils/is-valid-name.ts index a71f8203f..f8e01f23d 100644 --- a/apps/web/src/utils/is-valid-name.ts +++ b/apps/web/src/utils/is-valid-name.ts @@ -23,7 +23,7 @@ export function isValidName(value: string) { } // Check for phone number patterns (various formats) - const phonePattern = /\+?[\d\s\(\)\-\.]{7,}/; + const phonePattern = /\+?[\d\s()\-.]{7,}/; if (phonePattern.test(value)) { return false; } diff --git a/apps/web/tests/test-utils.ts b/apps/web/tests/test-utils.ts index 0d054d534..745926e3c 100644 --- a/apps/web/tests/test-utils.ts +++ b/apps/web/tests/test-utils.ts @@ -1,5 +1,5 @@ import type { Page } from "@playwright/test"; -import { type UserRole, prisma } from "@rallly/database"; +import { prisma, type UserRole } from "@rallly/database"; import { LoginPage } from "./login-page"; export async function createUserInDb({ diff --git a/biome.json b/biome.json index 19fdd588d..3d3df295f 100644 --- a/biome.json +++ b/biome.json @@ -1,14 +1,21 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", - "organizeImports": { - "enabled": true - }, + "$schema": "https://biomejs.dev/schemas/2.1.1/schema.json", + "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { "enabled": true, "rules": { "recommended": true, "style": { - "noUselessElse": "off" + "noUselessElse": "off", + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error" }, "correctness": { "noUnusedImports": { @@ -53,6 +60,10 @@ "useIgnoreFile": true }, "files": { - "ignore": ["apps/landing/public/static/scripts/mailerlite.js"] + "includes": [ + "packages/**", + "apps/**", + "!**/apps/landing/public/static/scripts/mailerlite.js" + ] } } diff --git a/package.json b/package.json index 4ffa76285..e24b852b4 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "schema": "./packages/database/prisma" }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.1.1", "@playwright/test": "^1.52.0", "dotenv-cli": "^8.0.0", "prettier": "^3.5.3", diff --git a/packages/database/prisma/seed/scheduled-events.ts b/packages/database/prisma/seed/scheduled-events.ts index 22414fba2..899e3176e 100644 --- a/packages/database/prisma/seed/scheduled-events.ts +++ b/packages/database/prisma/seed/scheduled-events.ts @@ -1,9 +1,8 @@ import { faker } from "@faker-js/faker"; import type { ScheduledEventInviteStatus } from "@prisma/client"; import { ScheduledEventStatus } from "@prisma/client"; // Ensure Prisma is imported -import dayjs from "dayjs"; - import { prisma } from "@rallly/database"; +import dayjs from "dayjs"; import { randInt } from "./utils"; // Realistic event titles and descriptions @@ -155,7 +154,7 @@ export async function seedScheduledEvents(userId: string) { throw new Error(`No space found for user ${userId}`); } - const eventPromises = Array.from({ length: 15 }).map((_, i) => + const eventPromises = Array.from({ length: 15 }).map(() => createScheduledEventForUser({ userId, spaceId: space.id }), ); diff --git a/packages/emails/src/components/email-layout.tsx b/packages/emails/src/components/email-layout.tsx index 391bbf991..3f6d41aa3 100644 --- a/packages/emails/src/components/email-layout.tsx +++ b/packages/emails/src/components/email-layout.tsx @@ -10,7 +10,7 @@ import { import { Trans } from "react-i18next/TransWithoutContext"; import type { EmailContext } from "../types"; -import { Link, Text, darkTextColor, fontFamily } from "./styled-components"; +import { darkTextColor, fontFamily, Link, Text } from "./styled-components"; export interface EmailLayoutProps { preview: string; diff --git a/packages/emails/src/templates/event-canceled.tsx b/packages/emails/src/templates/event-canceled.tsx index 20966940a..5eb1591ff 100644 --- a/packages/emails/src/templates/event-canceled.tsx +++ b/packages/emails/src/templates/event-canceled.tsx @@ -2,7 +2,7 @@ import { Column, Row, Section } from "@react-email/components"; import { Trans } from "react-i18next/TransWithoutContext"; import { EmailLayout } from "../components/email-layout"; -import { Heading, Text, borderColor } from "../components/styled-components"; +import { borderColor, Heading, Text } from "../components/styled-components"; import type { EmailContext } from "../types"; export interface EventCanceledEmailProps { diff --git a/packages/emails/src/templates/finalized-host.tsx b/packages/emails/src/templates/finalized-host.tsx index 759e07f6b..3dacf2722 100644 --- a/packages/emails/src/templates/finalized-host.tsx +++ b/packages/emails/src/templates/finalized-host.tsx @@ -4,9 +4,9 @@ import { Trans } from "react-i18next/TransWithoutContext"; import { EmailLayout } from "../components/email-layout"; import { Button, + borderColor, Heading, Text, - borderColor, } from "../components/styled-components"; import type { EmailContext } from "../types"; diff --git a/packages/emails/src/templates/finalized-participant.tsx b/packages/emails/src/templates/finalized-participant.tsx index 9c2003b09..8bc52bd06 100644 --- a/packages/emails/src/templates/finalized-participant.tsx +++ b/packages/emails/src/templates/finalized-participant.tsx @@ -4,9 +4,9 @@ import { Trans } from "react-i18next/TransWithoutContext"; import { EmailLayout } from "../components/email-layout"; import { Button, + borderColor, Heading, Text, - borderColor, } from "../components/styled-components"; import type { EmailContext } from "../types"; diff --git a/packages/languages/src/get-preferred-locale.ts b/packages/languages/src/get-preferred-locale.ts index 4f5812a59..461ba06db 100644 --- a/packages/languages/src/get-preferred-locale.ts +++ b/packages/languages/src/get-preferred-locale.ts @@ -27,7 +27,7 @@ export function getPreferredLocale({ try { return match(preferredLanguages, supportedLngs, defaultLocale); - } catch (e) { + } catch (_error) { return defaultLocale; } } diff --git a/packages/posthog/src/client.tsx b/packages/posthog/src/client.tsx index d6df3387b..ec85edf90 100644 --- a/packages/posthog/src/client.tsx +++ b/packages/posthog/src/client.tsx @@ -2,6 +2,7 @@ import posthog from "posthog-js"; export { usePostHog } from "posthog-js/react"; + import { PostHogProvider as BasePostHogProvider } from "posthog-js/react"; if (typeof window !== "undefined" && process.env.NEXT_PUBLIC_POSTHOG_API_KEY) { diff --git a/packages/ui/package.json b/packages/ui/package.json index 8b759c079..6da60cc77 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -5,6 +5,8 @@ "main": "src/index.ts", "types": "src/index.ts", "scripts": { + "check": "biome check .", + "check:fix": "biome check . --write", "ui:add": "npx shadcn-ui@latest add", "type-check": "tsc --noEmit" }, diff --git a/packages/ui/src/alert.tsx b/packages/ui/src/alert.tsx index b04065733..5a84cd785 100644 --- a/packages/ui/src/alert.tsx +++ b/packages/ui/src/alert.tsx @@ -1,4 +1,4 @@ -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; import { cn } from "./lib/utils"; diff --git a/packages/ui/src/avatar.tsx b/packages/ui/src/avatar.tsx index f066d67e8..6a152a6d7 100644 --- a/packages/ui/src/avatar.tsx +++ b/packages/ui/src/avatar.tsx @@ -2,7 +2,7 @@ import * as AvatarPrimitive from "@radix-ui/react-avatar"; import { cn } from "@rallly/ui"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; const avatarVariants = cva("relative flex shrink-0 overflow-hidden", { diff --git a/packages/ui/src/badge.tsx b/packages/ui/src/badge.tsx index 9a8fd1dac..5185c228e 100644 --- a/packages/ui/src/badge.tsx +++ b/packages/ui/src/badge.tsx @@ -1,4 +1,4 @@ -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import type * as React from "react"; import { cn } from "./lib/utils"; diff --git a/packages/ui/src/dialog.tsx b/packages/ui/src/dialog.tsx index 7ff787f3c..5411eb884 100644 --- a/packages/ui/src/dialog.tsx +++ b/packages/ui/src/dialog.tsx @@ -1,12 +1,11 @@ "use client"; import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { Slot } from "@radix-ui/react-slot"; import type { VariantProps } from "class-variance-authority"; import { cva } from "class-variance-authority"; import { XIcon } from "lucide-react"; import * as React from "react"; - -import { Slot } from "@radix-ui/react-slot"; import { Button } from "./button"; import { Icon } from "./icon"; import { cn } from "./lib/utils"; diff --git a/packages/ui/src/sheet.tsx b/packages/ui/src/sheet.tsx index 4e71de782..a009e27ec 100644 --- a/packages/ui/src/sheet.tsx +++ b/packages/ui/src/sheet.tsx @@ -2,7 +2,7 @@ import * as SheetPrimitive from "@radix-ui/react-dialog"; import { cn } from "@rallly/ui"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { X } from "lucide-react"; import * as React from "react"; diff --git a/packages/ui/src/sidebar.tsx b/packages/ui/src/sidebar.tsx index e507990ab..ef038a908 100644 --- a/packages/ui/src/sidebar.tsx +++ b/packages/ui/src/sidebar.tsx @@ -92,6 +92,7 @@ const SidebarProvider = React.forwardRef< } // This sets the cookie to keep the sidebar state. + // biome-ignore lint/suspicious/noDocumentCookie: fix later document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`; }, [setOpenProp, open], diff --git a/packages/ui/src/text-field.tsx b/packages/ui/src/text-field.tsx deleted file mode 100644 index 07d3c3c91..000000000 --- a/packages/ui/src/text-field.tsx +++ /dev/null @@ -1,93 +0,0 @@ -"use client"; - -import type { VariantProps } from "class-variance-authority"; -import { cva } from "class-variance-authority"; -import * as React from "react"; - -import type { IconProps } from "./icon"; -import { Icon } from "./icon"; -import { cn } from "./lib/utils"; - -const inputVariants = cva( - cn( - "focus:border-primary-400 focus-visible:ring-2 focus-visible:ring-primary-100", - "h-9 rounded border border-input bg-gray-50 file:border-0 file:bg-transparent file:font-medium file:text-sm placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50", - ), - { - variants: { - size: { - sm: "h-7 px-1 text-xs", - md: "h-9 px-2 text-sm", - lg: "h-12 px-3 text-lg", - }, - }, - defaultVariants: { - size: "md", - }, - }, -); - -export type InputProps = Omit< - React.InputHTMLAttributes, - "size" -> & - VariantProps; - -const TextFieldInput = React.forwardRef( - ({ className, size, type, ...props }, ref) => { - return ( - - ); - }, -); -TextFieldInput.displayName = "TextFieldInput"; - -interface TextFieldProps extends InputProps { - children?: React.ReactNode; -} - -const TextField = React.forwardRef( - ({ className, size, children, ...props }, ref) => { - return ( -
{ - const target = e.target as HTMLElement; - // find an input that s a direct descendant of the target - target.querySelector("input")?.focus(); - }} - className={cn( - "flex items-center", - "group text-field", - "focus-within:border-primary-400 focus-within:ring-2 focus-within:ring-primary-100", - inputVariants({ size }), - "p-0", - className, - )} - {...props} - > - {children} -
- ); - }, -); -TextField.displayName = "TextField"; - -function TextFieldIcon(props: IconProps) { - return ( -
- -
- ); -} - -export { TextField, TextFieldIcon, TextFieldInput }; diff --git a/packages/utils/src/absolute-url.test.ts b/packages/utils/src/absolute-url.test.ts index ade95748b..95e7ee440 100644 --- a/packages/utils/src/absolute-url.test.ts +++ b/packages/utils/src/absolute-url.test.ts @@ -7,7 +7,6 @@ describe("absoluteUrl", () => { }); afterAll(() => { - // biome-ignore lint/performance/noDelete: Setting to undefined doesn't work delete process.env.NEXT_PUBLIC_BASE_URL; }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb6f9e5a4..7b2929cc5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.1.1 + version: 2.1.1 '@playwright/test': specifier: ^1.52.0 version: 1.52.0 @@ -80,7 +80,7 @@ importers: version: 8.1.0(typescript@5.8.3) '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(next@15.3.1(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 1.5.0(next@15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) dayjs: specifier: ^1.11.13 version: 1.11.13 @@ -119,7 +119,7 @@ importers: version: 5.0.0(@types/react@19.1.2)(acorn@8.14.1)(react@19.1.0) next-seo: specifier: ^6.1.0 - version: 6.6.0(next@15.3.1(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 6.6.0(next@15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: specifier: ^19.1.0 version: 19.1.0 @@ -1550,55 +1550,55 @@ packages: resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + '@biomejs/biome@2.1.1': + resolution: {integrity: sha512-HFGYkxG714KzG+8tvtXCJ1t1qXQMzgWzfvQaUjxN6UeKv+KvMEuliInnbZLJm6DXFXwqVi6446EGI0sGBLIYng==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + '@biomejs/cli-darwin-arm64@2.1.1': + resolution: {integrity: sha512-2Muinu5ok4tWxq4nu5l19el48cwCY/vzvI7Vjbkf3CYIQkjxZLyj0Ad37Jv2OtlXYaLvv+Sfu1hFeXt/JwRRXQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + '@biomejs/cli-darwin-x64@2.1.1': + resolution: {integrity: sha512-cC8HM5lrgKQXLAK+6Iz2FrYW5A62pAAX6KAnRlEyLb+Q3+Kr6ur/sSuoIacqlp1yvmjHJqjYfZjPvHWnqxoEIA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + '@biomejs/cli-linux-arm64-musl@2.1.1': + resolution: {integrity: sha512-/7FBLnTswu4jgV9ttI3AMIdDGqVEPIZd8I5u2D4tfCoj8rl9dnjrEQbAIDlWhUXdyWlFSz8JypH3swU9h9P+2A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + '@biomejs/cli-linux-arm64@2.1.1': + resolution: {integrity: sha512-tw4BEbhAUkWPe4WBr6IX04DJo+2jz5qpPzpW/SWvqMjb9QuHY8+J0M23V8EPY/zWU4IG8Ui0XESapR1CB49Q7g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + '@biomejs/cli-linux-x64-musl@2.1.1': + resolution: {integrity: sha512-kUu+loNI3OCD2c12cUt7M5yaaSjDnGIksZwKnueubX6c/HWUyi/0mPbTBHR49Me3F0KKjWiKM+ZOjsmC+lUt9g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + '@biomejs/cli-linux-x64@2.1.1': + resolution: {integrity: sha512-3WJ1GKjU7NzZb6RTbwLB59v9cTIlzjbiFLDB0z4376TkDqoNYilJaC37IomCr/aXwuU8QKkrYoHrgpSq5ffJ4Q==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + '@biomejs/cli-win32-arm64@2.1.1': + resolution: {integrity: sha512-vEHK0v0oW+E6RUWLoxb2isI3rZo57OX9ZNyyGH701fZPj6Il0Rn1f5DMNyCmyflMwTnIQstEbs7n2BxYSqQx4Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + '@biomejs/cli-win32-x64@2.1.1': + resolution: {integrity: sha512-i2PKdn70kY++KEF/zkQFvQfX1e8SkA8hq4BgC+yE9dZqyLzB/XStY2MvwI3qswlRgnGpgncgqe0QYKVS1blksg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -10440,39 +10440,39 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@biomejs/biome@1.9.4': + '@biomejs/biome@2.1.1': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 + '@biomejs/cli-darwin-arm64': 2.1.1 + '@biomejs/cli-darwin-x64': 2.1.1 + '@biomejs/cli-linux-arm64': 2.1.1 + '@biomejs/cli-linux-arm64-musl': 2.1.1 + '@biomejs/cli-linux-x64': 2.1.1 + '@biomejs/cli-linux-x64-musl': 2.1.1 + '@biomejs/cli-win32-arm64': 2.1.1 + '@biomejs/cli-win32-x64': 2.1.1 - '@biomejs/cli-darwin-arm64@1.9.4': + '@biomejs/cli-darwin-arm64@2.1.1': optional: true - '@biomejs/cli-darwin-x64@1.9.4': + '@biomejs/cli-darwin-x64@2.1.1': optional: true - '@biomejs/cli-linux-arm64-musl@1.9.4': + '@biomejs/cli-linux-arm64-musl@2.1.1': optional: true - '@biomejs/cli-linux-arm64@1.9.4': + '@biomejs/cli-linux-arm64@2.1.1': optional: true - '@biomejs/cli-linux-x64-musl@1.9.4': + '@biomejs/cli-linux-x64-musl@2.1.1': optional: true - '@biomejs/cli-linux-x64@1.9.4': + '@biomejs/cli-linux-x64@2.1.1': optional: true - '@biomejs/cli-win32-arm64@1.9.4': + '@biomejs/cli-win32-arm64@2.1.1': optional: true - '@biomejs/cli-win32-x64@1.9.4': + '@biomejs/cli-win32-x64@2.1.1': optional: true '@casl/ability@6.7.3': @@ -13641,7 +13641,7 @@ snapshots: dependencies: crypto-js: 4.2.0 - '@vercel/analytics@1.5.0(next@15.3.1(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@vercel/analytics@1.5.0(next@15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': optionalDependencies: next: 15.3.1(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 @@ -16780,7 +16780,7 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - next-seo@6.6.0(next@15.3.1(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next-seo@6.6.0(next@15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: next: 15.3.1(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0