♻️ Move trpc client code to app (#906)

This commit is contained in:
Luke Vella 2023-10-20 15:46:02 +01:00 committed by GitHub
parent 502f2a7a43
commit 5be17fd249
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 133 additions and 124 deletions

View file

@ -1,7 +1,6 @@
import "tailwindcss/tailwind.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 { inject } from "@vercel/analytics";
import dayjs from "dayjs"; import dayjs from "dayjs";
import localizedFormat from "dayjs/plugin/localizedFormat"; import localizedFormat from "dayjs/plugin/localizedFormat";
@ -27,12 +26,8 @@ const inter = Inter({
display: "swap", display: "swap",
}); });
type PageProps = { type AppPropsWithLayout = AppProps & {
user?: UserSession; Component: NextPageWithLayout;
};
type AppPropsWithLayout = AppProps<PageProps> & {
Component: NextPageWithLayout<PageProps>;
}; };
const MyApp: NextPage<AppPropsWithLayout> = ({ Component, pageProps }) => { const MyApp: NextPage<AppPropsWithLayout> = ({ Component, pageProps }) => {
@ -112,4 +107,4 @@ const MyApp: NextPage<AppPropsWithLayout> = ({ Component, pageProps }) => {
); );
}; };
export default trpc.withTRPC(appWithTranslation(MyApp, nextI18nNextConfig)); export default appWithTranslation(MyApp, nextI18nNextConfig);

View file

@ -32,7 +32,11 @@
"@sentry/nextjs": "^7.46.0", "@sentry/nextjs": "^7.46.0",
"@svgr/webpack": "^6.5.1", "@svgr/webpack": "^6.5.1",
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"@tanstack/react-query": "^4.0.0",
"@tanstack/react-table": "^8.9.1", "@tanstack/react-table": "^8.9.1",
"@trpc/client": "^10.13.0",
"@trpc/next": "^10.13.0",
"@trpc/react-query": "^10.13.0",
"@vercel/og": "^0.5.13", "@vercel/og": "^0.5.13",
"accept-language-parser": "^1.5.0", "accept-language-parser": "^1.5.0",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
@ -67,7 +71,7 @@
"react-use": "^17.4.0", "react-use": "^17.4.0",
"smoothscroll-polyfill": "^0.4.4", "smoothscroll-polyfill": "^0.4.4",
"spacetime": "^7.4.7", "spacetime": "^7.4.7",
"superjson": "^1.12.2", "superjson": "^2.0.0",
"timezone-soft": "^1.4.1" "timezone-soft": "^1.4.1"
}, },
"devDependencies": { "devDependencies": {

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
@ -9,6 +8,7 @@ import { useForm } from "react-hook-form";
import { createGlobalState } from "react-use"; import { createGlobalState } from "react-use";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { requiredString, validEmail } from "../../utils/form-validation"; import { requiredString, validEmail } from "../../utils/form-validation";
import { TextInput } from "../text-input"; import { TextInput } from "../text-input";

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { import {
Card, Card,
@ -17,6 +16,7 @@ import { useUnmount } from "react-use";
import { PollSettingsForm } from "@/components/forms/poll-settings"; import { PollSettingsForm } from "@/components/forms/poll-settings";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { NewEventData, PollDetailsForm, PollOptionsForm } from "./forms"; import { NewEventData, PollDetailsForm, PollOptionsForm } from "./forms";

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { import {
MessageCircleIcon, MessageCircleIcon,
MoreHorizontalIcon, MoreHorizontalIcon,
@ -21,6 +20,7 @@ import { Trans } from "@/components/trans";
import { usePermissions } from "@/contexts/permissions"; import { usePermissions } from "@/contexts/permissions";
import { useRole } from "@/contexts/role"; import { useRole } from "@/contexts/role";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { requiredString } from "../../utils/form-validation"; import { requiredString } from "../../utils/form-validation";
import NameInput from "../name-input"; import NameInput from "../name-input";

View file

@ -1,10 +1,10 @@
import { trpc } from "@rallly/backend";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import React from "react"; import React from "react";
import { StandardLayout } from "@/components/layouts/standard-layout"; import { StandardLayout } from "@/components/layouts/standard-layout";
import { useUser } from "@/components/user-provider"; import { useUser } from "@/components/user-provider";
import { NextPageWithLayout } from "@/types"; import { NextPageWithLayout } from "@/types";
import { trpc } from "@/utils/trpc/client";
const AdminLayout = (props: React.PropsWithChildren) => { const AdminLayout = (props: React.PropsWithChildren) => {
const router = useRouter(); const router = useRouter();

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { import {
ArrowLeftIcon, ArrowLeftIcon,
ArrowUpRight, ArrowUpRight,
@ -48,6 +47,7 @@ import { Trans } from "@/components/trans";
import { useUser } from "@/components/user-provider"; import { useUser } from "@/components/user-provider";
import { usePoll } from "@/contexts/poll"; import { usePoll } from "@/contexts/poll";
import Error404 from "@/pages/404"; import Error404 from "@/pages/404";
import { trpc } from "@/utils/trpc/client";
import { NextPageWithLayout } from "../../types"; import { NextPageWithLayout } from "../../types";

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { PencilIcon, TagIcon, TrashIcon } from "@rallly/icons"; import { PencilIcon, TagIcon, TrashIcon } from "@rallly/icons";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { import {
@ -37,6 +36,7 @@ import { useDeleteParticipantMutation } from "@/components/poll/mutations";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { useFormValidation } from "@/utils/form-validation"; import { useFormValidation } from "@/utils/form-validation";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { Participant } from ".prisma/client"; import { Participant } from ".prisma/client";

View file

@ -1,9 +1,9 @@
import { trpc } from "@rallly/backend";
import { Participant, VoteType } from "@rallly/database"; import { Participant, VoteType } from "@rallly/database";
import * as React from "react"; import * as React from "react";
import { useVisibility } from "@/components/visibility"; import { useVisibility } from "@/components/visibility";
import { usePermissions } from "@/contexts/permissions"; import { usePermissions } from "@/contexts/permissions";
import { trpc } from "@/utils/trpc/client";
import { Vote } from "@/utils/trpc/types"; import { Vote } from "@/utils/trpc/types";
import { useRequiredContext } from "./use-required-context"; import { useRequiredContext } from "./use-required-context";

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { import {
Dialog, Dialog,
@ -13,6 +12,7 @@ import * as React from "react";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
export const DeletePollDialog: React.FunctionComponent<{ export const DeletePollDialog: React.FunctionComponent<{
open: boolean; open: boolean;

View file

@ -1,7 +1,6 @@
import { trpc } from "@rallly/backend";
import { usePoll } from "@/components/poll-context"; import { usePoll } from "@/components/poll-context";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { ParticipantForm } from "./types"; import { ParticipantForm } from "./types";

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { BellOffIcon, BellRingIcon } from "@rallly/icons"; import { BellOffIcon, BellRingIcon } from "@rallly/icons";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { Tooltip, TooltipContent, TooltipTrigger } from "@rallly/ui/tooltip"; import { Tooltip, TooltipContent, TooltipTrigger } from "@rallly/ui/tooltip";
@ -10,6 +9,7 @@ import { Skeleton } from "@/components/skeleton";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { useUser } from "@/components/user-provider"; import { useUser } from "@/components/user-provider";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { usePoll } from "../poll-context"; import { usePoll } from "../poll-context";

View file

@ -1,6 +1,7 @@
import { trpc } from "@rallly/backend";
import { useMount } from "react-use"; import { useMount } from "react-use";
import { trpc } from "@/utils/trpc/client";
/** /**
* Touching a poll updates a column with the current date. This information is used to * 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. * find polls that haven't been accessed for some time so that they can be deleted by house keeping.

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { ArrowUpRight } from "@rallly/icons"; import { ArrowUpRight } from "@rallly/icons";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { Form, FormField, FormItem, FormLabel } from "@rallly/ui/form"; import { Form, FormField, FormItem, FormLabel } from "@rallly/ui/form";
@ -12,6 +11,7 @@ import { z } from "zod";
import { LanguageSelect } from "@/components/poll/language-selector"; import { LanguageSelect } from "@/components/poll/language-selector";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { useUser } from "@/components/user-provider"; import { useUser } from "@/components/user-provider";
import { trpc } from "@/utils/trpc/client";
const formSchema = z.object({ const formSchema = z.object({
language: z.string(), language: z.string(),

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { Session } from "next-auth"; import { Session } from "next-auth";
import { signIn, useSession } from "next-auth/react"; import { signIn, useSession } from "next-auth/react";
@ -9,6 +8,7 @@ import { z } from "zod";
import { PostHogProvider } from "@/contexts/posthog"; import { PostHogProvider } from "@/contexts/posthog";
import { PreferencesProvider } from "@/contexts/preferences"; import { PreferencesProvider } from "@/contexts/preferences";
import { isSelfHosted } from "@/utils/constants"; import { isSelfHosted } from "@/utils/constants";
import { trpc } from "@/utils/trpc/client";
import { useRequiredContext } from "./use-required-context"; import { useRequiredContext } from "./use-required-context";

View file

@ -1,7 +1,8 @@
import { trpc } from "@rallly/backend";
import React from "react"; import React from "react";
import { createStateContext } from "react-use"; import { createStateContext } from "react-use";
import { trpc } from "@/utils/trpc/client";
export const [usePollId, PollIdProvider] = createStateContext<string>(""); export const [usePollId, PollIdProvider] = createStateContext<string>("");
const useCurrentEventId = () => { const useCurrentEventId = () => {

View file

@ -1,10 +1,10 @@
import { trpc } from "@rallly/backend";
import { Badge } from "@rallly/ui/badge"; import { Badge } from "@rallly/ui/badge";
import React from "react"; import React from "react";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { useUser } from "@/components/user-provider"; import { useUser } from "@/components/user-provider";
import { isSelfHosted } from "@/utils/constants"; import { isSelfHosted } from "@/utils/constants";
import { trpc } from "@/utils/trpc/client";
export const useSubscription = () => { export const useSubscription = () => {
const { user } = useUser(); const { user } = useUser();

View file

@ -1,9 +1,9 @@
import { trpc } from "@rallly/backend";
import dayjs, { Dayjs } from "dayjs"; import dayjs, { Dayjs } from "dayjs";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import React from "react"; import React from "react";
import { useDayjs } from "@/utils/dayjs"; import { useDayjs } from "@/utils/dayjs";
import { trpc } from "@/utils/trpc/client";
export const usePoll = () => { export const usePoll = () => {
const router = useRouter(); const router = useRouter();

View file

@ -2,7 +2,6 @@ import "react-big-calendar/lib/css/react-big-calendar.css";
import "tailwindcss/tailwind.css"; import "tailwindcss/tailwind.css";
import "../style.css"; import "../style.css";
import { trpc } from "@rallly/backend/next/trpc/client";
import { TooltipProvider } from "@rallly/ui/tooltip"; import { TooltipProvider } from "@rallly/ui/tooltip";
import { domMax, LazyMotion } from "framer-motion"; import { domMax, LazyMotion } from "framer-motion";
import { NextPage } from "next"; import { NextPage } from "next";
@ -15,6 +14,7 @@ import { appWithTranslation } from "next-i18next";
import { DefaultSeo } from "next-seo"; import { DefaultSeo } from "next-seo";
import Maintenance from "@/components/maintenance"; import Maintenance from "@/components/maintenance";
import { trpc } from "@/utils/trpc/client";
import * as nextI18nNextConfig from "../../next-i18next.config.js"; import * as nextI18nNextConfig from "../../next-i18next.config.js";
import { NextPageWithLayout } from "../types"; import { NextPageWithLayout } from "../types";

View file

@ -1,5 +1,6 @@
import { trpcNextApiHandler } from "@rallly/backend/next/trpc/server"; import { createTRPCContext } from "@rallly/backend/trpc/context";
import { NextApiRequest, NextApiResponse } from "next"; import { AppRouter, appRouter } from "@rallly/backend/trpc/routers";
import * as trpcNext from "@trpc/server/adapters/next";
import { absoluteUrl, shortUrl } from "@/utils/absolute-url"; import { absoluteUrl, shortUrl } from "@/utils/absolute-url";
import { getServerSession, isEmailBlocked } from "@/utils/auth"; import { getServerSession, isEmailBlocked } from "@/utils/auth";
@ -12,27 +13,27 @@ export const config = {
}, },
}; };
// export API handler export default trpcNext.createNextApiHandler<AppRouter>({
export default async function handler( router: appRouter,
req: NextApiRequest, createContext: async (opts) => {
res: NextApiResponse, return createTRPCContext(opts, {
) { async getUser({ req, res }) {
const session = await getServerSession(req, res); const session = await getServerSession(req, res);
if (!session) { if (!session) {
res.status(401).json({ error: "Unauthorized" }); return null;
return;
} }
return trpcNextApiHandler({ return {
user: {
isGuest: session.user.email === null,
id: session.user.id, id: session.user.id,
isGuest: session.user.email === null,
};
}, },
emailClient, emailClient,
isSelfHosted, isSelfHosted,
isEmailBlocked, isEmailBlocked,
absoluteUrl, absoluteUrl,
shortUrl, shortUrl,
})(req, res); });
} },
});

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { prisma } from "@rallly/database"; import { prisma } from "@rallly/database";
import { ArrowUpLeftIcon } from "@rallly/icons"; import { ArrowUpLeftIcon } from "@rallly/icons";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
@ -20,6 +19,7 @@ import { PermissionsContext } from "@/contexts/permissions";
import { usePoll } from "@/contexts/poll"; import { usePoll } from "@/contexts/poll";
import { absoluteUrl } from "@/utils/absolute-url"; import { absoluteUrl } from "@/utils/absolute-url";
import { ConnectedDayjsProvider } from "@/utils/dayjs"; import { ConnectedDayjsProvider } from "@/utils/dayjs";
import { trpc } from "@/utils/trpc/client";
import { getStaticTranslations } from "@/utils/with-page-translations"; import { getStaticTranslations } from "@/utils/with-page-translations";
import Error404 from "../404"; import Error404 from "../404";

View file

@ -1,5 +1,4 @@
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import { trpc } from "@rallly/backend";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { import {
Card, Card,
@ -28,6 +27,7 @@ import { usePoll } from "@/components/poll-context";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { NextPageWithLayout } from "@/types"; import { NextPageWithLayout } from "@/types";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { getStaticTranslations } from "@/utils/with-page-translations"; import { getStaticTranslations } from "@/utils/with-page-translations";
const formSchema = z.object({ const formSchema = z.object({

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { import {
CardContent, CardContent,
@ -18,6 +17,7 @@ import { usePlan } from "@/contexts/plan";
import { usePoll } from "@/contexts/poll"; import { usePoll } from "@/contexts/poll";
import { NextPageWithLayout } from "@/types"; import { NextPageWithLayout } from "@/types";
import { usePostHog } from "@/utils/posthog"; import { usePostHog } from "@/utils/posthog";
import { trpc } from "@/utils/trpc/client";
import { getStaticTranslations } from "@/utils/with-page-translations"; import { getStaticTranslations } from "@/utils/with-page-translations";
const FinalizationForm = () => { const FinalizationForm = () => {

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { import {
InboxIcon, InboxIcon,
PauseCircleIcon, PauseCircleIcon,
@ -25,6 +24,7 @@ import { Skeleton } from "@/components/skeleton";
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { NextPageWithLayout } from "@/types"; import { NextPageWithLayout } from "@/types";
import { useDayjs } from "@/utils/dayjs"; import { useDayjs } from "@/utils/dayjs";
import { trpc } from "@/utils/trpc/client";
import { getStaticTranslations } from "@/utils/with-page-translations"; import { getStaticTranslations } from "@/utils/with-page-translations";
const EmptyState = () => { const EmptyState = () => {
@ -94,7 +94,7 @@ const Page: NextPageWithLayout = () => {
key={poll.id} key={poll.id}
className="flex overflow-hidden rounded-md border shadow-sm" className="flex overflow-hidden rounded-md border shadow-sm"
> >
<div className="flex grow flex-col-reverse justify-between gap-y-4 gap-x-4 bg-white p-4 sm:flex-row sm:items-start sm:px-6"> <div className="flex grow flex-col-reverse justify-between gap-x-4 gap-y-4 bg-white p-4 sm:flex-row sm:items-start sm:px-6">
<div className="flex gap-x-4"> <div className="flex gap-x-4">
<div className="sm:-ml-2"> <div className="sm:-ml-2">
{poll.event ? ( {poll.event ? (

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import Head from "next/head"; import Head from "next/head";
import Link from "next/link"; import Link from "next/link";
@ -15,6 +14,7 @@ import { TextInput } from "@/components/text-input";
import { NextPageWithLayout } from "@/types"; import { NextPageWithLayout } from "@/types";
import { useDayjs } from "@/utils/dayjs"; import { useDayjs } from "@/utils/dayjs";
import { requiredString, validEmail } from "@/utils/form-validation"; import { requiredString, validEmail } from "@/utils/form-validation";
import { trpc } from "@/utils/trpc/client";
import { AuthLayout } from "../components/auth/auth-layout"; import { AuthLayout } from "../components/auth/auth-layout";
import { getStaticTranslations } from "../utils/with-page-translations"; import { getStaticTranslations } from "../utils/with-page-translations";

View file

@ -1,4 +1,3 @@
import { trpc } from "@rallly/backend";
import { ArrowUpRight, CreditCardIcon, SendIcon } from "@rallly/icons"; import { ArrowUpRight, CreditCardIcon, SendIcon } from "@rallly/icons";
import { Button } from "@rallly/ui/button"; import { Button } from "@rallly/ui/button";
import { Card } from "@rallly/ui/card"; import { Card } from "@rallly/ui/card";
@ -20,6 +19,7 @@ import {
import { Trans } from "@/components/trans"; import { Trans } from "@/components/trans";
import { useSubscription } from "@/contexts/plan"; import { useSubscription } from "@/contexts/plan";
import { isSelfHosted } from "@/utils/constants"; import { isSelfHosted } from "@/utils/constants";
import { trpc } from "@/utils/trpc/client";
import { NextPageWithLayout } from "../../types"; import { NextPageWithLayout } from "../../types";
import { getStaticTranslations } from "../../utils/with-page-translations"; import { getStaticTranslations } from "../../utils/with-page-translations";

View file

@ -187,7 +187,7 @@ const authOptions = {
}, },
} satisfies NextAuthOptions; } satisfies NextAuthOptions;
export function getServerSession( export async function getServerSession(
...args: ...args:
| [GetServerSidePropsContext["req"], GetServerSidePropsContext["res"]] | [GetServerSidePropsContext["req"], GetServerSidePropsContext["res"]]
| [NextApiRequest, NextApiResponse] | [NextApiRequest, NextApiResponse]

View file

@ -1,19 +1,17 @@
import { AppRouter } from "@rallly/backend/trpc/routers";
import * as Sentry from "@sentry/browser";
import { MutationCache } from "@tanstack/react-query"; import { MutationCache } from "@tanstack/react-query";
import { httpBatchLink } from "@trpc/client"; import { httpBatchLink } from "@trpc/client";
import { createTRPCNext } from "@trpc/next"; import { createTRPCNext } from "@trpc/next";
import toast from "react-hot-toast"; import toast from "react-hot-toast";
import superjson from "superjson"; import superjson from "superjson";
import { AppRouter } from "../../trpc/routers";
export * from "../../trpc/types";
export const trpc = createTRPCNext<AppRouter>({ export const trpc = createTRPCNext<AppRouter>({
config() { config() {
return { return {
links: [ links: [
httpBatchLink({ httpBatchLink({
url: `/api/trpc`, url: "/api/trpc",
}), }),
], ],
transformer: superjson, transformer: superjson,
@ -21,20 +19,19 @@ export const trpc = createTRPCNext<AppRouter>({
defaultOptions: { defaultOptions: {
queries: { queries: {
retry: false, retry: false,
networkMode: "always",
cacheTime: Infinity, cacheTime: Infinity,
staleTime: 1000 * 60, staleTime: 1000 * 60,
}, },
}, },
mutationCache: new MutationCache({ mutationCache: new MutationCache({
onError: () => { onError: (error) => {
toast.error( toast.error(
"Uh oh! Something went wrong. The issue has been logged and we'll fix it as soon as possible. Please try again later.", "Uh oh! Something went wrong. The issue has been logged and we'll fix it as soon as possible. Please try again later.",
); );
Sentry.captureException(error);
}, },
}), }),
}, },
}; };
}, },
ssr: false,
}); });

View file

@ -1 +1 @@
export * from "./next/trpc/client"; export * from "./trpc/types";

View file

@ -1,27 +0,0 @@
import { EmailClient } from "@rallly/emails";
import * as trpcNext from "@trpc/server/adapters/next";
import { appRouter } from "../../trpc/routers";
export interface TRPCContext {
user: { id: string; isGuest: boolean };
emailClient: EmailClient;
isSelfHosted: boolean;
isEmailBlocked?: (email: string) => boolean;
/**
* Takes a relative path and returns an absolute URL to the app
* @param path
* @returns absolute URL
*/
absoluteUrl: (path?: string) => string;
shortUrl: (path?: string) => string;
}
export const trpcNextApiHandler = (context: TRPCContext) => {
return trpcNext.createNextApiHandler({
router: appRouter,
createContext: async () => {
return context;
},
});
};

View file

@ -12,15 +12,10 @@
"@rallly/database": "*", "@rallly/database": "*",
"@rallly/emails": "*", "@rallly/emails": "*",
"@rallly/utils": "*", "@rallly/utils": "*",
"@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", "@trpc/server": "^10.13.0",
"iron-session": "^6.3.1", "iron-session": "^6.3.1",
"spacetime": "^7.4.7", "spacetime": "^7.4.7",
"stripe": "^13.2.0", "stripe": "^13.2.0",
"superjson": "^1.12.2",
"timezone-soft": "^1.4.1" "timezone-soft": "^1.4.1"
} }
} }

View file

@ -0,0 +1,43 @@
import { EmailClient } from "@rallly/emails";
import { inferAsyncReturnType, TRPCError } from "@trpc/server";
import { CreateNextContextOptions } from "@trpc/server/adapters/next";
export type GetUserFn = (opts: CreateNextContextOptions) => Promise<{
id: string;
isGuest: boolean;
} | null>;
export interface TRPCContextParams {
getUser: GetUserFn;
emailClient: EmailClient;
isSelfHosted: boolean;
isEmailBlocked?: (email: string) => boolean;
/**
* Takes a relative path and returns an absolute URL to the app
* @param path
* @returns absolute URL
*/
absoluteUrl: (path?: string) => string;
shortUrl: (path?: string) => string;
}
export const createTRPCContext = async (
opts: CreateNextContextOptions,
{ getUser, ...params }: TRPCContextParams,
) => {
const user = await getUser(opts);
if (!user) {
throw new TRPCError({
code: "BAD_REQUEST",
message: "Request has no session",
});
}
return {
user,
...params,
};
};
export type TRPCContext = inferAsyncReturnType<typeof createTRPCContext>;

View file

@ -1,8 +1,8 @@
import { initTRPC, TRPCError } from "@trpc/server"; import { initTRPC, TRPCError } from "@trpc/server";
import superjson from "superjson"; import superjson from "superjson";
import { TRPCContext } from "../next/trpc/server";
import { getSubscriptionStatus } from "../utils/auth"; import { getSubscriptionStatus } from "../utils/auth";
import { TRPCContext } from "./context";
const t = initTRPC.context<TRPCContext>().create({ const t = initTRPC.context<TRPCContext>().create({
transformer: superjson, transformer: superjson,

View file

@ -3710,17 +3710,17 @@
lodash.merge "^4.6.2" lodash.merge "^4.6.2"
postcss-selector-parser "6.0.10" postcss-selector-parser "6.0.10"
"@tanstack/query-core@4.24.10": "@tanstack/query-core@4.36.1":
version "4.24.10" version "4.36.1"
resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.24.10.tgz" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.36.1.tgz#79f8c1a539d47c83104210be2388813a7af2e524"
integrity sha512-2QywqXEAGBIUoTdgn1lAB4/C8QEqwXHj2jrCLeYTk2xVGtLiPEUD8jcMoeB2noclbiW2mMt4+Fq7fZStuz3wAQ== integrity sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==
"@tanstack/react-query@^4.22.0": "@tanstack/react-query@^4.0.0":
version "4.24.10" version "4.36.1"
resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.24.10.tgz" resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.36.1.tgz#acb589fab4085060e2e78013164868c9c785e5d2"
integrity sha512-FY1DixytOcNNCydPQXLxuKEV7VSST32CAuJ55BjhDNqASnMLZn+6c30yQBMrODjmWMNwzfjMZnq0Vw7C62Fwow== integrity sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==
dependencies: dependencies:
"@tanstack/query-core" "4.24.10" "@tanstack/query-core" "4.36.1"
use-sync-external-store "^1.2.0" use-sync-external-store "^1.2.0"
"@tanstack/react-table@^8.9.1": "@tanstack/react-table@^8.9.1":
@ -3736,21 +3736,21 @@
integrity sha512-2+R83n8vMZND0q3W1lSiF7co9nFbeWbjAErFf27xwbeA9E0wtUu5ZDfgj+TZ6JzdAEQAgfxkk/QNFAKiS8E4MA== integrity sha512-2+R83n8vMZND0q3W1lSiF7co9nFbeWbjAErFf27xwbeA9E0wtUu5ZDfgj+TZ6JzdAEQAgfxkk/QNFAKiS8E4MA==
"@trpc/client@^10.13.0": "@trpc/client@^10.13.0":
version "10.13.2" version "10.41.0"
resolved "https://registry.npmjs.org/@trpc/client/-/client-10.13.2.tgz" resolved "https://registry.yarnpkg.com/@trpc/client/-/client-10.41.0.tgz#8abde2ae72fe33cb762ccbc8ba03f39d51c91cd5"
integrity sha512-iEZOAYS/Ak5T6j2lrN2NCYYLb8YY9sbj4JJR9VgxDL8Cz1dRFpFZ2BA4VwNW6xoh0G+MRdSGvivTYdggbJ4BBg== integrity sha512-W4lYULb7//2yXkULCKim49slXsBwiBq48rfge1yOWXdq0Ed8VxzXvZt8+uWOkxmHbQAw4lq8G5fCNYFB+Za6vQ==
"@trpc/next@^10.13.0": "@trpc/next@^10.13.0":
version "10.13.2" version "10.41.0"
resolved "https://registry.npmjs.org/@trpc/next/-/next-10.13.2.tgz" resolved "https://registry.yarnpkg.com/@trpc/next/-/next-10.41.0.tgz#1d29d418cc333f5cb3e1c1f11647d74c7950a288"
integrity sha512-0GV9JanTY6PqWVd4W/OWIy8SI4qQD0F2ak4OgxLLothqB+ARzHpYkoZO+E3Y13/O+NV5RhWF6sIXXXX6doNghQ== integrity sha512-QwvZrvDjRFEzErmLZ4hMdYfX13nsH0SpijjuTNPIlSIyFISCIfDCqmBvWC07O6fCG/swh+XM19FhJN6RMqTlKQ==
dependencies: dependencies:
react-ssr-prepass "^1.5.0" react-ssr-prepass "^1.5.0"
"@trpc/react-query@^10.13.0": "@trpc/react-query@^10.13.0":
version "10.13.2" version "10.41.0"
resolved "https://registry.npmjs.org/@trpc/react-query/-/react-query-10.13.2.tgz" resolved "https://registry.yarnpkg.com/@trpc/react-query/-/react-query-10.41.0.tgz#eb07732df29b58861b583eff249a7ef6dadef5d7"
integrity sha512-wLNDZKe5yQ2AYs/uoymxyRn5jNdYNpbOX17tHirnDDPKDRJojooGuL6uIDS1kvm70QJiNR/UKjKfwLDgZdGcqw== integrity sha512-pCLZfIgcnneq1AocPLvstALawZYWS/sbhujd4mwUwA3UXFBWC/D31ysPlbz7R1dhjxhhPaIM+C6pz8vmr2ctpw==
"@trpc/server@^10.13.0": "@trpc/server@^10.13.0":
version "10.13.2" version "10.13.2"
@ -10585,10 +10585,10 @@ sucrase@^3.32.0:
pirates "^4.0.1" pirates "^4.0.1"
ts-interface-checker "^0.1.9" ts-interface-checker "^0.1.9"
superjson@^1.12.2: superjson@^2.0.0:
version "1.12.2" version "2.0.0"
resolved "https://registry.npmjs.org/superjson/-/superjson-1.12.2.tgz" resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.0.0.tgz#7abcbe6c1badc2e689ea62c375ca257666a68282"
integrity sha512-ugvUo9/WmvWOjstornQhsN/sR9mnGtWGYeTxFuqLb4AiT4QdUavjGFRALCPKWWnAiUJ4HTpytj5e0t5HoMRkXg== integrity sha512-W3n+NJ7TFjaLle8ihIIvsr/bbuKpnxeatsyjmhy7iSkom+/cshaHziCQAWXrHGWJVQSQFDOuES6C3nSEvcbrQg==
dependencies: dependencies:
copy-anything "^3.0.2" copy-anything "^3.0.2"
@ -11211,7 +11211,7 @@ use-sidecar@^1.1.2:
use-sync-external-store@^1.2.0: use-sync-external-store@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: