diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index a3cc0817..8ea9c1cb 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -70,6 +70,7 @@ model Membership {
siteId String
role MembershipRole
acceptedAt DateTime?
+ // Last time the user switched to this membership using the site switcher in the dashboard
lastSwitchedTo DateTime @default(now())
config Json @default("{}")
diff --git a/src/components/dashboard/DashboardLayout.tsx b/src/components/dashboard/DashboardLayout.tsx
index ce7bf5dc..33f71d14 100644
--- a/src/components/dashboard/DashboardLayout.tsx
+++ b/src/components/dashboard/DashboardLayout.tsx
@@ -12,8 +12,11 @@ export function DashboardLayout({ children }: { children: React.ReactNode }) {
const router = useRouter()
const subdomain = router.query.subdomain as string
- const sitesResult = trpc.useQuery(["dashbaord.sitesForSwitcher"], {})
- const sites = sitesResult.data
+ const subscriptionsQuery = trpc.useQuery(
+ ["user.getSubscriptions", { canManage: true }],
+ {}
+ )
+ const subscriptions = subscriptionsQuery.data
const viewerResult = trpc.useQuery(["auth.viewer"])
const viewer = viewerResult.data
@@ -120,7 +123,7 @@ export function DashboardLayout({ children }: { children: React.ReactNode }) {
diff --git a/src/components/dashboard/SiteSwitcher.tsx b/src/components/dashboard/SiteSwitcher.tsx
index 240bfaf8..2ac7b0eb 100644
--- a/src/components/dashboard/SiteSwitcher.tsx
+++ b/src/components/dashboard/SiteSwitcher.tsx
@@ -1,31 +1,53 @@
import { Popover } from "@headlessui/react"
import Link from "next/link"
-import { useMemo } from "react"
+import { useEffect, useMemo } from "react"
+import { trpc } from "~/lib/trpc"
import { getUserContentsUrl } from "~/lib/user-contents"
import { Avatar } from "../ui/Avatar"
type Props = {
subdomain: string
- sites: { id: string; name: string; subdomain: string; icon?: string | null }[]
+ subscriptions: {
+ id: string
+ site: { id: string; name: string; subdomain: string; icon?: string | null }
+ }[]
viewer?: { email: string } | null
}
-export const SiteSwitcher: React.FC = ({ subdomain, sites, viewer }) => {
- const activeSite = useMemo(
- () => sites.find((s) => s.subdomain === subdomain),
- [subdomain, sites]
+export const SiteSwitcher: React.FC = ({
+ subdomain,
+ subscriptions,
+ viewer,
+}) => {
+ const activeSubscription = useMemo(
+ () => subscriptions.find((s) => s.site.subdomain === subdomain),
+ [subdomain, subscriptions]
)
+
+ const { mutate: updateMembership } = trpc.useMutation(
+ "membership.updateMembership"
+ )
+
+ useEffect(() => {
+ if (activeSubscription?.id) {
+ updateMembership({
+ id: activeSubscription?.id,
+ lastSwitchedTo: new Date().toISOString(),
+ })
+ }
+ }, [activeSubscription?.id, updateMembership])
+
return (
-
{activeSite?.name}
+
{activeSubscription?.site.name}
)}
- {sites?.map((site) => {
+ {subscriptions?.map((subscription) => {
return (
-
+
- {site.name}
- {activeSite?.id === site.id && (
+
+ {subscription.site.name}
+
+ {activeSubscription?.id === subscription.id && (