From d2ffdc888683cd8398684577ab2472724c3cf1cc Mon Sep 17 00:00:00 2001 From: Steven Enamakel Date: Fri, 20 Mar 2026 17:21:47 -0700 Subject: [PATCH] remove unwwatned components --- lander/app/components/FeedbackCard.tsx | 99 ------ lander/app/components/FeedbackDetailModal.tsx | 331 ------------------ lander/app/components/FeedbackKanban.tsx | 257 -------------- lander/app/components/FeedbackList.tsx | 218 ------------ 4 files changed, 905 deletions(-) delete mode 100644 lander/app/components/FeedbackCard.tsx delete mode 100644 lander/app/components/FeedbackDetailModal.tsx delete mode 100644 lander/app/components/FeedbackKanban.tsx delete mode 100644 lander/app/components/FeedbackList.tsx diff --git a/lander/app/components/FeedbackCard.tsx b/lander/app/components/FeedbackCard.tsx deleted file mode 100644 index 36f89e828..000000000 --- a/lander/app/components/FeedbackCard.tsx +++ /dev/null @@ -1,99 +0,0 @@ -'use client'; - -import type { Feedback } from '../feedback/page'; - -interface FeedbackCardProps { - feedback: Feedback; - token: string | null; - onUpdate: () => void; - onClick: () => void; -} - -export default function FeedbackCard({ feedback, token, onUpdate, onClick }: FeedbackCardProps) { - const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001'; - - const handleVote = async (voteType: 'upvote' | 'downvote') => { - if (!token) return; - - try { - const response = await fetch(`${API_BASE_URL}/api/feedback/${feedback._id}/vote`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}`, - }, - body: JSON.stringify({ voteType }), - }); - - const data = await response.json(); - if (data.success) { - onUpdate(); - } - } catch (error) { - console.error('Failed to vote:', error); - } - }; - - const getTypeLabel = (type: string) => { - switch (type) { - case 'feature': - return 'FEATURE REQUEST'; - case 'bug': - return 'BUG'; - case 'improvement': - return 'IMPROVEMENT'; - default: - return type.toUpperCase(); - } - }; - - return ( -
-
-

{feedback.title}

- - {getTypeLabel(feedback.type)} - -
- {feedback.description && ( -

{feedback.description}

- )} -
-
- - -
- - {feedback.comments.length} {feedback.comments.length === 1 ? 'comment' : 'comments'} - -
-
- ); -} diff --git a/lander/app/components/FeedbackDetailModal.tsx b/lander/app/components/FeedbackDetailModal.tsx deleted file mode 100644 index be8529ac1..000000000 --- a/lander/app/components/FeedbackDetailModal.tsx +++ /dev/null @@ -1,331 +0,0 @@ -'use client'; - -import { useState, useEffect } from 'react'; -import type { Feedback } from '../feedback/page'; - -interface FeedbackDetailModalProps { - feedback: Feedback; - token: string | null; - onClose: () => void; - onUpdate: () => void; - useMockData?: boolean; - mockComments?: Record>; - feedbacks?: Feedback[]; - setFeedbacks?: (feedbacks: Feedback[]) => void; -} - -export default function FeedbackDetailModal({ - feedback, - token, - onClose, - onUpdate, - useMockData = false, - mockComments, - feedbacks = [], - setFeedbacks, -}: FeedbackDetailModalProps) { - const [comments, setComments] = useState>([]); - const [newComment, setNewComment] = useState(''); - const [loading, setLoading] = useState(true); - const [currentFeedback, setCurrentFeedback] = useState(feedback); - - const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001'; - - const loadComments = async () => { - try { - if (useMockData && mockComments) { - // Mock comments - await new Promise(resolve => setTimeout(resolve, 200)); - const feedbackComments = mockComments[feedback._id] || []; - setComments(feedbackComments); - } else { - const headers: HeadersInit = {}; - if (token) { - headers['Authorization'] = `Bearer ${token}`; - } - - const response = await fetch(`${API_BASE_URL}/api/feedback/${feedback._id}`, { headers }); - const data = await response.json(); - if (data.success) { - setComments(data.data.comments || []); - setCurrentFeedback(data.data); - } - } - } catch (error) { - console.error('Failed to load comments:', error); - } finally { - setLoading(false); - } - }; - - useEffect(() => { - setCurrentFeedback(feedback); - loadComments(); - }, [feedback._id, token]); - - const handleAddComment = async () => { - if (!token || !newComment.trim()) return; - - try { - if (useMockData && mockComments && setFeedbacks) { - // Mock add comment - await new Promise(resolve => setTimeout(resolve, 200)); - const newCommentObj = { - _id: String(Date.now()), - content: newComment, - user: { - telegramId: 123456789, - telegramFirstName: 'John', - telegramLastName: 'Doe', - telegramUsername: 'johndoe', - }, - createdAt: new Date().toISOString(), - }; - - if (!mockComments[feedback._id]) { - mockComments[feedback._id] = []; - } - mockComments[feedback._id].push(newCommentObj); - - // Update feedback comments count - const updatedFeedbacks = feedbacks.map(f => { - if (f._id === feedback._id) { - return { ...f, comments: [...f.comments, newCommentObj._id] }; - } - return f; - }); - - // Update global mock state - const { setMockFeedbacks } = require('../feedback/page'); - setMockFeedbacks(updatedFeedbacks); - setFeedbacks(updatedFeedbacks); - - setNewComment(''); - await loadComments(); - onUpdate(); - } else { - const response = await fetch(`${API_BASE_URL}/api/feedback/${feedback._id}/comments`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}`, - }, - body: JSON.stringify({ content: newComment }), - }); - - const data = await response.json(); - if (data.success) { - setNewComment(''); - await loadComments(); - onUpdate(); - } - } - } catch (error) { - console.error('Failed to add comment:', error); - } - }; - - const handleVote = async (voteType: 'upvote' | 'downvote') => { - if (!token) return; - - try { - if (useMockData && setFeedbacks) { - // Mock vote - await new Promise(resolve => setTimeout(resolve, 200)); - - const updatedFeedbacks = feedbacks.map(f => { - if (f._id === feedback._id) { - const updated = { ...f }; - - // Toggle vote logic - if (updated.userVote === voteType) { - // Remove vote - updated.userVote = null; - if (voteType === 'upvote') { - updated.upvotes = Math.max(0, updated.upvotes - 1); - } else { - updated.downvotes = Math.max(0, updated.downvotes - 1); - } - } else if (updated.userVote) { - // Change vote - const oldVote = updated.userVote; - if (oldVote === 'upvote') { - updated.upvotes = Math.max(0, updated.upvotes - 1); - } else { - updated.downvotes = Math.max(0, updated.downvotes - 1); - } - updated.userVote = voteType; - if (voteType === 'upvote') { - updated.upvotes += 1; - } else { - updated.downvotes += 1; - } - } else { - // New vote - updated.userVote = voteType; - if (voteType === 'upvote') { - updated.upvotes += 1; - } else { - updated.downvotes += 1; - } - } - - setCurrentFeedback(updated); - return updated; - } - return f; - }); - - // Update global mock state - const { setMockFeedbacks } = require('../feedback/page'); - setMockFeedbacks(updatedFeedbacks); - setFeedbacks(updatedFeedbacks); - onUpdate(); - } else { - const response = await fetch(`${API_BASE_URL}/api/feedback/${feedback._id}/vote`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}`, - }, - body: JSON.stringify({ voteType }), - }); - - const data = await response.json(); - if (data.success) { - setCurrentFeedback({ - ...currentFeedback, - upvotes: data.data.upvotes, - downvotes: data.data.downvotes, - userVote: data.data.userVote, - }); - onUpdate(); - } - } - } catch (error) { - console.error('Failed to vote:', error); - } - }; - - return ( -
-
-
-
-
-

{currentFeedback.title}

- {currentFeedback.description && ( -

{currentFeedback.description}

- )} -
- - - - {comments.length} {comments.length === 1 ? 'comment' : 'comments'} - -
-
- -
-
- -
-
-

Comments

- {loading ? ( -
Loading comments...
- ) : comments.length > 0 ? ( -
- {comments.map((comment) => ( -
-
- - {comment.user.telegramFirstName || ''} {comment.user.telegramLastName || ''} - {comment.user.telegramUsername && ` (@${comment.user.telegramUsername})`} - - - {new Date(comment.createdAt).toLocaleDateString()} - -
-

{comment.content}

-
- ))} -
- ) : ( -
No comments yet.
- )} -
- - {token && ( -
-