I'm trying to create a webapp with Next.js (13.4.9) and I would use the server action. With the server action, I would send data to my action, this action is going to treat this data and return me a string. The only way I've found so far to get the result data from the action is with the cookies. So is there an other way (easier) I can get the data from the server action ? And I would also refresh the page or redirect the user to an other page just after the server action (like with php). So how can I do a refreshing or a redirect after the server action ?
Here is my actual code :
// page.tsx
"use client";
import React, { useTransition, useState } from "react";
import { SendTicket } from "@/actions/TicketAction";
import Cookies from "js-cookie";
export default function TicketPage(){
const [isPending, startTransition] = useTransition();
const [ name, setName ] = useState<string>("");
const [ age, setAge ] = useState<number>(0);
return(
<main>
<form action={() => startTransition(() => SendTicket({
name: name, age: age
}))}>
<input type="text" value={name} onChange={(e) => setName(e.target.value)}
placeholder="Your name" />
<input type="number" value={age} onChange={(e) => setAge(parseInt(e.target.value))}
placeholder="Your age" />
<button type="submit">
Valider
</button>
</form>
{ isPending ? <span>Loading...</span> : <></> }
<Result />
</main>
)
}
function Result(){
const ResultString = Cookies.get("ResultString");
Cookies.remove("ResultString");
return(
<p>{ResultString?.toString()}</p>
)
}
// TicketAction.ts
"use server";
import { cookies } from "next/headers";
export interface TicketInformationProps {
name: string;
age: number;
}
export async function SendTicket(TicketInforamtion: TicketInformationProps){
console.log(`[NEW TICKET]`);
console.log(`Nom: ${TicketInforamtion.name}`);
console.log(`Age: ${TicketInforamtion.age.toString()}`);
console.log(`\n\n\n`);
const result = `You are ${TicketInforamtion.name} and you are ${TicketInforamtion.age.toString()} yo.`;
cookies().set({
name: "ResultString",
value: result,
path: "/ticket",
expires: new Date(Date.now() + 1000 * 1),
secure: true,
});
}