-
Notifications
You must be signed in to change notification settings - Fork 66
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
27 changed files
with
1,047 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
name: 🐞 Bug | ||
description: Report an issue to help us improve the project. | ||
title: '[BUG] ' | ||
labels: ["bug"] | ||
body: | ||
- type: textarea | ||
attributes: | ||
label: Description | ||
id: description | ||
description: A brief description of the issue or bug you are facing, also include what you tried and what didn't work. | ||
validations: | ||
required: false | ||
- type: textarea | ||
attributes: | ||
label: Screenshots | ||
id: screenshots | ||
description: Please add screenshots if applicable | ||
validations: | ||
required: false | ||
- type: textarea | ||
attributes: | ||
label: Any additional information? | ||
id: extrainfo | ||
description: Any additional information or Is there anything we should know about this bug? | ||
validations: | ||
required: false | ||
- type: dropdown | ||
id: browsers | ||
attributes: | ||
label: What browser are you seeing the problem on? | ||
multiple: true | ||
options: | ||
- Firefox | ||
- Chrome | ||
- Safari | ||
- Microsoft Edge | ||
- type: checkboxes | ||
id: no-duplicate-issues | ||
attributes: | ||
label: 'Checklist' | ||
options: | ||
- label: 'I have checked the existing issues' | ||
required: true | ||
|
||
- label: 'I have read the [Contributing Guidelines](https://github.com/alo7lika/Alimento/blob/dev/CONTRIBUTING.md)' | ||
required: true | ||
- label: "I'm a GSSoC'24-Extd contributor" | ||
- label: "I'm a Hacktoberfest'24 contributor" | ||
|
||
- label: 'I am willing to work on this issue (optional)' | ||
required: false |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
blank_issues_enabled: true | ||
contact_links: | ||
- name: Questions or need suggestions? | ||
url: https://github.com/Vimall03/Alimento/discussions/new?category=q-a | ||
about: You can create a Q&A discussion and ask for clarifications |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
"use server" | ||
|
||
import prismadb from "@/lib/prismadb"; | ||
import { Answer } from "@prisma/client"; | ||
import { UUID } from "crypto"; | ||
|
||
type CreateAnswerResponse = { | ||
success: boolean; | ||
data?: Answer | ||
error?: string; | ||
}; | ||
|
||
export async function createAnswer( | ||
questionId: string, | ||
content: string | ||
): Promise<CreateAnswerResponse> { | ||
try { | ||
|
||
const newAnswer = await prismadb.answer.create({ | ||
data: { | ||
content, | ||
questionId, | ||
}, | ||
}); | ||
|
||
await prismadb.question.update({ | ||
where: { id: questionId }, | ||
data: { answered: true }, | ||
}); | ||
|
||
return { | ||
success: true, | ||
data: newAnswer | ||
}; | ||
} catch (error) { | ||
console.error("Error creating answer:", error); | ||
return { | ||
success: false, | ||
error: "Failed to create answer", | ||
}; | ||
} | ||
} | ||
|
||
|
||
|
||
|
||
type DeleteAnswerResponse = { | ||
success: boolean; | ||
data?: Answer; | ||
error?: string; | ||
}; | ||
|
||
export async function deleteSpecificAnswer(answerId: string): Promise<DeleteAnswerResponse> { | ||
try { | ||
const deletedAnswer = await prismadb.answer.delete({ | ||
where: { | ||
id: answerId, | ||
}, | ||
}); | ||
|
||
if (!deletedAnswer) { | ||
return { | ||
success: false, | ||
error: "Error in deleting the answer", | ||
}; | ||
} | ||
|
||
return { | ||
success: true, | ||
data: deletedAnswer, | ||
}; | ||
} catch (error) { | ||
console.error("Error deleting specific answer:", error); | ||
return { | ||
success: false, | ||
error: "Failed to delete specific answer", | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
'use server'; | ||
|
||
import prismadb from '@/lib/prismadb'; | ||
import { Answer, Question } from '@prisma/client'; | ||
import { UUID } from 'crypto'; | ||
|
||
interface QuestionWithAnswer extends Question{ | ||
answers?:Answer[] | ||
} | ||
|
||
type QuestionResponse = { | ||
success: boolean; | ||
data?: Question; | ||
error?: string; | ||
}; | ||
|
||
type getQuestionsResponse = { | ||
success: boolean; | ||
data?: QuestionWithAnswer[]; | ||
error?: string; | ||
}; | ||
|
||
|
||
export async function createQuestion( | ||
content: string | ||
): Promise<QuestionResponse> { | ||
try { | ||
const newQuestion = await prismadb.question.create({ | ||
data: { | ||
content, | ||
}, | ||
}); | ||
|
||
return { | ||
success: true, | ||
data: newQuestion, | ||
}; | ||
} catch (error) { | ||
console.error('Error creating question:', error); | ||
return { | ||
success: false, | ||
error: 'Failed to create question', | ||
}; | ||
} | ||
} | ||
|
||
export async function getUnansweredQuestions( | ||
): Promise<getQuestionsResponse> { | ||
try { | ||
const unAnsweredQuestions = await prismadb.question.findMany({ | ||
where: { | ||
answered: false, | ||
}, | ||
}); | ||
|
||
if (!unAnsweredQuestions.length) { | ||
return { | ||
success: false, | ||
error: 'No unanswered questions!', | ||
}; | ||
} | ||
|
||
return { | ||
success: true, | ||
data: unAnsweredQuestions, | ||
}; | ||
} catch (error) { | ||
console.error('Error fetching unanswered questions', error); | ||
return { | ||
success: false, | ||
error: 'Failed to fetch unanswered questions', | ||
}; | ||
} | ||
} | ||
|
||
|
||
export async function getAnsweredQuestions( | ||
): Promise<getQuestionsResponse> { | ||
try { | ||
const AnsweredQuestions = await prismadb.question.findMany({ | ||
where: { | ||
answered: true, | ||
}, | ||
include:{ | ||
answers:true | ||
} | ||
}); | ||
|
||
if (!AnsweredQuestions.length) { | ||
return { | ||
success: false, | ||
error: 'No unanswered questions!', | ||
}; | ||
} | ||
|
||
return { | ||
success: true, | ||
data: AnsweredQuestions, | ||
}; | ||
} catch (error) { | ||
console.error('Error fetching answered questions', error); | ||
return { | ||
success: false, | ||
error: 'Failed to fetch answered questions', | ||
}; | ||
} | ||
} | ||
|
||
// This will be only accessible by the admin | ||
|
||
// deletes a question and all its related answers if present | ||
|
||
export async function deleteQuestion( | ||
questionId: string, | ||
): Promise<QuestionResponse> { | ||
try { | ||
const deletedQuestion = await prismadb.question.delete({ | ||
where: { | ||
id:questionId | ||
}, | ||
}); | ||
|
||
if (!deletedQuestion) { | ||
return { | ||
success: false, | ||
error: 'error in deleting the question', | ||
}; | ||
} | ||
|
||
return { | ||
success: true, | ||
data: deletedQuestion, | ||
}; | ||
} catch (error) { | ||
console.error('Error deleting specific question', error); | ||
return { | ||
success: false, | ||
error: 'Failed to delete specific question', | ||
}; | ||
} | ||
} |
File renamed without changes.
File renamed without changes.
80 changes: 80 additions & 0 deletions
80
alimento-nextjs/app/(PublicRoutes)/(footerPages)/forum/components/NewQuestionForm.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
'use client'; | ||
|
||
import { createQuestion } from '@/actions/forum/Question'; | ||
import { Button } from '@/components/ui/button'; | ||
import { Label } from '@/components/ui/label'; | ||
import { Spinner } from '@/components/ui/spinner'; | ||
import { Textarea } from '@/components/ui/textarea'; | ||
import { useSession } from 'next-auth/react'; | ||
import { SyntheticEvent, useEffect, useState } from 'react'; | ||
|
||
const NewQuestionForm = () => { | ||
const [questionContent, setQuestionContent] = useState(''); | ||
const [submissionError, setSubmissionError] = useState(''); | ||
|
||
const [isMounted, setIsMounted] = useState(false); | ||
const [isAuthenticated, setIsAuthenticated] = useState(false); | ||
|
||
const session = useSession(); | ||
|
||
useEffect(() => { | ||
setIsMounted(true); | ||
if (!(session.status === 'loading')) { | ||
if (session.status === 'authenticated') { | ||
setIsAuthenticated(true); | ||
// console.log("hereeeeeeeeee"+isAuthenticated+session.status) | ||
} | ||
} | ||
}, [session.status]); | ||
|
||
if (!isMounted) { | ||
return <Spinner />; | ||
} | ||
|
||
const handleSubmit = async (e: SyntheticEvent) => { | ||
// e.preventDefault(); | ||
try { | ||
const response = await createQuestion(questionContent); | ||
if (!response.success && response.error) { | ||
setSubmissionError(response.error); | ||
} else { | ||
setQuestionContent(''); | ||
setSubmissionError(''); | ||
} | ||
} catch (error) { | ||
setSubmissionError( | ||
'An error occurred while submitting your question. Please try again.' | ||
); | ||
} | ||
}; | ||
|
||
return ( | ||
<> | ||
{isAuthenticated ? ( | ||
<form onSubmit={handleSubmit} className="space-y-4"> | ||
<Label htmlFor="new-question" className="text-gray-700 font-medium"> | ||
Your Question | ||
</Label> | ||
<Textarea | ||
id="new-question" | ||
value={questionContent} | ||
onChange={e => setQuestionContent(e.target.value)} | ||
placeholder="Type your question here..." | ||
className="resize-none w-full rounded-md border-gray-300 focus:border-indigo-500" | ||
required | ||
/> | ||
{submissionError && <p className="text-red-600">{submissionError}</p>} | ||
<Button type="submit" className="w-full bg-green-500 text-white"> | ||
Submit Question | ||
</Button> | ||
</form> | ||
) : ( | ||
<p className="text-red-500 text-sm"> | ||
Please authenticate yourself to post a question. | ||
</p> | ||
)} | ||
</> | ||
); | ||
}; | ||
|
||
export default NewQuestionForm; |
Oops, something went wrong.