#Server action
1 messages · Page 1 of 1 (latest)
To use the getEventsByCategoryAndRegion action in a client component, you need to ensure that the action is defined in a separate file with the use server directive at the top. This allows the client component to import and use the server action.
Here is how you can structure your code:
- Define the Server Action: Create a new file for your server action and add the
use serverdirective at the top.
// app/actions/event-actions/getEventsByCategoryAndRegion.ts
'use server'
export async function getEventsByCategoryAndRegion(section: string) {
// Your server-side logic here
// ...
}
- Import and Use the Server Action in the Client Component: In your client component, import the server action and use it as needed.
// app/components/LazyEventSection.tsx
'use client';
import { useState, useCallback, useEffect } from 'react';
import { SafeEvent, SafeUser } from '@/app/types';
import CategorizedEventSection from './CategorizedEventSection';
import useIntersectionObserver from '@/app/hooks/useIntersectionObserver';
import { Skeleton } from '@/components/ui/skeleton';
import { getEventsByCategoryAndRegion } from '@/app/actions/event-actions/getEventsByCategoryAndRegion';
interface LazyEventSectionProps {
section: string;
currentUser?: SafeUser | null;
immediate?: boolean;
}
const LazyEventSection: React.FC<LazyEventSectionProps> = ({
section,
currentUser,
immediate = false,
}) => {
const [events, setEvents] = useState<SafeEvent[] | null>(null);
const [hasFetched, setHasFetched] = useState(false);
const loadEvents = useCallback(async () => {
if (!hasFetched) {
setHasFetched(true);
const data = await getEventsByCategoryAndRegion(section);
setEvents(data);
}
}, [section, hasFetched]);
const setRef = useIntersectionObserver(loadEvents);
useEffect(() => {
if (immediate) {
loadEvents();
}
}, [immediate, loadEvents]);
return (
<div ref={!immediate ? setRef : undefined}>
{events ? (
<CategorizedEventSection
sectionLabel={section}
events={events}
currentUser={currentUser}
/>
) : (
<Skeleton className="h-96 w-full" />
)}
</div>
);
};
export default LazyEventSection;
### Key Points:
- **Server Action Definition**: The server action is defined in a separate file with the `use server` directive.
- **Client Component Usage**: The client component imports the server action and uses it within the component logic.
For more details, you can refer to the **Next.js documentation on Server Actions and Mutations** (<https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations#convention>).
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------