diff --git a/apps/web/declarations/i18next.d.ts b/apps/web/declarations/i18next.d.ts index a54e1c106..672381a28 100644 --- a/apps/web/declarations/i18next.d.ts +++ b/apps/web/declarations/i18next.d.ts @@ -1,9 +1,9 @@ import "react-i18next"; -import app from "~/public/locales/en/app.json"; -import common from "~/public/locales/en/common.json"; -import errors from "~/public/locales/en/errors.json"; -import homepage from "~/public/locales/en/homepage.json"; +import app from "../public/locales/en/app.json"; +import common from "../public/locales/en/common.json"; +import errors from "../public/locales/en/errors.json"; +import homepage from "../public/locales/en/homepage.json"; interface I18nNamespaces { homepage: typeof homepage; diff --git a/apps/web/declarations/iron-session.d.ts b/apps/web/declarations/iron-session.d.ts deleted file mode 100644 index 08825de38..000000000 --- a/apps/web/declarations/iron-session.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import "iron-session"; - -declare module "iron-session" { - export interface IronSessionData { - user: { - id: string; - isGuest: boolean; - }; - } -} diff --git a/apps/web/next.config.js b/apps/web/next.config.js index f1e63cc19..4fe56c8a9 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -13,7 +13,7 @@ const nextConfig = { i18n: i18n, productionBrowserSourceMaps: true, output: "standalone", - transpilePackages: ["@rallly/emails", "@rallly/database"], + transpilePackages: ["@rallly/backend"], webpack(config) { config.module.rules.push({ test: /\.svg$/, diff --git a/apps/web/package.json b/apps/web/package.json index b779c07e4..a527577c0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -16,21 +16,16 @@ "docker:start": "./scripts/docker-start.sh" }, "dependencies": { + "@rallly/backend": "*", + "@rallly/database": "*", + "@rallly/tailwind-config": "*", "@floating-ui/react-dom-interactions": "^0.13.3", "@headlessui/react": "^1.7.7", "@next/bundle-analyzer": "^12.3.4", "@radix-ui/react-popover": "^1.0.3", - "@rallly/database": "*", - "@rallly/emails": "*", - "@rallly/tailwind-config": "*", "@sentry/nextjs": "^7.33.0", "@svgr/webpack": "^6.5.1", "@tailwindcss/typography": "^0.5.9", - "@tanstack/react-query": "^4.22.0", - "@trpc/client": "^10.13.0", - "@trpc/next": "^10.13.0", - "@trpc/react-query": "^10.13.0", - "@trpc/server": "^10.13.0", "@vercel/analytics": "^0.1.8", "accept-language-parser": "^1.5.0", "autoprefixer": "^10.4.13", @@ -42,7 +37,6 @@ "js-cookie": "^3.0.1", "lodash": "^4.17.21", "nanoid": "^4.0.0", - "next": "^13.2.4", "next-i18next": "^13.0.3", "next-seo": "^5.15.0", "postcss": "^8.4.21", diff --git a/apps/web/src/components/auth/auth-layout.tsx b/apps/web/src/components/auth/auth-layout.tsx index 6f8e37cb6..77a146022 100644 --- a/apps/web/src/components/auth/auth-layout.tsx +++ b/apps/web/src/components/auth/auth-layout.tsx @@ -1,6 +1,6 @@ import React from "react"; -import Logo from "~/public/logo.svg"; +import Logo from "~//logo.svg"; export const AuthLayout = ({ children }: { children?: React.ReactNode }) => { return ( diff --git a/apps/web/src/components/auth/login-form.tsx b/apps/web/src/components/auth/login-form.tsx index 232a17125..510b106f0 100644 --- a/apps/web/src/components/auth/login-form.tsx +++ b/apps/web/src/components/auth/login-form.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import Link from "next/link"; import { Trans, useTranslation } from "next-i18next"; import React from "react"; @@ -6,7 +7,6 @@ import { useForm } from "react-hook-form"; import { usePostHog } from "@/utils/posthog"; import { requiredString, validEmail } from "../../utils/form-validation"; -import { trpc } from "../../utils/trpc"; import { Button } from "../button"; import { TextInput } from "../text-input"; diff --git a/apps/web/src/components/create-poll.tsx b/apps/web/src/components/create-poll.tsx index 9bcd85817..15bf48201 100644 --- a/apps/web/src/components/create-poll.tsx +++ b/apps/web/src/components/create-poll.tsx @@ -1,10 +1,10 @@ +import { trpc } from "@rallly/backend"; import { useRouter } from "next/router"; import { useTranslation } from "next-i18next"; import React from "react"; import { usePostHog } from "@/utils/posthog"; -import { trpc } from "../utils/trpc"; import { Button } from "./button"; import { NewEventData, diff --git a/apps/web/src/components/discussion/discussion.tsx b/apps/web/src/components/discussion/discussion.tsx index a6716cde3..2ed7be99b 100644 --- a/apps/web/src/components/discussion/discussion.tsx +++ b/apps/web/src/components/discussion/discussion.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import clsx from "clsx"; import { useTranslation } from "next-i18next"; import * as React from "react"; @@ -7,7 +8,6 @@ import { usePostHog } from "@/utils/posthog"; import { useDayjs } from "../../utils/dayjs"; import { requiredString } from "../../utils/form-validation"; -import { trpc } from "../../utils/trpc"; import { Button } from "../button"; import CompactButton from "../compact-button"; import Dropdown, { DropdownItem } from "../dropdown"; diff --git a/apps/web/src/components/feedback.tsx b/apps/web/src/components/feedback.tsx index 1b6b49cb0..2165ffaa4 100644 --- a/apps/web/src/components/feedback.tsx +++ b/apps/web/src/components/feedback.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import Link from "next/link"; import { Trans, useTranslation } from "next-i18next"; import { useForm } from "react-hook-form"; @@ -8,7 +9,6 @@ import Speakerphone from "@/components/icons/speakerphone.svg"; import { Logo } from "@/components/logo"; import { useModalState } from "@/components/modal/use-modal"; import Tooltip from "@/components/tooltip"; -import { trpc } from "@/utils/trpc"; const FeedbackForm = (props: { onClose: () => void }) => { const { t } = useTranslation("app"); diff --git a/apps/web/src/components/layouts/page-layout.tsx b/apps/web/src/components/layouts/page-layout.tsx index b4e010826..ef59579f3 100644 --- a/apps/web/src/components/layouts/page-layout.tsx +++ b/apps/web/src/components/layouts/page-layout.tsx @@ -7,7 +7,7 @@ import * as React from "react"; import DotsVertical from "@/components/icons/dots-vertical.svg"; import Github from "@/components/icons/github.svg"; -import Logo from "~/public/logo.svg"; +import Logo from "~//logo.svg"; import { Popover, PopoverContent, PopoverTrigger } from "../popover"; import Footer from "./page-layout/footer"; diff --git a/apps/web/src/components/layouts/page-layout/footer.tsx b/apps/web/src/components/layouts/page-layout/footer.tsx index 1a3a2f3f4..fa0de43e0 100644 --- a/apps/web/src/components/layouts/page-layout/footer.tsx +++ b/apps/web/src/components/layouts/page-layout/footer.tsx @@ -7,10 +7,10 @@ import Discord from "@/components/icons/discord.svg"; import Star from "@/components/icons/star.svg"; import Translate from "@/components/icons/translate.svg"; import Twitter from "@/components/icons/twitter.svg"; -import DigitalOcean from "~/public/digitalocean.svg"; -import Logo from "~/public/logo.svg"; -import Sentry from "~/public/sentry.svg"; -import Vercel from "~/public/vercel-logotype-dark.svg"; +import DigitalOcean from "~//digitalocean.svg"; +import Logo from "~//logo.svg"; +import Sentry from "~//sentry.svg"; +import Vercel from "~//vercel-logotype-dark.svg"; import { LanguageSelect } from "../../poll/language-selector"; diff --git a/apps/web/src/components/layouts/standard-layout.tsx b/apps/web/src/components/layouts/standard-layout.tsx index 6d4eae77a..3b06d6ddc 100644 --- a/apps/web/src/components/layouts/standard-layout.tsx +++ b/apps/web/src/components/layouts/standard-layout.tsx @@ -2,6 +2,7 @@ import { domMax, LazyMotion } from "framer-motion"; import dynamic from "next/dynamic"; import Link from "next/link"; import React from "react"; +import { Toaster } from "react-hot-toast"; import { DayjsProvider } from "@/utils/dayjs"; @@ -34,6 +35,7 @@ const StandardLayout: React.FunctionComponent<{ }> = ({ children, ...rest }) => { return ( + diff --git a/apps/web/src/components/layouts/standard-layout/home-link.tsx b/apps/web/src/components/layouts/standard-layout/home-link.tsx index 57a42e891..814a3eec0 100644 --- a/apps/web/src/components/layouts/standard-layout/home-link.tsx +++ b/apps/web/src/components/layouts/standard-layout/home-link.tsx @@ -1,6 +1,6 @@ import Link from "next/link"; -import Logo from "~/public/logo.svg"; +import Logo from "~//logo.svg"; export const HomeLink = (props: { className?: string }) => { return ( diff --git a/apps/web/src/components/layouts/standard-layout/mobile-navigation.tsx b/apps/web/src/components/layouts/standard-layout/mobile-navigation.tsx index 0a808c102..d233fe5b2 100644 --- a/apps/web/src/components/layouts/standard-layout/mobile-navigation.tsx +++ b/apps/web/src/components/layouts/standard-layout/mobile-navigation.tsx @@ -23,7 +23,7 @@ import OpenBeta from "../../open-beta-modal"; import { UserDropdown } from "./user-dropdown"; export const MobileNavigation = (props: { className?: string }) => { - const { user, isUpdating } = useUser(); + const { user } = useUser(); const { t } = useTranslation(["common", "app"]); const [isPinned, setIsPinned] = React.useState(false); @@ -113,9 +113,6 @@ export const MobileNavigation = (props: { className?: string }) => { data-testid="user" className={clsx( "group inline-flex w-full items-center space-x-2 rounded px-2 py-1 text-left transition-colors hover:bg-slate-500/10 active:bg-slate-500/20", - { - "opacity-50": isUpdating, - }, )} >
diff --git a/apps/web/src/components/maintenance.tsx b/apps/web/src/components/maintenance.tsx index 1ac137b20..a51a0b3f7 100644 --- a/apps/web/src/components/maintenance.tsx +++ b/apps/web/src/components/maintenance.tsx @@ -1,7 +1,8 @@ import Head from "next/head"; import Clock from "@/components/icons/clock.svg"; -import Logo from "~/public/logo.svg"; + +import Logo from "../../public/logo.svg"; const Maintenance: React.FunctionComponent = () => { return ( diff --git a/apps/web/src/components/participant-dropdown.tsx b/apps/web/src/components/participant-dropdown.tsx index e40ede252..d98d868ae 100644 --- a/apps/web/src/components/participant-dropdown.tsx +++ b/apps/web/src/components/participant-dropdown.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import { useTranslation } from "next-i18next"; import React from "react"; import { SubmitHandler, useForm } from "react-hook-form"; @@ -15,7 +16,6 @@ import { useDeleteParticipantModal } from "@/components/poll/use-delete-particip import { TextInput } from "@/components/text-input"; import { useFormValidation } from "@/utils/form-validation"; import { usePostHog } from "@/utils/posthog"; -import { trpc } from "@/utils/trpc"; import { Participant } from ".prisma/client"; diff --git a/apps/web/src/components/participants-provider.tsx b/apps/web/src/components/participants-provider.tsx index 5d0a4d2d5..9e178f016 100644 --- a/apps/web/src/components/participants-provider.tsx +++ b/apps/web/src/components/participants-provider.tsx @@ -1,8 +1,8 @@ +import { trpc } from "@rallly/backend"; import { Participant, Vote, VoteType } from "@rallly/database"; import { useTranslation } from "next-i18next"; import * as React from "react"; -import { trpc } from "../utils/trpc"; import FullPageLoader from "./full-page-loader"; import { useRequiredContext } from "./use-required-context"; diff --git a/apps/web/src/components/poll/language-selector.tsx b/apps/web/src/components/poll/language-selector.tsx index 4d666165c..8045d2ddc 100644 --- a/apps/web/src/components/poll/language-selector.tsx +++ b/apps/web/src/components/poll/language-selector.tsx @@ -3,7 +3,8 @@ import Cookies from "js-cookie"; import { useTranslation } from "next-i18next"; import ChevronDown from "@/components/icons/chevron-down.svg"; -import languages from "~/languages.json"; + +import languages from "../../../languages.json"; export const LanguageSelect: React.FunctionComponent<{ className?: string; diff --git a/apps/web/src/components/poll/manage-poll/delete-poll-form.tsx b/apps/web/src/components/poll/manage-poll/delete-poll-form.tsx index 3f57c1dc7..0e22a2cf5 100644 --- a/apps/web/src/components/poll/manage-poll/delete-poll-form.tsx +++ b/apps/web/src/components/poll/manage-poll/delete-poll-form.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import clsx from "clsx"; import { Trans, useTranslation } from "next-i18next"; import * as React from "react"; @@ -7,8 +8,6 @@ import { Button } from "@/components/button"; import Exclamation from "@/components/icons/exclamation.svg"; import { usePostHog } from "@/utils/posthog"; -import { trpc } from "../../../utils/trpc"; - const confirmText = "delete-me"; export const DeletePollForm: React.FunctionComponent<{ diff --git a/apps/web/src/components/poll/mutations.ts b/apps/web/src/components/poll/mutations.ts index fcc617f4f..74e449d17 100644 --- a/apps/web/src/components/poll/mutations.ts +++ b/apps/web/src/components/poll/mutations.ts @@ -1,6 +1,7 @@ +import { trpc } from "@rallly/backend"; + import { usePostHog } from "@/utils/posthog"; -import { trpc } from "../../utils/trpc"; import { ParticipantForm } from "./types"; export const normalizeVotes = ( diff --git a/apps/web/src/components/poll/notifications-toggle.tsx b/apps/web/src/components/poll/notifications-toggle.tsx index 9ff05ff4a..97a42b33b 100644 --- a/apps/web/src/components/poll/notifications-toggle.tsx +++ b/apps/web/src/components/poll/notifications-toggle.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import { useTranslation } from "next-i18next"; import * as React from "react"; @@ -7,7 +8,6 @@ import Bell from "@/components/icons/bell.svg"; import BellCrossed from "@/components/icons/bell-crossed.svg"; import { useUser } from "@/components/user-provider"; import { usePostHog } from "@/utils/posthog"; -import { trpc } from "@/utils/trpc"; import { usePollByAdmin } from "@/utils/trpc/hooks"; import { usePoll } from "../poll-context"; diff --git a/apps/web/src/components/poll/use-touch-beacon.ts b/apps/web/src/components/poll/use-touch-beacon.ts index af99cf4b0..946d9d503 100644 --- a/apps/web/src/components/poll/use-touch-beacon.ts +++ b/apps/web/src/components/poll/use-touch-beacon.ts @@ -1,7 +1,6 @@ +import { trpc } from "@rallly/backend"; import { useMount } from "react-use"; -import { trpc } from "../../utils/trpc"; - /** * Touching a poll updates a column with the current date. This information is used to * find polls that haven't been accessed for some time so that they can be deleted by house keeping. diff --git a/apps/web/src/components/profile.tsx b/apps/web/src/components/profile.tsx index dd74ced90..dd31d92ab 100644 --- a/apps/web/src/components/profile.tsx +++ b/apps/web/src/components/profile.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import Head from "next/head"; import Link from "next/link"; import { useRouter } from "next/router"; @@ -12,7 +13,6 @@ import User from "@/components/icons/user.svg"; import Tooltip from "@/components/tooltip"; import { useDayjs } from "../utils/dayjs"; -import { trpc } from "../utils/trpc"; import { EmptyState } from "./empty-state"; import { UserDetails } from "./profile/user-details"; import { useUser } from "./user-provider"; diff --git a/apps/web/src/components/profile/user-details.tsx b/apps/web/src/components/profile/user-details.tsx index 72634bcf6..e0f17dbfa 100644 --- a/apps/web/src/components/profile/user-details.tsx +++ b/apps/web/src/components/profile/user-details.tsx @@ -1,3 +1,4 @@ +import { trpc } from "@rallly/backend"; import { m } from "framer-motion"; import { useTranslation } from "next-i18next"; import * as React from "react"; @@ -6,7 +7,6 @@ import { useForm } from "react-hook-form"; import { usePostHog } from "@/utils/posthog"; import { requiredString, validEmail } from "../../utils/form-validation"; -import { trpc } from "../../utils/trpc"; import { Button } from "../button"; import { TextInput } from "../text-input"; diff --git a/apps/web/src/components/user-provider.tsx b/apps/web/src/components/user-provider.tsx index 424ae70ec..f296ffb71 100644 --- a/apps/web/src/components/user-provider.tsx +++ b/apps/web/src/components/user-provider.tsx @@ -1,16 +1,15 @@ +import { trpc, UserSession } from "@rallly/backend"; +import { useRouter } from "next/router"; import { useTranslation } from "next-i18next"; import React from "react"; -import { UserSession } from "@/utils/auth"; import { usePostHog } from "@/utils/posthog"; -import { trpc } from "../utils/trpc"; import { useRequiredContext } from "./use-required-context"; export const UserContext = React.createContext<{ user: UserSession & { shortName: string }; refresh: () => void; - isUpdating: boolean; logout: () => void; ownsObject: (obj: { userId: string | null }) => boolean; } | null>(null); @@ -55,13 +54,10 @@ export const UserProvider = (props: { const queryClient = trpc.useContext(); const { data: user } = trpc.whoami.get.useQuery(); - const [isUpdating, setIsUpdating] = React.useState(false); - + const router = useRouter(); const logout = trpc.whoami.destroy.useMutation({ onSuccess: async () => { - setIsUpdating(true); - await queryClient.whoami.invalidate(); - setIsUpdating(false); + router.push("/logout"); }, }); @@ -91,7 +87,6 @@ export const UserProvider = (props: { return ( { return queryClient.whoami.invalidate(); diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts index 031d1e131..05cbe0ff0 100644 --- a/apps/web/src/middleware.ts +++ b/apps/web/src/middleware.ts @@ -25,8 +25,10 @@ const supportedLocales = [ "zh", ]; -export function middleware({ headers, cookies, nextUrl }: NextRequest) { +export async function middleware(req: NextRequest) { + const { headers, cookies, nextUrl } = req; const newUrl = nextUrl.clone(); + const res = NextResponse.next(); // Check if locale is specified in cookie const localeCookie = cookies.get("NEXT_LOCALE"); @@ -50,7 +52,7 @@ export function middleware({ headers, cookies, nextUrl }: NextRequest) { } } - return NextResponse.next(); + return res; } export const config = { diff --git a/apps/web/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx index 482ec97f9..30366f0e4 100644 --- a/apps/web/src/pages/_app.tsx +++ b/apps/web/src/pages/_app.tsx @@ -1,7 +1,8 @@ import "react-big-calendar/lib/css/react-big-calendar.css"; import "tailwindcss/tailwind.css"; -import "~/style.css"; +import "../style.css"; +import { trpc, UserSession } from "@rallly/backend/next/trpc/client"; import { inject } from "@vercel/analytics"; import { NextPage } from "next"; import { AppProps } from "next/app"; @@ -12,15 +13,12 @@ import { DefaultSeo } from "next-seo"; import posthog from "posthog-js"; import { PostHogProvider } from "posthog-js/react"; import React from "react"; -import { Toaster } from "react-hot-toast"; import Maintenance from "@/components/maintenance"; import { useCrispChat } from "../components/crisp-chat"; import { NextPageWithLayout } from "../types"; import { absoluteUrl } from "../utils/absolute-url"; -import { UserSession } from "../utils/auth"; -import { trpc } from "../utils/trpc"; const inter = Inter({ subsets: ["latin"], @@ -94,7 +92,6 @@ const MyApp: NextPage = ({ Component, pageProps }) => { content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=5, user-scalable=yes" /> -