diff --git a/src/pages/admin/AdminUserView.js b/src/pages/admin/AdminUserView.js
index d94bd76..d20c48d 100644
--- a/src/pages/admin/AdminUserView.js
+++ b/src/pages/admin/AdminUserView.js
@@ -5,6 +5,7 @@ import { Card } from '../../components/ui/card';
import { Button } from '../../components/ui/button';
import { Badge } from '../../components/ui/badge';
import { Avatar, AvatarImage, AvatarFallback } from '../../components/ui/avatar';
+import { Input } from '../../components/ui/input';
import { ArrowLeft, Mail, Phone, MapPin, Calendar, Lock, AlertTriangle, Camera, Upload, Trash2, Shield } from 'lucide-react';
import { toast } from 'sonner';
import ConfirmationDialog from '../../components/ConfirmationDialog';
@@ -24,15 +25,31 @@ const AdminUserView = () => {
const [uploadingPhoto, setUploadingPhoto] = useState(false);
const [maxFileSizeMB, setMaxFileSizeMB] = useState(50);
const [maxFileSizeBytes, setMaxFileSizeBytes] = useState(52428800);
+ const [memberSince, setMemberSince] = useState('');
+ const [memberSinceSaving, setMemberSinceSaving] = useState(false);
const fileInputRef = useRef(null);
const [changeRoleDialogOpen, setChangeRoleDialogOpen] = useState(false);
+ const formatDateInputValue = (value) => {
+ if (!value) return '';
+ if (typeof value === 'string') {
+ return value.slice(0, 10);
+ }
+ return new Date(value).toISOString().slice(0, 10);
+ };
+
useEffect(() => {
fetchConfig();
fetchUserProfile();
fetchSubscriptions();
}, [userId]);
+ useEffect(() => {
+ if (user) {
+ setMemberSince(formatDateInputValue(user.member_since));
+ }
+ }, [user]);
+
const fetchUserProfile = async () => {
try {
const response = await api.get(`/admin/users/${userId}`);
@@ -177,6 +194,27 @@ const AdminUserView = () => {
}
};
+ const handleMemberSinceSave = async () => {
+ if (!user) return;
+ setMemberSinceSaving(true);
+ try {
+ const payload = {
+ member_since: memberSince ? memberSince : null
+ };
+ const response = await api.put(`/admin/users/${userId}`, payload);
+ setUser(prev => ({
+ ...prev,
+ ...(response?.data || {}),
+ member_since: payload.member_since
+ }));
+ toast.success('Member since updated successfully');
+ } catch (error) {
+ toast.error(error.response?.data?.detail || 'Failed to update member since');
+ } finally {
+ setMemberSinceSaving(false);
+ }
+ };
+
const getActionMessage = () => {
if (!pendingAction || !user) return {};
@@ -212,6 +250,10 @@ const AdminUserView = () => {
if (loading) return
Loading...
;
if (!user) return null;
+ const joinedDate = user.member_since || user.created_at;
+ const memberSinceBaseline = formatDateInputValue(user.member_since);
+ const memberSinceHasChanges = memberSince !== memberSinceBaseline;
+
return (
<>
{/* Back Button */}
@@ -262,7 +304,7 @@ const AdminUserView = () => {