From 7ab25c68debfb7143710e3b5e58d9fd150ba4f48 Mon Sep 17 00:00:00 2001 From: Luke Vella Date: Mon, 23 Jun 2025 10:29:18 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20instance=20sett?= =?UTF-8?q?ings=20to=20use=20cache=20(#1785)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../control-panel/settings/actions.ts | 20 ----------- .../settings/instance-settings-form.tsx | 2 +- .../src/features/instance-settings/client.tsx | 25 +++++++++++++ .../features/instance-settings/constants.ts | 1 + .../features/instance-settings/mutations.ts | 19 ++++++++++ .../src/features/instance-settings/queries.ts | 36 +++++++++++-------- 6 files changed, 68 insertions(+), 35 deletions(-) delete mode 100644 apps/web/src/app/[locale]/control-panel/settings/actions.ts create mode 100644 apps/web/src/features/instance-settings/client.tsx create mode 100644 apps/web/src/features/instance-settings/constants.ts create mode 100644 apps/web/src/features/instance-settings/mutations.ts diff --git a/apps/web/src/app/[locale]/control-panel/settings/actions.ts b/apps/web/src/app/[locale]/control-panel/settings/actions.ts deleted file mode 100644 index a39e0ada5..000000000 --- a/apps/web/src/app/[locale]/control-panel/settings/actions.ts +++ /dev/null @@ -1,20 +0,0 @@ -"use server"; - -import { requireAdmin } from "@/auth/queries"; -import type { InstanceSettings } from "@/features/instance-settings/schema"; -import { prisma } from "@rallly/database"; - -export async function updateInstanceSettings({ - disableUserRegistration, -}: InstanceSettings) { - await requireAdmin(); - - await prisma.instanceSettings.update({ - where: { - id: 1, - }, - data: { - disableUserRegistration, - }, - }); -} 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 e447924fe..7a36be0ea 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 @@ -8,6 +8,7 @@ import { SettingsGroupTitle, } from "@/components/settings-group"; import { Trans } from "@/components/trans"; +import { updateInstanceSettings } from "@/features/instance-settings/mutations"; import { type InstanceSettings, instanceSettingsSchema, @@ -31,7 +32,6 @@ import { import { useToast } from "@rallly/ui/hooks/use-toast"; import { Switch } from "@rallly/ui/switch"; import { useForm } from "react-hook-form"; -import { updateInstanceSettings } from "./actions"; export function InstanceSettingsForm({ defaultValue, diff --git a/apps/web/src/features/instance-settings/client.tsx b/apps/web/src/features/instance-settings/client.tsx new file mode 100644 index 000000000..852d709a0 --- /dev/null +++ b/apps/web/src/features/instance-settings/client.tsx @@ -0,0 +1,25 @@ +"use client"; + +import React from "react"; +import type { InstanceSettings } from "./schema"; + +const InstanceSettingsContext = React.createContext({ + disableUserRegistration: false, +}); + +export function InstanceSettingsProvider({ + value, + children, +}: { + value: InstanceSettings; + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} + +export const useInstanceSettings = () => + React.useContext(InstanceSettingsContext); diff --git a/apps/web/src/features/instance-settings/constants.ts b/apps/web/src/features/instance-settings/constants.ts new file mode 100644 index 000000000..1397f1a11 --- /dev/null +++ b/apps/web/src/features/instance-settings/constants.ts @@ -0,0 +1 @@ +export const instanceSettingsTag = "instance-settings"; diff --git a/apps/web/src/features/instance-settings/mutations.ts b/apps/web/src/features/instance-settings/mutations.ts new file mode 100644 index 000000000..a06253a4b --- /dev/null +++ b/apps/web/src/features/instance-settings/mutations.ts @@ -0,0 +1,19 @@ +"use server"; + +import { requireAdmin } from "@/auth/queries"; +import { type InstanceSettings, prisma } from "@rallly/database"; +import { revalidateTag } from "next/cache"; +import { instanceSettingsTag } from "./constants"; + +export async function updateInstanceSettings(data: Partial) { + await requireAdmin(); + + await prisma.instanceSettings.update({ + where: { + id: 1, + }, + data, + }); + + revalidateTag(instanceSettingsTag); +} diff --git a/apps/web/src/features/instance-settings/queries.ts b/apps/web/src/features/instance-settings/queries.ts index ffc674f86..727599613 100644 --- a/apps/web/src/features/instance-settings/queries.ts +++ b/apps/web/src/features/instance-settings/queries.ts @@ -1,18 +1,26 @@ "server-only"; import { prisma } from "@rallly/database"; -import { cache } from "react"; +import { unstable_cache } from "next/cache"; +import { instanceSettingsTag } from "./constants"; -export const getInstanceSettings = cache(async () => { - const instanceSettings = await prisma.instanceSettings.findUnique({ - where: { - id: 1, - }, - select: { - disableUserRegistration: true, - }, - }); +export const getInstanceSettings = unstable_cache( + async () => { + const instanceSettings = await prisma.instanceSettings.findUnique({ + where: { + id: 1, + }, + select: { + disableUserRegistration: true, + }, + }); - return { - disableUserRegistration: instanceSettings?.disableUserRegistration ?? false, - }; -}); + return { + disableUserRegistration: + instanceSettings?.disableUserRegistration ?? false, + }; + }, + [], + { + tags: [instanceSettingsTag], + }, +);