Profile Rating Modal: Fix animation (#6582)
This commit is contained in:
parent
5801d02ae6
commit
d6f2f1cb4a
@ -29,8 +29,8 @@ $progress-color: #7e85ff;
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
transition: transform 0.2s ease-in-out;
|
transition: transform 0.2s ease;
|
||||||
animation: slide-in 0.5s ease-in-out;
|
animation: slide-in 0.5s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes slide-in {
|
@keyframes slide-in {
|
||||||
@ -85,7 +85,7 @@ $progress-color: #7e85ff;
|
|||||||
|
|
||||||
background-color: $progress-color;
|
background-color: $progress-color;
|
||||||
|
|
||||||
transition: width 0.25s ease-in-out;
|
transition: width 0.25s ease;
|
||||||
|
|
||||||
&.noTransition {
|
&.noTransition {
|
||||||
transition: none;
|
transition: none;
|
||||||
@ -306,7 +306,7 @@ $progress-color: #7e85ff;
|
|||||||
|
|
||||||
.positiveProgress,
|
.positiveProgress,
|
||||||
.negativeProgress {
|
.negativeProgress {
|
||||||
transition: opacity 0.15s, width var(--cycling-animation-progress), background-size 0.3s;
|
transition: opacity 0.15s ease, width var(--cycling-animation-progress) ease, background-size 0.3s ease;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,9 @@ import { getPeerTitle } from '../../../global/helpers/peers';
|
|||||||
import { selectUser, selectUserFullInfo } from '../../../global/selectors';
|
import { selectUser, selectUserFullInfo } from '../../../global/selectors';
|
||||||
import buildClassName from '../../../util/buildClassName';
|
import buildClassName from '../../../util/buildClassName';
|
||||||
import { formatShortDuration } from '../../../util/dates/dateFormat';
|
import { formatShortDuration } from '../../../util/dates/dateFormat';
|
||||||
|
import { getServerTime } from '../../../util/serverTime';
|
||||||
|
|
||||||
|
import useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';
|
||||||
import useLang from '../../../hooks/useLang';
|
import useLang from '../../../hooks/useLang';
|
||||||
import useLastCallback from '../../../hooks/useLastCallback';
|
import useLastCallback from '../../../hooks/useLastCallback';
|
||||||
|
|
||||||
@ -44,6 +46,10 @@ const ProfileRatingModal = ({
|
|||||||
} = getActions();
|
} = getActions();
|
||||||
const lang = useLang();
|
const lang = useLang();
|
||||||
const isOpen = Boolean(modal);
|
const isOpen = Boolean(modal);
|
||||||
|
const renderingUser = useCurrentOrPrev(user);
|
||||||
|
const renderingStarsRating = useCurrentOrPrev(starsRating);
|
||||||
|
const renderingPendingRating = useCurrentOrPrev(pendingRating);
|
||||||
|
const renderingPendingRatingDate = useCurrentOrPrev(pendingRatingDate);
|
||||||
const [showFutureRating, setShowFutureRating] = useState(false);
|
const [showFutureRating, setShowFutureRating] = useState(false);
|
||||||
|
|
||||||
const handleClose = useLastCallback(() => {
|
const handleClose = useLastCallback(() => {
|
||||||
@ -77,16 +83,18 @@ const ProfileRatingModal = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const header = useMemo(() => {
|
const header = useMemo(() => {
|
||||||
if (!modal || !user || !starsRating || !isOpen) return undefined;
|
if (!renderingUser || !renderingStarsRating) return undefined;
|
||||||
|
|
||||||
const rating = showFutureRating && pendingRating ? pendingRating : starsRating;
|
const rating = showFutureRating && renderingPendingRating
|
||||||
|
? renderingPendingRating : renderingStarsRating;
|
||||||
const currentStars = rating.stars;
|
const currentStars = rating.stars;
|
||||||
const currentLevelStars = rating.currentLevelStars;
|
const currentLevelStars = rating.currentLevelStars;
|
||||||
const nextLevelStars = rating.nextLevelStars;
|
const nextLevelStars = rating.nextLevelStars;
|
||||||
const currentLevel = rating.level;
|
const currentLevel = rating.level;
|
||||||
const nextLevel = currentLevel + 1;
|
const nextLevel = currentLevel + 1;
|
||||||
const isNegative = currentLevel < 0;
|
const isNegative = currentLevel < 0;
|
||||||
const pendingLevel = !showFutureRating && pendingRating ? pendingRating.level : starsRating.level;
|
const pendingLevel = !showFutureRating && renderingPendingRating
|
||||||
|
? renderingPendingRating.level : renderingStarsRating.level;
|
||||||
|
|
||||||
let levelProgress = 0;
|
let levelProgress = 0;
|
||||||
|
|
||||||
@ -100,9 +108,9 @@ const ProfileRatingModal = ({
|
|||||||
|
|
||||||
const progress = isNegative ? 0.5 : Math.max(0, Math.min(1, levelProgress));
|
const progress = isNegative ? 0.5 : Math.max(0, Math.min(1, levelProgress));
|
||||||
|
|
||||||
const waitTime = pendingRatingDate ? pendingRatingDate - Math.floor(Date.now() / 1000) : 0;
|
const waitTime = renderingPendingRatingDate ? renderingPendingRatingDate - getServerTime() : 0;
|
||||||
const pendingPoints = pendingRating ? pendingRating.stars - starsRating.stars : 0;
|
const pendingPoints = renderingPendingRating ? renderingPendingRating.stars - renderingStarsRating.stars : 0;
|
||||||
const shouldShowPreview = pendingRating && pendingRatingDate;
|
const shouldShowPreview = renderingPendingRating && renderingPendingRatingDate;
|
||||||
|
|
||||||
const renderPreviewDescription = () => {
|
const renderPreviewDescription = () => {
|
||||||
if (!shouldShowPreview) return undefined;
|
if (!shouldShowPreview) return undefined;
|
||||||
@ -180,16 +188,16 @@ const ProfileRatingModal = ({
|
|||||||
{lang('TitleRating')}
|
{lang('TitleRating')}
|
||||||
</div>
|
</div>
|
||||||
<p className={styles.description}>
|
<p className={styles.description}>
|
||||||
{user?.id === currentUserId
|
{renderingUser?.id === currentUserId
|
||||||
? lang('RatingYourReflectsActivity')
|
? lang('RatingYourReflectsActivity')
|
||||||
: lang('RatingReflectsActivity', { name: getPeerTitle(lang, user) || userFallbackText },
|
: lang('RatingReflectsActivity', { name: getPeerTitle(lang, renderingUser) || userFallbackText },
|
||||||
{ withMarkdown: true, withNodes: true })}
|
{ withMarkdown: true, withNodes: true })}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}, [modal, user, currentUserId, starsRating,
|
}, [renderingUser, currentUserId, renderingStarsRating,
|
||||||
pendingRating, pendingRatingDate, showFutureRating,
|
renderingPendingRating, renderingPendingRatingDate, showFutureRating,
|
||||||
lang, handleShowFuture, handleShowCurrent, isOpen]);
|
lang, handleShowFuture, handleShowCurrent]);
|
||||||
|
|
||||||
const listItemData = [
|
const listItemData = [
|
||||||
['closed-gift', lang('RatingGiftsFromTelegram'), (
|
['closed-gift', lang('RatingGiftsFromTelegram'), (
|
||||||
@ -213,7 +221,6 @@ const ProfileRatingModal = ({
|
|||||||
] satisfies TableAboutData;
|
] satisfies TableAboutData;
|
||||||
|
|
||||||
const footer = useMemo(() => {
|
const footer = useMemo(() => {
|
||||||
if (!isOpen) return undefined;
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.footer}>
|
<div className={styles.footer}>
|
||||||
<Button
|
<Button
|
||||||
@ -225,7 +232,7 @@ const ProfileRatingModal = ({
|
|||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}, [lang, isOpen, handleClose]);
|
}, [lang, handleClose]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TableAboutModal
|
<TableAboutModal
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user