Updated so that the rules and class text can be updated through the admin page
This commit is contained in:
+27
-5
@@ -5,8 +5,9 @@
|
||||
import { useActionState, useEffect, useState } from 'react';
|
||||
import { FaPlus, FaTrash, FaArrowUp, FaArrowDown } from 'react-icons/fa'; // Importera pilarna
|
||||
import { saveConfigAction } from './actions';
|
||||
import { SiteConfig } from '../lib/config';
|
||||
|
||||
export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
||||
export default function AdminForm({ initialConfig }: { initialConfig: SiteConfig }) {
|
||||
const [state, formAction, isPending] = useActionState(saveConfigAction, null);
|
||||
const [showToast, setShowToast] = useState(false);
|
||||
|
||||
@@ -49,9 +50,12 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
||||
|
||||
useEffect(() => {
|
||||
if (state?.success) {
|
||||
setShowToast(true);
|
||||
const timer = setTimeout(() => setShowToast(false), 3000);
|
||||
return () => clearTimeout(timer);
|
||||
const showTimer = setTimeout(() => setShowToast(true), 0);
|
||||
const hideTimer = setTimeout(() => setShowToast(false), 3000);
|
||||
return () => {
|
||||
clearTimeout(showTimer);
|
||||
clearTimeout(hideTimer);
|
||||
};
|
||||
}
|
||||
}, [state]);
|
||||
|
||||
@@ -87,9 +91,17 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-bold mb-1">Regeltext (HTML tillåtet)</label>
|
||||
<p className="text-xs text-gray-500 mb-2">
|
||||
Du kan använda <b>{"<a target=\"_blank\" href=\"länk\">text</a>"}</b> för länkar och <b>{"<i>text</i>"}</b> för kursiv text.
|
||||
</p>
|
||||
<textarea name="rulesText" defaultValue={initialConfig.beachPage.rulesText} className="w-full border p-2 rounded h-48" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-bold mb-1">Meddelande vid stängd anmälan</label>
|
||||
<textarea name="closeReason" defaultValue={initialConfig.beachPage.closeReason} className="w-full border p-2 rounded h-20" />
|
||||
<textarea name="closeReason" defaultValue={initialConfig.beachPage.closeReason} className="w-full border p-2 rounded h-32" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@@ -121,6 +133,11 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-bold mb-1">Intro-text ovanför klasserna</label>
|
||||
<textarea name="classesIntroText" defaultValue={initialConfig.beachPage.classesIntroText} className="w-full border p-2 rounded h-16" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-3">
|
||||
{classes.map((c, index) => (
|
||||
<div key={index} className="flex flex-col md:flex-row gap-3 items-center w-full">
|
||||
@@ -180,6 +197,11 @@ export default function AdminForm({ initialConfig }: { initialConfig: any }) {
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="mt-2">
|
||||
<label className="block text-sm font-bold mb-1">Avslutande text under klasserna</label>
|
||||
<textarea name="classesOutroText" defaultValue={initialConfig.beachPage.classesOutroText} className="w-full border p-2 rounded h-16" />
|
||||
</div>
|
||||
|
||||
{/* Dold JSON-sträng för Server Action */}
|
||||
<input type="hidden" name="classesJSON" value={JSON.stringify(classes)} />
|
||||
</section>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
import { getConfig, updateConfig } from '../lib/config';
|
||||
import { revalidatePath } from 'next/cache';
|
||||
|
||||
export async function saveConfigAction(prevState: any, formData: FormData) {
|
||||
export async function saveConfigAction(prevState: { success?: boolean } | null | unknown, formData: FormData) {
|
||||
const config = await getConfig();
|
||||
|
||||
let parsedClasses = [];
|
||||
@@ -26,6 +26,9 @@ export async function saveConfigAction(prevState: any, formData: FormData) {
|
||||
closeReason: formData.get('closeReason') as string,
|
||||
otherInfo: formData.get('otherInfo') as string,
|
||||
prizesText: formData.get('prizesText') as string,
|
||||
rulesText: formData.get('rulesText') as string,
|
||||
classesIntroText: formData.get('classesIntroText') as string,
|
||||
classesOutroText: formData.get('classesOutroText') as string,
|
||||
isClosedOverride: formData.get('isClosedOverride') === 'on',
|
||||
classes: parsedClasses,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user