Skip to content

Commit

Permalink
working on the Q/A feature on both user and admin side,and article f…
Browse files Browse the repository at this point in the history
…eature
  • Loading branch information
njogubless committed Feb 6, 2025
1 parent c24a40c commit fefcda0
Show file tree
Hide file tree
Showing 16 changed files with 952 additions and 382 deletions.
26 changes: 22 additions & 4 deletions lib/core/common/navigation/main_layout.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:devotion/features/articles/presentation/screens/article_screen.d
import 'package:devotion/features/audio/presentation/screens/devotion.dart';
import 'package:devotion/features/auth/presentation/screen/home_screen.dart';
import 'package:devotion/features/books/presentation/screen/book_screen.dart';
import 'package:devotion/widget/app_drawer.dart';
import 'package:flutter/material.dart';

class MainLayout extends StatefulWidget {
Expand All @@ -21,7 +22,7 @@ class _MainLayoutState extends State<MainLayout> {
const HomeScreen(),
AudioScreen(),
const DevotionPage(),
ArticleScreen(),
ArticlePage(),
BookScreen(),
const QuestionPage(),
];
Expand All @@ -35,7 +36,26 @@ class _MainLayoutState extends State<MainLayout> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: _screens[_selectedIndex],
drawer: AppDrawer(),
appBar: AppBar(
title: Text(
_selectedIndex == 0
? "Home"
:_screens[_selectedIndex].runtimeType.toString()),),
body: Builder(builder: (context) {
try {
return _screens[_selectedIndex];
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Error loading page'),
),
);
return const Center(
child: Text('Error loading page'),
);
}
}),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _selectedIndex,
onTap: _onItemTapped,
Expand Down Expand Up @@ -99,5 +119,3 @@ class _MainLayoutState extends State<MainLayout> {
);
}
}


189 changes: 155 additions & 34 deletions lib/features/Q&A/presentation/screens/question_page.dart
Original file line number Diff line number Diff line change
@@ -1,45 +1,166 @@
import 'package:devotion/features/Q&A/presentation/screens/admin_answer_page.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../providers/question_provider.dart';
// Import the admin answer form
import 'package:devotion/core/constants/firebase_constants.dart';

class QuestionPage extends ConsumerWidget {
const QuestionPage({super.key});
class QuestionPage extends StatefulWidget {
const QuestionPage({Key? key}) : super(key: key);

@override
Widget build(BuildContext context, WidgetRef ref) {
final questions = ref.watch(questionProvider);
_QuestionScreenState createState() => _QuestionScreenState();
}

class _QuestionScreenState extends State<QuestionPage> {
final TextEditingController _questionController = TextEditingController();

Future<void> _submitQuestion() async {
final questionText = _questionController.text.trim();
if (questionText.isNotEmpty) {
try {
await FirebaseFirestore.instance.collection(FirebaseConstants.questionsCollection).add({
'question': questionText,
'askedAt': FieldValue.serverTimestamp(),
'isAnswered': false,
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Question submitted successfully!')),
);
_questionController.clear();
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error submitting question: $e')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Please enter a question')),
);
}
}

void _navigateToQuestionDetail(String questionId, String questionText) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => QuestionDetailPage(questionId: questionId, questionText: questionText),
),
);
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Questions')),
body: ListView.builder(
itemCount: questions.length,
itemBuilder: (context, index) {
final question = questions[index];
return Card(
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
question.questionText,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
question.answerText != null
? Text('Answer: ${question.answerText}')
: AdminAnswerForm(
questionId: question.id,
currentAnswerText: question.answerText ?? '',
),
],
appBar: AppBar(title: const Text('Ask a Question')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('Ask your question:', style: TextStyle(fontSize: 20)),
const SizedBox(height: 10),
TextField(
controller: _questionController,
decoration: InputDecoration(
hintText: 'Enter your question here...',
border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)),
),
maxLines: 3,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _submitQuestion,
child: const Text('Submit Question'),
),
const SizedBox(height: 20),
const Text('Previous Questions:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 10),
Expanded(
child: StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection(FirebaseConstants.questionsCollection).snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const Center(child: CircularProgressIndicator());
}
final questions = snapshot.data!.docs;
return ListView.builder(
itemCount: questions.length,
itemBuilder: (context, index) {
final question = questions[index];
final questionId = question.id;
final questionText = question['question'];
return ListTile(
title: Text(questionText, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
trailing: const Icon(Icons.arrow_forward_ios, size: 16),
onTap: () => _navigateToQuestionDetail(questionId, questionText),
);
},
);
},
),
),
);
},
],
),
),
);
}
}

class QuestionDetailPage extends StatelessWidget {
final String questionId;
final String questionText;

const QuestionDetailPage({Key? key, required this.questionId, required this.questionText}) : super(key: key);

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Question Details')),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Question:',
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
const SizedBox(height: 5),
Text(questionText, style: const TextStyle(fontSize: 16)),
const SizedBox(height: 20),
const Text('Answer:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 5),
FutureBuilder<QuerySnapshot>(
future: FirebaseFirestore.instance
.collection(FirebaseConstants.answersCollection)
.where('questionId', isEqualTo: questionId)
.get(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const CircularProgressIndicator();
}
final answers = snapshot.data!.docs;
if (answers.isEmpty) {
return const Text('No answer available yet.', style: TextStyle(fontSize: 16, color: Colors.red));
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: answers.map((answer) {
return Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(
answer['answer'],
style: const TextStyle(
fontSize: 16,
color: Colors.green,
fontStyle: FontStyle.italic,
),
),
);
}).toList(),
);
},
),
],
),
),
);
}
Expand Down
Loading

0 comments on commit fefcda0

Please sign in to comment.