2 critical fixes: pwd reset and invitation caching ui

This commit is contained in:
ValueOn AG 2026-03-03 23:07:49 +01:00
parent 5186e58e00
commit d603ee8820

View file

@ -25,6 +25,7 @@ import React, { useState, useEffect } from 'react';
import { useParams, useNavigate, Link } from 'react-router-dom';
import { useInvitations, type InvitationValidation } from '../hooks/useInvitations';
import api from '../api';
import { getUserDataCache } from '../utils/userCache';
import { FaCheckCircle, FaTimesCircle, FaSpinner, FaSignInAlt, FaUserPlus } from 'react-icons/fa';
import styles from './InvitePage.module.css';
@ -45,6 +46,7 @@ export const InvitePage: React.FC = () => {
const [accepting, setAccepting] = useState(false);
const [success, setSuccess] = useState(false);
const [error, setError] = useState<string | null>(null);
const [userMismatch, setUserMismatch] = useState(false);
const [userExists, setUserExists] = useState<boolean | null>(null);
// Validate token on mount
@ -84,6 +86,14 @@ export const InvitePage: React.FC = () => {
}
}
if (result.valid && isAuthenticated && result.targetUsername) {
const cachedUser = getUserDataCache();
if (cachedUser?.username && cachedUser.username.toLowerCase() !== result.targetUsername.toLowerCase()) {
localStorage.removeItem(PENDING_INVITATION_KEY);
setUserMismatch(true);
}
}
setValidating(false);
};
@ -190,6 +200,29 @@ export const InvitePage: React.FC = () => {
);
}
// Authenticated but invitation is for a different user
if (userMismatch && validation?.valid) {
const cachedUser = getUserDataCache();
return (
<div className={styles.container}>
<div className={styles.card}>
<div className={styles.errorState}>
<FaTimesCircle className={styles.errorIcon} />
<h1>Falsche Anmeldung</h1>
<p>
Diese Einladung ist für <strong>{validation.targetUsername}</strong> bestimmt.
Sie sind als <strong>{cachedUser?.username || 'anderer Benutzer'}</strong> angemeldet.
</p>
<p>Bitte melden Sie sich ab und mit dem richtigen Konto wieder an.</p>
<Link to="/" className={styles.primaryButton}>
Zum Dashboard
</Link>
</div>
</div>
</div>
);
}
// Already authenticated - show accept button
const isFeatureInvite = !!validation.featureInstanceId;
const introText = isFeatureInvite