Skip to content

Commit

Permalink
Merge pull request #330 from EscolaLMS/feature/SPRAW-75
Browse files Browse the repository at this point in the history
Add autoscroll to nerest topic element.
  • Loading branch information
victazzz authored Mar 4, 2024
2 parents 8cc6066 + aa9d7e8 commit 2d83b0b
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 18 deletions.
21 changes: 17 additions & 4 deletions src/components/atoms/ProgressBar/ProgressBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,24 @@ import { ExtendableStyledComponent } from "types/component";
import { getFontFromTheme } from "../../../theme/provider";
import { calcPercentage, getStylesBasedOnTheme } from "../../../utils/utils";

const VariantTypes = {
ROUNDED: "rounded",
SQUARE: "square",
} as const;

type VariantTypeProp = typeof VariantTypes[keyof typeof VariantTypes];

export interface ProgressBarProps
extends React.HTMLAttributes<HTMLDivElement>,
ExtendableStyledComponent {
variant?: VariantTypeProp;
hideLabel?: boolean;
label?: string | React.ReactNode;
currentProgress: number;
maxProgress: number;
}

const StyledDiv = styled.div`
const StyledDiv = styled.div<{ $variant?: VariantTypeProp }>`
margin: 0;
padding: 0;
color: ${({ theme }) =>
Expand All @@ -33,16 +41,17 @@ const StyledDiv = styled.div`
.label-value {
width: 95%;
font-size: 13px;
}
.percentage-value {
font-size: 14px;
font-size: 13px;
margin-left: auto;
height: 22px;
display: flex;
align-items: center;
justify-content: flex-end;
font-weight: bold;
font-weight: ${({ $variant }) => $variant === VariantTypes.SQUARE ? 'bold' : 'normal'};
width: 5%;
}
}
Expand All @@ -57,12 +66,13 @@ const StyledDiv = styled.div`
align-items: center;
.progress-bars {
flex: 1;
height: 3px;
height: ${({ $variant }) => $variant === VariantTypes.SQUARE ? '3px' : '6px'};
position: relative;
.empty {
display: block;
background: ${({ theme }) => theme.positive2};
height: 100%;
border-radius: ${({ $variant }) => $variant === VariantTypes.ROUNDED ? '5px' : ''};
}
.filled {
position: absolute;
Expand All @@ -71,6 +81,7 @@ const StyledDiv = styled.div`
display: block;
height: 100%;
transition: 0.2s width ease-in-out;
border-radius: ${({ $variant }) => $variant === VariantTypes.ROUNDED ? '5px' : ''};
}
}
}
Expand All @@ -79,6 +90,7 @@ const StyledDiv = styled.div`
export const ProgressBar: React.FC<ProgressBarProps> = (props) => {
const { t } = useTranslation();
const {
variant = VariantTypes.ROUNDED,
currentProgress,
maxProgress,
hideLabel,
Expand All @@ -102,6 +114,7 @@ export const ProgressBar: React.FC<ProgressBarProps> = (props) => {
<StyledDiv
{...props}
className={`wellms-component lms-progress-bar ${className}`}
$variant={variant}
>
<div className="label-container">
{renderLabel()}
Expand Down
17 changes: 11 additions & 6 deletions src/components/molecules/CourseTopNav/CourseTopNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export interface CourseTopNavProps
onNext: () => void;
onPrev: () => void;
onFinish: () => void;
allButtonsDisabled?: boolean;
isMarkBtnDisabled?: boolean;
currentNote?: NoteData;
newNoteData?: NewNoteData;
Expand Down Expand Up @@ -104,6 +105,7 @@ export const CourseTopNav: React.FC<CourseTopNavProps> = (props) => {
isLast = false,
hasNext = true,
hasPrev = true,
allButtonsDisabled = false,
onNext,
onPrev,
onFinish,
Expand All @@ -128,7 +130,7 @@ export const CourseTopNav: React.FC<CourseTopNavProps> = (props) => {
mode={"primary"}
className="icon-btn next-btn"
onClick={() => onNext && onNext()}
disabled={!hasNext}
disabled={!hasNext || allButtonsDisabled}
aria-label={t<string>("Actions.ShowNext")}
>
{!mobile && <>{t<string>("CourseTopNav.next")} </>}
Expand All @@ -146,6 +148,7 @@ export const CourseTopNav: React.FC<CourseTopNavProps> = (props) => {
}
}}
aria-label={t("Course.finishCourse")}
disabled={allButtonsDisabled}
>
{t("Course.finishCourse")}
</Button>
Expand All @@ -160,15 +163,15 @@ export const CourseTopNav: React.FC<CourseTopNavProps> = (props) => {
onFinish && onFinish();
}}
aria-label={t("Course.markAsFinished")}
disabled={isMarkBtnDisabled}
disabled={isMarkBtnDisabled || allButtonsDisabled}
>
<Icon name="finished" />
{t("Course.markAsFinished")}
</Button>
);
}
return <></>;
}, [isFinished, t, onFinish, mobile, isLast]);
}, [isFinished, t, onFinish, mobile, isLast, allButtonsDisabled]);

const renderNoteButton = React.useCallback(() => {
return (
Expand All @@ -177,12 +180,13 @@ export const CourseTopNav: React.FC<CourseTopNavProps> = (props) => {
className="icon-btn"
onClick={() => setShowNoteModal(true)}
aria-label={t("CourseTopNav.addNote")}
disabled={allButtonsDisabled}
>
<Icon name="note" />
{t("CourseTopNav.addNote")}
</Button>
);
}, [mobile, t, setShowNoteModal]);
}, [mobile, t, setShowNoteModal, allButtonsDisabled]);

const renderBookmarkButton = React.useCallback(() => {
return (
Expand All @@ -191,12 +195,13 @@ export const CourseTopNav: React.FC<CourseTopNavProps> = (props) => {
className="icon-btn"
onClick={() => onBookmarkClick && onBookmarkClick()}
aria-label={t(`CourseTopNav.${bookmarkBtnText}`)}
disabled={allButtonsDisabled}
>
<Icon name="bookmark" />
{t(`CourseTopNav.${bookmarkBtnText}`)}
</Button>
);
}, [mobile, onBookmarkClick, bookmarkBtnText]);
}, [mobile, onBookmarkClick, bookmarkBtnText, allButtonsDisabled]);

return (
<>
Expand All @@ -216,7 +221,7 @@ export const CourseTopNav: React.FC<CourseTopNavProps> = (props) => {
className="icon-btn prev-btn"
mode="gray"
onClick={() => onPrev && onPrev()}
disabled={!hasPrev}
disabled={!hasPrev || allButtonsDisabled}
aria-label={t<string>("Actions.ShowPrevious")}
>
<Icon name="chevronLeft" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useCallback, useMemo } from "react";
import React, { useCallback, useEffect, useMemo, useRef } from "react";
import { API } from "@escolalms/sdk/lib";
import { ThemeContext } from "styled-components";

Expand All @@ -13,10 +13,10 @@ export interface CourseAgendaTopicProps {
}

enum StateTypes {
CURRENT = 'current',
AVAILABLE = 'available',
FINISHED = 'finished',
LOCKED = 'locked',
CURRENT = "current",
AVAILABLE = "available",
FINISHED = "finished",
LOCKED = "locked",
}

const TopicIcon: React.FC<{ state: StateTypes }> = ({ state }) => {
Expand All @@ -29,7 +29,7 @@ const TopicIcon: React.FC<{ state: StateTypes }> = ({ state }) => {
case StateTypes.AVAILABLE:
return <></>;
default:
return <Icon name='lock' />;
return <Icon name="lock" />;
}
};

Expand All @@ -41,8 +41,9 @@ const CourseAgendaTopic: React.FC<CourseAgendaTopicProps> = ({
onTopicClick,
finishedTopicIds,
currentNotLockedTopicId,
availableTopicsIds
availableTopicsIds,
} = useCourseAgendaContext();
const ref = useRef<HTMLLIElement | null>(null);

const isFinished = useMemo(
() => finishedTopicIds.includes(topic.id),
Expand All @@ -53,6 +54,15 @@ const CourseAgendaTopic: React.FC<CourseAgendaTopicProps> = ({
[currentNotLockedTopicId, topic.id]
);

useEffect(() => {
if (isCurrent) {
ref?.current?.scrollIntoView({
behavior: "smooth",
block: 'nearest',
});
}
}, [ref?.current, isCurrent]);

const state: StateTypes = useMemo(() => {
if (isCurrent) {
return StateTypes.CURRENT;
Expand All @@ -74,7 +84,7 @@ const CourseAgendaTopic: React.FC<CourseAgendaTopicProps> = ({
}, [isCurrent, state]);

return (
<li className={`lesson__topic lesson__topic--${state}`}>
<li ref={ref} className={`lesson__topic lesson__topic--${state}`}>
<div
className="lesson__description"
tabIndex={clickable ? 0 : -1}
Expand Down

0 comments on commit 2d83b0b

Please sign in to comment.