+
{comment.name} -
{comment.time}
diff --git a/src/components/CommunityPortal/Activities/activityId/CommentSection/CommentSection.module.css b/src/components/CommunityPortal/Activities/activityId/CommentSection/CommentSection.module.css
new file mode 100644
index 0000000000..a31272b58d
--- /dev/null
+++ b/src/components/CommunityPortal/Activities/activityId/CommentSection/CommentSection.module.css
@@ -0,0 +1,86 @@
+.activityCommentFooter {
+ font-size: 12px;
+ color: gray;
+ margin-top: 5px;
+ transition: color 0.3s ease;
+}
+
+.activityComment {
+ display: flex;
+ align-items: flex-start;
+ gap: 10px;
+ transition: background-color 0.3s ease;
+}
+
+.activityCommentsSection {
+ margin-top: 20px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ transition: all 0.3s ease;
+}
+
+.activityCommentUser {
+ display: flex;
+ gap: 5px;
+}
+
+.activityCommentText {
+ flex: 1;
+ background-color: #f4f4f4;
+ padding: 10px;
+ border-radius: 6px;
+ transition: background-color 0.3s ease, color 0.3s ease;
+}
+
+.activityIcon {
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ color: #fff;
+ text-align: center;
+ line-height: 30px;
+ font-weight: bold;
+ transition: transform 0.2s ease;
+}
+
+.activityIcon:hover {
+ transform: scale(1.1);
+}
+
+.purple {
+ background-color: purple;
+}
+
+.blue {
+ background-color: #3366ff;
+}
+
+@media (max-width: 800px) {
+ .activityComment {
+ flex-direction: column;
+ gap: 5px;
+ }
+
+ .activityCommentsSection {
+ gap: 10px;
+ padding: 15px;
+ }
+}
+
+.darkMode .activityCommentFooter {
+ color: #aaa;
+}
+
+.darkMode .activityComment {
+ background-color: transparent;
+}
+
+.darkMode .activityCommentsSection {
+ background-color: transparent;
+}
+
+.darkMode .activityCommentText {
+ background-color: #3a506b;
+ color: #ffffff;
+}
diff --git a/src/components/CommunityPortal/Activities/activityId/FeedBackSection/Feedback.jsx b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/Feedback.jsx
new file mode 100644
index 0000000000..cad408e059
--- /dev/null
+++ b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/Feedback.jsx
@@ -0,0 +1,405 @@
+import { useEffect, useMemo, useState } from 'react';
+import { useSelector } from 'react-redux';
+import styles from './Feedback.module.css';
+import { FaSearch } from 'react-icons/fa';
+import { MdArrowUpward, MdArrowDownward } from 'react-icons/md';
+import { AiFillStar, AiOutlineStar } from 'react-icons/ai';
+import FeedbackModal from './FeedbackModal';
+
+const nowISO = () => new Date().toISOString();
+
+function Feedback({
+ reviewsEnabled = true,
+ suggestionsOnly = false,
+ isHost = false,
+ eventCreatedAt = null,
+ showModal = false,
+ setShowModal = null,
+ feedbackList,
+ setFeedbackList,
+}) {
+ // local list (in real app you'd fetch)
+ const [searchTerm, setSearchTerm] = useState('');
+ const [filterBy, setFilterBy] = useState('date');
+ const [sortOrder, setSortOrder] = useState('desc');
+ const [visibilityFilter, setVisibilityFilter] = useState('all');
+ const [showSuggestionsOnly, setShowSuggestionsOnly] = useState(false);
+
+ // modal form state (participant)
+ const [modalOpen, setModalOpen] = useState(showModal);
+ const [modalRating, setModalRating] = useState(0);
+ const [modalComment, setModalComment] = useState('');
+ const [modalSuggestionText, setModalSuggestionText] = useState('');
+ const [modalPrivate, setModalPrivate] = useState(false);
+ const [visibleCount, setVisibleCount] = useState(2);
+
+ // reflect incoming modal prop
+ useEffect(() => {
+ if (typeof showModal === 'boolean') setModalOpen(showModal);
+ }, [showModal]);
+
+ useEffect(() => {
+ // If parent gave setShowModal, keep synchronized
+ if (setShowModal) {
+ setShowModal(modalOpen);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [modalOpen]);
+
+ useEffect(() => {
+ // Placeholder for API call to fetch feedback data
+ // For now we use dummyFeedback above.
+ }, []);
+
+ // dark mode for styling
+ const darkMode = useSelector(state => state.theme?.darkMode);
+
+ // helper: determine if event was created within one month
+ const eventWithinFirstMonth = useMemo(() => {
+ if (!eventCreatedAt) return false;
+ const created = new Date(eventCreatedAt);
+ const oneMonthLater = new Date(created);
+ oneMonthLater.setMonth(oneMonthLater.getMonth() + 1);
+ return new Date() <= oneMonthLater;
+ }, [eventCreatedAt]);
+
+ const handleSearch = e => setSearchTerm(e.target.value);
+ const handleFilterChange = e => setFilterBy(e.target.value);
+ const handleSortChange = () => setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');
+
+ const renderStars = feedback =>
+ Array.from({ length: 5 }, (_, i) => (
+
+ {i < (feedback.rating || 0) ? : }
+
+ ));
+
+ // Filtering & sorting for host view
+ const filteredFeedback = feedbackList
+ .filter(fb => {
+ // visibility filter
+ if (visibilityFilter !== 'all' && fb.visibility !== visibilityFilter) return false;
+ // search match
+ const q = searchTerm.trim().toLowerCase();
+ if (!q) return true;
+ return (
+ (fb.comment || '').toLowerCase().includes(q) ||
+ (fb.name || '').toLowerCase().includes(q) ||
+ (fb.rating !== null && String(fb.rating).includes(q))
+ );
+ })
+ .sort((a, b) => {
+ if (filterBy === 'date') {
+ return sortOrder === 'asc'
+ ? new Date(a.date) - new Date(b.date)
+ : new Date(b.date) - new Date(a.date);
+ }
+ if (filterBy === 'rating') {
+ return sortOrder === 'asc'
+ ? (a.rating || 0) - (b.rating || 0)
+ : (b.rating || 0) - (a.rating || 0);
+ }
+ return 0;
+ });
+
+ // Participant submit handlers (local only)
+ const handleSubmitFeedback = () => {
+ if (!reviewsEnabled && !suggestionsOnly) return; // can't submit
+ const isSuggestion = suggestionsOnly;
+ const visibility = eventWithinFirstMonth ? 'host-only' : modalPrivate ? 'host-only' : 'public';
+ const newItem = {
+ id: feedbackList.length + 1,
+ name: 'You',
+ rating: isSuggestion ? null : modalRating,
+ comment: isSuggestion ? modalSuggestionText || modalComment : modalComment,
+ date: nowISO().slice(0, 10),
+ visibility: isSuggestion ? 'suggestion' : visibility,
+ };
+ setFeedbackList(prev => [newItem, ...prev]);
+ // reset modal
+ setModalComment('');
+ setModalSuggestionText('');
+ setModalRating(5);
+ setModalPrivate(false);
+ setModalOpen(false);
+ if (setShowModal) setShowModal(false);
+ };
+
+ const handleOpenModal = () => {
+ setModalOpen(true);
+ if (setShowModal) setShowModal(true);
+ };
+
+ // Host-only and suggestion lists
+ const suggestionList = feedbackList.filter(fb => fb.visibility === 'suggestion');
+
+ return (
+
+
+ {isHost && (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {showSuggestionsOnly ? (
+
+ {suggestionList.length === 0 ? (
+
No suggestions yet.
+ ) : (
+ suggestionList.map(s => (
+
+
![User]()
+
+
+ {s.name}
+ {s.date}
+
+
{s.comment}
+
+
+ ))
+ )}
+
+ ) : (
+
+ {filteredFeedback.length === 0 ? (
+
No feedback matches your filters.
+ ) : (
+ filteredFeedback.slice(0, visibleCount).map(feedback => (
+
+
![User]()
+
+
+ {feedback.name}
+ {feedback.date}
+ {/* Visibility badge */}
+
+ {feedback.visibility === 'host-only'
+ ? 'Private'
+ : feedback.visibility === 'suggestion'
+ ? 'Suggestion'
+ : 'Public'}
+
+
+
+ {/* rating */}
+ {feedback.rating !== null && (
+
{renderStars(feedback)}
+ )}
+
+
{feedback.comment}
+
+
+ ))
+ )}
+
+ )}
+ {visibleCount < feedbackList.length && (
+
+
+
+ )}
+ >
+ )}
+
+ {/* Participant view / modal */}
+ {!isHost && (
+ <>
+ {/* Notice if reviews disabled */}
+ {!reviewsEnabled && !suggestionsOnly && (
+
+ Reviews are currently disabled for this event.
+
+ )}
+
+ {/* Button to open modal if parent didn't provide one */}
+ {!modalOpen && (reviewsEnabled || suggestionsOnly) && (
+
+
+
+ )}
+
+ {/* Modal-like simple panel (replace with your modal component if you have one) */}
+ {modalOpen && (
+
{
+ setModalOpen(false);
+ if (setShowModal) setShowModal(false);
+ }}
+ onSubmit={handleSubmitFeedback}
+ show={modalOpen}
+ importantLabel={
+ eventWithinFirstMonth
+ ? 'Your feedback is only visible to the host for the first month.'
+ : null
+ }
+ disableSubmit={
+ (!suggestionsOnly && !modalComment && !modalRating) ||
+ (suggestionsOnly && !modalSuggestionText) ||
+ (!reviewsEnabled && !suggestionsOnly)
+ }
+ >
+ {suggestionsOnly ? (
+
+
+
+ ) : (
+ <>
+
+
+
+ {Array.from({ length: 5 }, (_, i) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ >
+ )}
+
+ )}
+ >
+ )}
+
+
+ );
+}
+
+export default Feedback;
diff --git a/src/components/CommunityPortal/Activities/activityId/FeedBackSection/Feedback.module.css b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/Feedback.module.css
new file mode 100644
index 0000000000..459e4cf7e0
--- /dev/null
+++ b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/Feedback.module.css
@@ -0,0 +1,470 @@
+.feedbackContainer {
+ width: 90%;
+ margin: 20px auto;
+ font-family: Arial, sans-serif;
+ padding: 10px 12px 14px;
+}
+
+.feedbackTitle {
+ font-size: 20px;
+ color: black;
+ font-weight: bold;
+ text-align: left;
+}
+
+.feedbackCount {
+ font-size: 14px;
+ color: gray;
+}
+
+.feedbackHeader {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin: 15px 0;
+}
+
+.searchContainer {
+ flex: 1;
+ position: relative;
+}
+
+.searchInput {
+ width: 100%;
+ padding: 10px 12px 10px 34px;
+ border: 1px solid #d8dde3;
+ border-radius: 20px;
+ font-size: 14px;
+ outline: none;
+ background-color: white;
+ color: #1f2a37;
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+}
+
+.searchInput:focus {
+ border-color: #5b8fd9;
+ box-shadow: 0 0 0 3px rgba(91, 143, 217, 0.2);
+}
+
+.icon {
+ position: absolute;
+ top: 50%;
+ left: 10px;
+ transform: translateY(-50%);
+ color: gray;
+}
+
+.sortOptions {
+ margin-left: auto;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.filter {
+ font-size: 14px;
+ color: gray;
+ margin-right: 10px;
+}
+
+.filterDropdown {
+ margin-left: 6px;
+ padding: 6px 8px;
+ border-radius: 6px;
+ border: 1px solid #cfd6e0;
+ background: #f8fafc;
+ color: #1f2a37;
+}
+
+.sortBtn {
+ background: #f3f6fb;
+ border: 1px solid #d6dde8;
+ cursor: pointer;
+ font-size: 14px;
+ color: #475569;
+ padding: 6px 10px;
+ border-radius: 8px;
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+}
+
+.feedbackCard {
+ display: flex;
+ align-items: flex-start;
+ gap: 15px;
+ border-radius: 10px;
+ padding: 14px 16px;
+ background: #f5f7fb;
+ border: 1px solid #e3e8f0;
+ margin-bottom: 12px;
+}
+
+.avatar {
+ width: 42px;
+ height: 42px;
+ border-radius: 50%;
+ background: #94a3b8;
+ flex-shrink: 0;
+}
+
+.feedbackContent {
+ flex: 1;
+}
+
+.feedbackText {
+ font-size: 14px;
+ line-height: 1.6;
+ color: #2a3340;
+}
+
+.feedbackDate {
+ color: #6b7280;
+ font-size: 12px;
+}
+
+.feedbackRating {
+ color: #f7c948;
+ font-size: 16px;
+}
+
+.star {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 2px;
+}
+
+.badgePublic,
+.badgePrivate,
+.badgeSuggestion {
+ font-size: 12px;
+ padding: 2px 8px;
+ border-radius: 999px;
+ font-weight: 600;
+ letter-spacing: 0.2px;
+}
+
+.badgePublic {
+ background: #e7f4ff;
+ color: #1d4ed8;
+}
+
+.badgePrivate {
+ background: #fde8e8;
+ color: #b91c1c;
+}
+
+.badgeSuggestion {
+ background: #fef3c7;
+ color: #92400e;
+}
+
+.hostViewToggles button {
+ background: transparent;
+ border: 1px solid #d8dde3;
+ color: #465569;
+ padding: 6px 12px;
+ border-radius: 999px;
+ cursor: pointer;
+ transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
+}
+
+.hostViewToggles button:hover {
+ background: #f1f5f9;
+ border-color: #c7d6ea;
+ color: #1e3a8a;
+}
+
+.hostViewToggles .toggleActive {
+ background: #f1f5f9;
+ border-color: #c7d6ea;
+ color: #1e3a8a;
+ box-shadow: 0 6px 12px rgba(30, 58, 138, 0.12);
+}
+
+/* Feedback form elements */
+.formGroup {
+ margin-bottom: 1rem;
+ display: flex;
+ flex-direction: column;
+}
+
+.label {
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+ color: black;
+}
+
+.textarea {
+ resize: none;
+ padding: 0.75rem;
+ border: 1px solid #cbd5e1;
+ border-radius: 10px;
+ font-family: inherit;
+ font-size: 0.95rem;
+ color: var(--text-color, #222);
+ background-color: var(--bg-color, #fff);
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+}
+
+.textarea:focus {
+ border-color: #5b8fd9;
+ box-shadow: 0 0 0 3px rgba(91, 143, 217, 0.2);
+ outline: none;
+}
+
+/* Rating */
+.ratingRow {
+ display: flex;
+ gap: 0.4rem;
+}
+
+.starBtn {
+ font-size: 1.5rem;
+ color: #ccc;
+ background: none;
+ border: none;
+ cursor: pointer;
+ transition: transform 0.2s, color 0.2s;
+}
+
+.starBtnActive {
+ color: #f6c500;
+}
+
+.starBtn:hover {
+ transform: scale(1.15);
+}
+
+.formGroup label {
+ color: black;
+}
+
+.formGroupRow {
+ margin-top: 1rem;
+ display: flex;
+ align-items: center;
+ font-size: 0.9rem;
+ color: var(--text-color, #333);
+}
+
+.participateFeedbackBtn {
+ padding: 10px 20px;
+ border: none;
+ border-radius: 4px;
+ background-color: #475569;
+ color: #ffffff;
+ cursor: pointer;
+ transition: background-color 0.3s ease, color 0.3s ease;
+}
+
+.loadMore button {
+ color: #1e3a8a;
+ background: #f1f5f9;
+ border: 1px solid #c7d6ea;
+ padding: 8px 16px;
+ border-radius: 999px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
+}
+
+.loadMore button:hover {
+ background: #e8eef7;
+ border-color: #b8c9e3;
+ color: #1d4ed8;
+}
+
+.hostViewToggles {
+ display: flex;
+ gap: 20px;
+ margin-top: 20px;
+ padding: 10px;
+}
+
+.darkMode .loadMore button {
+ color: #f8fafc;
+ background: #243853;
+ border-color: #4b637f;
+}
+
+.darkMode .loadMore button:hover {
+ background: #2c4463;
+ border-color: #5a7698;
+}
+
+.darkMode .feedbackContainer {
+ width: 90%;
+ margin: 20px auto;
+ font-family: Arial, sans-serif;
+ background-color: #1f3048;
+ color: #e2e8f0;
+}
+
+.darkMode .participateFeedbackBtn {
+ background-color: #3f5f88;
+ color: #f8fafc;
+}
+
+.darkMode .formGroupRow span {
+ color: #e2e8f0;
+}
+
+.darkMode .feedbackTitle {
+ padding-left: 20px;
+ padding-top: 20px;
+ font-size: 20px;
+ color: #f8fafc;
+ font-weight: bold;
+ text-align: left;
+}
+
+.darkMode .feedbackCount {
+ font-size: 14px;
+ color: #cbd5e1;
+}
+
+.darkMode .filter {
+ color: #cbd5e1;
+}
+
+.darkMode .searchInput {
+ background-color: #243853;
+ color: #f8fafc;
+ border-color: #334155;
+}
+
+.darkMode .searchInput::placeholder {
+ color: #94a3b8;
+}
+
+.darkMode .icon {
+ color: #94a3b8;
+}
+
+.darkMode .filterDropdown {
+ background: #243853;
+ color: #e2e8f0;
+ border-color: #334155;
+}
+
+.darkMode .sortBtn {
+ background: #243853;
+ color: #e2e8f0;
+ border-color: #334155;
+}
+
+.darkMode .feedbackCard {
+ background: #3a506b;
+ border-radius: 10px;
+ border: 1px solid #3c516d;
+ box-shadow: 0 6px 14px rgba(8, 18, 32, 0.2);
+ padding: 14px 16px;
+}
+
+.darkMode .feedbackText {
+ color: #e2e8f0;
+}
+
+.darkMode .feedbackDate {
+ color: #94a3b8;
+}
+
+.darkMode .feedbackHeader strong {
+ color: #f8fafc;
+}
+
+.darkMode .label {
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+ color: #f8fafc;
+}
+
+.darkMode .textarea {
+ background-color: #243853;
+ color: #e2e8f0;
+ border-color: #4b637f;
+}
+
+.darkMode .textarea::placeholder {
+ color: #94a3b8;
+}
+
+@media (max-width: 800px) {
+ .feedbackHeader {
+ flex-direction: column;
+ align-items: stretch;
+ gap: 12px;
+ }
+
+ .searchContainer {
+ width: 100%;
+ }
+
+ .sortOptions {
+ width: 100%;
+ flex-wrap: wrap;
+ gap: 8px;
+ align-items: flex-start;
+ }
+
+ .filter {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-right: 0;
+ }
+
+ .filterDropdown {
+ flex: 1;
+ min-width: 120px;
+ }
+
+ .sortBtn {
+ width: auto;
+ align-self: flex-start;
+ justify-content: flex-start;
+ padding: 8px 12px;
+ }
+
+ .hostViewToggles {
+ flex-wrap: wrap;
+ gap: 10px;
+ padding: 6px 0;
+ }
+}
+
+.darkMode .badgePublic {
+ background: rgba(59, 130, 246, 0.2);
+ color: #93c5fd;
+}
+
+.darkMode .badgePrivate {
+ background: rgba(248, 113, 113, 0.2);
+ color: #fecaca;
+}
+
+.darkMode .badgeSuggestion {
+ background: rgba(245, 158, 11, 0.2);
+ color: #fde68a;
+}
+
+.darkMode .hostViewToggles button {
+ background: transparent;
+ border: 1px solid #3c516d;
+ color: #cbd5e1;
+}
+
+.darkMode .hostViewToggles button:hover {
+ background: #243853;
+ border-color: #4b637f;
+ color: #f8fafc;
+}
+
+.darkMode .hostViewToggles .toggleActive {
+ background: #243853;
+ border-color: #4b637f;
+ color: #f8fafc;
+ box-shadow: 0 10px 18px rgba(8, 18, 32, 0.35);
+}
diff --git a/src/components/CommunityPortal/Activities/activityId/FeedBackSection/FeedbackModal.jsx b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/FeedbackModal.jsx
new file mode 100644
index 0000000000..6e4a1a1b03
--- /dev/null
+++ b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/FeedbackModal.jsx
@@ -0,0 +1,57 @@
+import React from 'react';
+import { useSelector } from 'react-redux';
+import styles from './FeedbackModal.module.css';
+
+const FeedbackModal = ({
+ title,
+ children,
+ onClose,
+ onSubmit,
+ show,
+ showSubmit = true,
+ submitLabel = 'Submit',
+ cancelLabel = 'Cancel',
+ disableSubmit = false,
+ importantLabel = null,
+}) => {
+ const darkMode = useSelector(state => state.theme?.darkMode);
+
+ if (!show) return null;
+
+ return (
+
+
+
+
+
{title}
+
+
+
+ {importantLabel &&
{importantLabel}
}
+
+
{children}
+
+
+
+ {showSubmit && (
+
+ )}
+
+
+
+
+ );
+};
+
+export default FeedbackModal;
diff --git a/src/components/CommunityPortal/Activities/activityId/FeedBackSection/FeedbackModal.module.css b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/FeedbackModal.module.css
new file mode 100644
index 0000000000..26bbe0f9dd
--- /dev/null
+++ b/src/components/CommunityPortal/Activities/activityId/FeedBackSection/FeedbackModal.module.css
@@ -0,0 +1,156 @@
+.modalOverlay {
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.55);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2000;
+}
+
+.modal {
+ background: var(--modal-bg, #fff);
+ color: var(--modal-text, #222);
+ border-radius: 12px;
+ padding: 1.5rem;
+ width: 95%;
+ max-width: 500px;
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3);
+ animation: fadeIn 0.25s ease;
+ border: 1px solid #e2e8f0;
+}
+
+.modalHeader {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 1rem;
+}
+
+.modalHeader h3 {
+ margin: 0;
+ font-size: 1.25rem;
+ color: inherit;
+}
+
+.modalHeader button {
+ background: none;
+ border: none;
+ font-size: 1.2rem;
+ cursor: pointer;
+ color: inherit;
+ transition: transform 0.2s ease, opacity 0.2s ease;
+}
+
+.modalHeader button:hover {
+ transform: scale(1.1);
+ opacity: 0.8;
+}
+
+.importantLabel {
+ background-color: #fff7e6;
+ color: #8a5a12;
+ border: 1px solid #fde2b8;
+ padding: 0.7rem 0.8rem;
+ border-radius: 10px;
+ font-size: 0.9rem;
+ margin-bottom: 1rem;
+ line-height: 1.4;
+}
+
+.modalBody {
+ margin-bottom: 1.5rem;
+}
+
+.modalActions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 0.75rem;
+}
+
+.btnPrimary {
+ background: #1e3a8a;
+ border: 1px solid #1e3a8a;
+ color: #ffffff;
+ padding: 0.55rem 1.1rem;
+ border-radius: 999px;
+ cursor: pointer;
+ transition: background 0.2s ease, border-color 0.2s ease;
+}
+
+.btnPrimary:hover:not(:disabled) {
+ background: #1d4ed8;
+ border-color: #1d4ed8;
+}
+
+.btnPrimary:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+}
+
+.btnSecondary {
+ background: #f1f5f9;
+ border: 1px solid #cbd5e1;
+ color: #334155;
+ padding: 0.55rem 1.1rem;
+ border-radius: 999px;
+ cursor: pointer;
+ transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
+}
+
+.btnSecondary:hover {
+ background: #e2e8f0;
+ border-color: #b8c9e3;
+ color: #1e3a8a;
+}
+
+.darkMode .modalOverlay {
+ background: rgba(5, 10, 20, 0.7);
+}
+
+.darkMode .modal {
+ background-color: #1b2a41;
+ color: #e2e8f0;
+ border: 1px solid #2f425d;
+ box-shadow: 0 18px 40px rgba(2, 8, 18, 0.5);
+}
+
+.darkMode .importantLabel {
+ background-color: #3b2f1e;
+ color: #f7d7a6;
+ border: 1px solid #5a4327;
+}
+
+.darkMode .btnPrimary {
+ background: #5b7fb1;
+ border-color: #5b7fb1;
+ color: #0b1220;
+}
+
+.darkMode .btnPrimary:hover:not(:disabled) {
+ background: #6d8fbe;
+ border-color: #6d8fbe;
+}
+
+.darkMode .btnSecondary {
+ background: #243853;
+ border-color: #4b637f;
+ color: #e2e8f0;
+}
+
+.darkMode .btnSecondary:hover {
+ background: #2c4463;
+ border-color: #5a7698;
+ color: #f8fafc;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
diff --git a/src/components/CommunityPortal/Activities/activityId/FeedbackData.js b/src/components/CommunityPortal/Activities/activityId/FeedbackData.js
new file mode 100644
index 0000000000..472f247da5
--- /dev/null
+++ b/src/components/CommunityPortal/Activities/activityId/FeedbackData.js
@@ -0,0 +1,34 @@
+export const feedbackData = [
+ {
+ id: 1,
+ name: 'Oliver Bennett',
+ rating: 4,
+ comment: 'Great service and quick response!',
+ date: '2025-01-24',
+ visibility: 'public',
+ },
+ {
+ id: 2,
+ name: 'James Carter',
+ rating: 5,
+ comment: 'Loved the experience! Very professional team.',
+ date: '2025-01-22',
+ visibility: 'public',
+ },
+ {
+ id: 3,
+ name: 'Maya Lopez',
+ rating: null,
+ comment: 'Consider offering morning slots for working people.',
+ date: '2025-09-25',
+ visibility: 'suggestion',
+ },
+ {
+ id: 4,
+ name: 'Test User',
+ rating: 5,
+ comment: 'New event — early feedback visible to host only.',
+ date: '2025-09-28',
+ visibility: 'host-only',
+ },
+];
diff --git a/src/routes.jsx b/src/routes.jsx
index 2adfce4c27..43ab986ce2 100644
--- a/src/routes.jsx
+++ b/src/routes.jsx
@@ -81,7 +81,7 @@ import SkillsOverviewPage from './components/HGNHelpSkillsDashboard/SkillsOvervi
import CommunityMembersPage from './components/HGNHelpSkillsDashboard/CommunityMembersPage';
import UserProfilePage from './components/HGNHelpSkillsDashboard/UserProfilePage';
import FeedbackModal from './components/HGNHelpSkillsDashboard/FeedbackModal';
-import Activity from './components/CommunityPortal/Activities/activityId/Activity';
+import ActivityFeedback from './components/CommunityPortal/Activities/activityId/ActivityFeedback';
import ActivityAttendance from './components/CommunityPortal/Activities/ActivityAttendance';
import ActivityAgenda from './components/CommunityPortal/Activities/ActivityAgenda';
import NoshowViz from './components/CommunityPortal/Attendence/NoshowViz';
@@ -735,6 +735,11 @@ export default (
{/* ----- Community Calendar Routing ----- */}
+