Skip to content

Commit

Permalink
Table updates
Browse files Browse the repository at this point in the history
  • Loading branch information
Soumyadas15 committed Jan 9, 2024
1 parent 22d39c9 commit 4007b85
Show file tree
Hide file tree
Showing 16 changed files with 418 additions and 222 deletions.
52 changes: 28 additions & 24 deletions app/actions/getNames.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,36 +11,40 @@ export const getNames = async (queryParams: QueryParams) => {
const { q, eventId } = queryParams;
//@ts-ignore
const eventIdInt = parseInt(eventId, 10);
if (isNaN(eventIdInt)) {
throw new Error('Invalid event ID');
}

if (isNaN(eventIdInt)) {
throw new Error('Invalid event ID');
}

try{
const users = await prisma.registration.findMany({
try {
const registrations = await prisma.registration.findMany({
where: {
AND: [
{
member1: {
contains: q
}
},
{
eventId: eventIdInt
}
{ member1: { contains: q } },
{ eventId: eventIdInt }
]
},
select: {
member1: true,
member2: true,
member3: true,
phone: true,
semester: true,
userId: true,
},
include: {
event: {
select: {
id: true,
title: true,
// ... include other fields required for SafeEvent
createdAt: true // Ensure this is formatted as a string
}
}
}
});
console.log(users)
return users;


// Transform the data to match SafeRegistration type
return registrations.map(reg => ({
...reg,
createdAt: reg.createdAt.toISOString(), // Format createdAt as a string
event: {
...reg.event,
createdAt: reg.event.createdAt.toISOString() // Format event's createdAt as a string
}
}));
} catch (error) {
if (error instanceof Error) {
throw error;
Expand Down
19 changes: 16 additions & 3 deletions app/actions/getRegistrationDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,13 @@ export default async function getRegistrationData(eventId) {
const currentUser = await getCurrentUser();

if (!currentUser) {
return [];
return {
hasRegistered: false,
hasPaid: false
};
}

const hasRegistered = await prisma.registration.findFirst({
const registration = await prisma.registration.findFirst({
where: {
userId: currentUser.id,
eventId: eventId
Expand All @@ -70,7 +73,17 @@ export default async function getRegistrationData(eventId) {
}
});

return Boolean(hasRegistered);
if (!registration) {
return {
hasRegistered: false,
hasPaid: false
};
}

return {
hasRegistered: true,
hasPaid: registration.hasPaid
};
} catch (error) {
if (error instanceof Error) {
throw error; // Re-throw if it's an Error instance
Expand Down
50 changes: 50 additions & 0 deletions app/api/payment/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { NextResponse } from "next/server";

import getCurrentUser from "@/app/actions/getCurrentUser";
import prisma from "@/app/libs/prismadb";

export async function POST(request: Request) {
try {
const currentUser = await getCurrentUser();

if (!currentUser) {
return new Response('User not found', { status: 404 });
}

const body = await request.json();
const { registrationId } = body;
console.log(registrationId)


if (isNaN(registrationId)) {
return new Response('Invalid Registration ID', { status: 400 });
}
const registration = await prisma.registration.findUnique({
where: {
id: registrationId,
},
});

if (!registration) {
return new Response('Registration not found', { status: 404 });
}
await prisma.registration.update({
where: {
id: registrationId,
},
data: {
hasPaid: !registration.hasPaid, // Toggle the hasPaid status
},
});


return new Response('Registration payment status updated successfully', { status: 200 });

} catch (error) {
if (error instanceof Error) {
return new Response(error.message, { status: 500 });
} else {
return new Response('An unknown error occurred', { status: 500 });
}
}
}
55 changes: 31 additions & 24 deletions app/api/registrations/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,41 @@ export async function POST(request: Request) {
try {
const currentUser = await getCurrentUser();

if (!currentUser) {
return new Response("User not authenticated", { status: 401 });
}
if (!currentUser) {
return new Response("User not authenticated", { status: 401 });
}

const body = await request.json();
const { semester, member1, member2, member3, phone, name, eventId, department } = body;
const body = await request.json();
const { semester, member1, member2, member3, member4, member5, member6, member7, member8, member9, member10, phone, name, eventId, department } = body;

const registration = await prisma.registration.create({
data: {
userId: currentUser.id,
eventId: parseInt(eventId),
phone: phone.toString(),
semester: semester,
member1: member1,
member2: member2,
member3: member3,
department: department
}
});
const registration = await prisma.registration.create({
data: {
userId: currentUser.id,
eventId: parseInt(eventId),
phone: phone.toString(),
semester: semester,
member1: member1,
member2: member2,
member3: member3,
member4: member4,
member5: member5,
member6: member6,
member7: member7,
member8: member8,
member9: member9,
member10: member10,
department: department
}
});

let userEmail: string;
//@ts-ignore
userEmail = currentUser?.email;
const emailSubject = 'Thanks for registering';
const emailText = `You have successfully registerd for the event! On the next steps, if the event is paid, you might have to verify your payment at the designated place to get access to the ticket. Otherwise you can download the tiket from the event page itself. We can't wait to see you have fun there.`
await sendMail(emailSubject, userEmail, emailText);
let userEmail: string;
//@ts-ignore
userEmail = currentUser?.email;
const emailSubject = 'Thanks for registering';
const emailText = `You have successfully registerd for the event! On the next steps, if the event is paid, you might have to verify your payment at the designated place to get access to the ticket. Otherwise you can download the tiket from the event page itself. We can't wait to see you have fun there.`
await sendMail(emailSubject, userEmail, emailText);

return new Response(JSON.stringify(registration), { status: 200, headers: { 'Content-Type': 'application/json' } });
return new Response(JSON.stringify(registration), { status: 200, headers: { 'Content-Type': 'application/json' } });

} catch (error) {
if (error instanceof Error) {
Expand Down
32 changes: 13 additions & 19 deletions app/components/Button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,25 +62,19 @@ const Button: React.FC<ButtonProps> = ({

<div className='h-full w-full flex items-center justify-center'>
<div className='h-[75%] w-[95%] items-center justify-center flex'>
{disabled ? (
<div>
{!dontShowLoading ? (
<>
<div className='block dark:hidden'>
<div className='flex items-center justify-center w-[2rem]'>
<Lottie animationData={animationData} />
</div>
</div>
<div className='hidden dark:block'>
<div className='flex items-center justify-center w-[8rem]'>
<Lottie animationData={blackLoader} />
</div>
</div>
</>
) : (
<div>{label}</div>
)}
</div>
{disabled && !outline && !dontShowLoading ? (
<>
<div className='block dark:hidden'>
<div className='flex items-center justify-center w-[2rem]'>
<Lottie animationData={animationData} />
</div>
</div>
<div className='hidden dark:block'>
<div className='flex items-center justify-center w-[8rem]'>
<Lottie animationData={blackLoader} />
</div>
</div>
</>
) : (
<div>{label}</div>
)}
Expand Down
48 changes: 33 additions & 15 deletions app/components/dashboard/registrations/Table.tsx
Original file line number Diff line number Diff line change
@@ -1,41 +1,59 @@
import Pagination from "./Pagination";
"use client"

import { useEffect, useState } from "react";
import Pagination from "./Pagination";
import { SafeEvent, SafeRegistration } from "@/app/types";
import Toggle from "./Toggle";

interface TableProps{
data?: any;
data?: SafeRegistration[];
event?: SafeEvent
}
const Table: React.FC<TableProps> = ({
data,
event,
}) => {
const generateMemberColumns = (memberCount: number) => {
const columns = [];
for (let i = 1; i <= memberCount; i++) {
columns.push(<td className="p-3">Member {i}</td>);
}
return columns;
};

const renderMemberData = (row: any, memberCount: number) => {
const memberData = [];
for (let i = 1; i <= memberCount; i++) {
memberData.push(<td className="p-3">{row[`member${i}`]}</td>);
}
return memberData;
};

return (
<div className="h-[90%] w-full ">
<div className="h-full w-full overflow-hidden overflow-x-scroll overflow-y-scroll bg-neutral-300 dark:bg-neutral-800">
<table className="w-[90rem] overflow-y-scroll">
<thead className="bg-red-400">
<tr className="">
<td className="p-3">User ID</td>
<td className="p-3">Serial</td>
<td className="p-3">Member 1</td>
<td className="p-3">Semester</td>
<td className="p-3">Paid</td>
<td className="p-3">Phone</td>
<td className="p-3">Phone</td>
<td className="p-3">Phone</td>
<td className="p-3">Phone</td>
<td className="p-3">Phone</td>
<td className="p-3">Phone</td>
{event && generateMemberColumns(event.memberCount!)}
</tr>
</thead>
<tbody>
{data.map((row: any, index: number) => (
{data?.map((row: any, index: number) => (
<tr key={index}>
<td className="p-3">{row.userId}</td>
<td className="p-3">{index + 1}</td>
<td className="p-3">{row.member1}</td>
<td className="p-3">{row.semester}</td>
<td className="p-3">
<Toggle registration={row}/>
</td>
<td className="p-3">{row.phone}</td>
<td className="p-3">{row.phone}</td>
<td className="p-3">{row.phone}</td>
<td className="p-3">{row.phone}</td>
<td className="p-3">{row.phone}</td>
<td className="p-3">{row.phone}</td>
{event && renderMemberData(row, event.memberCount!)}
</tr>
))}
</tbody>
Expand Down
48 changes: 48 additions & 0 deletions app/components/dashboard/registrations/Toggle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"use client"

import { SafeEvent, SafeRegistration } from "@/app/types";
import axios from "axios";
import { useState } from "react";
import toast from "react-hot-toast";

interface ToggleProps{
registration?: SafeRegistration;
}

const Toggle: React.FC<ToggleProps> = ({
registration
}) => {
const [paidStatus, setPaidStatus] = useState(registration?.hasPaid);

const handlePaymentStatusChange = () => {
axios.post('/api/payment', { registrationId: registration?.id })
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error('Error updating payment status:', error);
});
};

const handleChange = () => {
const newPaidStatus = !paidStatus;
setPaidStatus(newPaidStatus);

if (registration?.id) {
handlePaymentStatusChange();
}
};
return (
<div>
<select
value= {paidStatus?.toString()}
onChange={handleChange}
>
<option value={true.toString()}>Paid</option>
<option value={false.toString()}>Not paid</option>
</select>
</div>
);
}

export default Toggle;
Loading

0 comments on commit 4007b85

Please sign in to comment.