diff --git a/src/pages/Dashboard.js b/src/pages/Dashboard.js index 1b4f052..eb9429a 100644 --- a/src/pages/Dashboard.js +++ b/src/pages/Dashboard.js @@ -17,6 +17,7 @@ const Dashboard = () => { const [resendLoading, setResendLoading] = useState(false); const [eventActivity, setEventActivity] = useState(null); const [activityLoading, setActivityLoading] = useState(true); + const joinedDate = user?.member_since || user?.created_at; useEffect(() => { fetchUpcomingEvents(); @@ -197,7 +198,7 @@ const Dashboard = () => {

Member Since

- {user?.created_at ? new Date(user.created_at).toLocaleDateString() : 'N/A'} + {joinedDate ? new Date(joinedDate).toLocaleDateString() : 'N/A'}

{user?.subscription_start_date && user?.subscription_end_date && ( diff --git a/src/pages/admin/AdminMembers.js b/src/pages/admin/AdminMembers.js index 5a2d181..1091f80 100644 --- a/src/pages/admin/AdminMembers.js +++ b/src/pages/admin/AdminMembers.js @@ -385,13 +385,15 @@ const AdminMembers = () => { ) : filteredUsers.length > 0 ? (
- {filteredUsers.map((user) => ( - -
+ {filteredUsers.map((user) => { + const joinedDate = user.member_since || user.created_at; + return ( + +
{/* Avatar */}
@@ -409,7 +411,7 @@ const AdminMembers = () => {

Email: {user.email}

Phone: {user.phone}

-

Joined: {new Date(user.created_at).toLocaleDateString()}

+

Joined: {joinedDate ? new Date(joinedDate).toLocaleDateString() : 'N/A'}

{user.referred_by_member_name && (

Referred by: {user.referred_by_member_name}

)} @@ -523,7 +525,8 @@ const AdminMembers = () => {
- ))} + ); + })}
) : (
diff --git a/src/pages/admin/AdminStaff.js b/src/pages/admin/AdminStaff.js index e484e69..046a681 100644 --- a/src/pages/admin/AdminStaff.js +++ b/src/pages/admin/AdminStaff.js @@ -242,12 +242,14 @@ const AdminStaff = () => {
) : filteredUsers.length > 0 ? (
- {filteredUsers.map((user) => ( - + {filteredUsers.map((user) => { + const joinedDate = user.member_since || user.created_at; + return ( +
{/* Avatar */} @@ -267,7 +269,7 @@ const AdminStaff = () => {

Email: {user.email}

Phone: {user.phone}

-

Joined: {new Date(user.created_at).toLocaleDateString()}

+

Joined: {joinedDate ? new Date(joinedDate).toLocaleDateString() : 'N/A'}

{user.last_login && (

Last Login: {new Date(user.last_login).toLocaleDateString()}

)} @@ -321,8 +323,9 @@ const AdminStaff = () => { )}
- - ))} + + ); + })}
) : (
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 = () => {
- Joined {new Date(user.created_at).toLocaleDateString()} + Joined {joinedDate ? new Date(joinedDate).toLocaleDateString() : 'N/A'}
@@ -363,6 +405,27 @@ const AdminUserView = () => {

+
+ +
+ setMemberSince(e.target.value)} + className="max-w-[200px] border-[var(--neutral-800)]" + /> + +
+
+ {user.partner_first_name && (
diff --git a/src/pages/members/MembersDirectory.js b/src/pages/members/MembersDirectory.js index 5d17b86..31bd3d3 100644 --- a/src/pages/members/MembersDirectory.js +++ b/src/pages/members/MembersDirectory.js @@ -118,8 +118,10 @@ const MembersDirectory = () => { :
) } - const MemberCard = ({ member }) => ( - + const MemberCard = ({ member }) => { + const joinedDate = member.member_since || member.created_at; + return ( + {/* Profile Photo */}
{member.profile_photo_url ? ( @@ -160,11 +162,11 @@ const MembersDirectory = () => { )} {/* Member Since */} - {member.created_at && ( + {joinedDate && (
- Member since {new Date(member.created_at).toLocaleDateString('en-US', { + Member since {new Date(joinedDate).toLocaleDateString('en-US', { month: 'long', year: 'numeric' })} @@ -276,7 +278,8 @@ const MembersDirectory = () => {
- ); + ); + }; return (