first attempts to remember scroll position
This commit is contained in:
parent
be40475615
commit
c5920d060b
@ -8,6 +8,7 @@ import {APINode, callAPIPlain} from '../../utils/Api';
|
|||||||
interface PreviewProps {
|
interface PreviewProps {
|
||||||
name: string;
|
name: string;
|
||||||
movie_id: number;
|
movie_id: number;
|
||||||
|
onClick?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface PreviewState {
|
interface PreviewState {
|
||||||
@ -38,7 +39,7 @@ class Preview extends React.Component<PreviewProps, PreviewState> {
|
|||||||
render(): JSX.Element {
|
render(): JSX.Element {
|
||||||
const themeStyle = GlobalInfos.getThemeStyle();
|
const themeStyle = GlobalInfos.getThemeStyle();
|
||||||
return (
|
return (
|
||||||
<Link to={'/player/' + this.props.movie_id}>
|
<Link to={'/player/' + this.props.movie_id} onClick={this.props.onClick}>
|
||||||
<div className={style.videopreview + ' ' + themeStyle.secbackground + ' ' + themeStyle.preview}>
|
<div className={style.videopreview + ' ' + themeStyle.secbackground + ' ' + themeStyle.preview}>
|
||||||
<div className={style.previewtitle + ' ' + themeStyle.lighttextcolor}>{this.props.name}</div>
|
<div className={style.previewtitle + ' ' + themeStyle.lighttextcolor}>{this.props.name}</div>
|
||||||
<div className={style.previewpic}>
|
<div className={style.previewpic}>
|
||||||
|
@ -4,7 +4,9 @@ import style from './VideoContainer.module.css';
|
|||||||
import {VideoTypes} from '../../types/ApiTypes';
|
import {VideoTypes} from '../../types/ApiTypes';
|
||||||
|
|
||||||
interface props {
|
interface props {
|
||||||
data: VideoTypes.VideoUnloadedType[]
|
data: VideoTypes.VideoUnloadedType[];
|
||||||
|
onScrollPositionChange?: (scrollPos: number, loadedTiles: number) => void;
|
||||||
|
initialScrollPosition?: {scrollPos: number, loadedTiles: number};
|
||||||
}
|
}
|
||||||
|
|
||||||
interface state {
|
interface state {
|
||||||
@ -32,7 +34,16 @@ class VideoContainer extends React.Component<props, state> {
|
|||||||
componentDidMount(): void {
|
componentDidMount(): void {
|
||||||
document.addEventListener('scroll', this.trackScrolling);
|
document.addEventListener('scroll', this.trackScrolling);
|
||||||
|
|
||||||
this.loadPreviewBlock(16);
|
console.log(this.props.initialScrollPosition)
|
||||||
|
if(this.props.initialScrollPosition !== undefined){
|
||||||
|
this.loadPreviewBlock(this.props.initialScrollPosition.loadedTiles, () => {
|
||||||
|
if(this.props.initialScrollPosition !== undefined)
|
||||||
|
window.scrollTo(0, this.props.initialScrollPosition.scrollPos);
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
this.loadPreviewBlock(16);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render(): JSX.Element {
|
render(): JSX.Element {
|
||||||
@ -42,7 +53,11 @@ class VideoContainer extends React.Component<props, state> {
|
|||||||
<Preview
|
<Preview
|
||||||
key={elem.MovieId}
|
key={elem.MovieId}
|
||||||
name={elem.MovieName}
|
name={elem.MovieName}
|
||||||
movie_id={elem.MovieId}/>
|
movie_id={elem.MovieId}
|
||||||
|
onClick={(): void => {
|
||||||
|
if (this.props.onScrollPositionChange !== undefined)
|
||||||
|
this.props.onScrollPositionChange(window.pageYOffset - document.documentElement.clientHeight, this.loadindex)
|
||||||
|
}}/>
|
||||||
))}
|
))}
|
||||||
{/*todo css for no items to show*/}
|
{/*todo css for no items to show*/}
|
||||||
{this.state.loadeditems.length === 0 ?
|
{this.state.loadeditems.length === 0 ?
|
||||||
@ -62,7 +77,7 @@ class VideoContainer extends React.Component<props, state> {
|
|||||||
* load previews to the container
|
* load previews to the container
|
||||||
* @param nr number of previews to load
|
* @param nr number of previews to load
|
||||||
*/
|
*/
|
||||||
loadPreviewBlock(nr: number): void {
|
loadPreviewBlock(nr: number, callback? : () => void): void {
|
||||||
console.log('loadpreviewblock called ...');
|
console.log('loadpreviewblock called ...');
|
||||||
let ret = [];
|
let ret = [];
|
||||||
for (let i = 0; i < nr; i++) {
|
for (let i = 0; i < nr; i++) {
|
||||||
@ -77,7 +92,7 @@ class VideoContainer extends React.Component<props, state> {
|
|||||||
...this.state.loadeditems,
|
...this.state.loadeditems,
|
||||||
...ret
|
...ret
|
||||||
]
|
]
|
||||||
});
|
}, callback);
|
||||||
|
|
||||||
|
|
||||||
this.loadindex += nr;
|
this.loadindex += nr;
|
||||||
@ -88,8 +103,10 @@ class VideoContainer extends React.Component<props, state> {
|
|||||||
*/
|
*/
|
||||||
trackScrolling = (): void => {
|
trackScrolling = (): void => {
|
||||||
// comparison if current scroll position is on bottom --> 200 is bottom offset to trigger load
|
// comparison if current scroll position is on bottom --> 200 is bottom offset to trigger load
|
||||||
if (window.innerHeight + document.documentElement.scrollTop + 200 >= document.documentElement.offsetHeight) {
|
if (document.documentElement.clientHeight + document.documentElement.scrollTop + 200 >= document.documentElement.offsetHeight) {
|
||||||
this.loadPreviewBlock(8);
|
this.loadPreviewBlock(8);
|
||||||
|
if (this.props.onScrollPositionChange !== undefined)
|
||||||
|
this.props.onScrollPositionChange(document.documentElement.clientHeight + window.pageYOffset, this.loadindex)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,8 @@ import SearchHandling from './SearchHandling';
|
|||||||
import {VideoTypes} from '../../types/ApiTypes';
|
import {VideoTypes} from '../../types/ApiTypes';
|
||||||
import {DefaultTags} from "../../types/GeneralTypes";
|
import {DefaultTags} from "../../types/GeneralTypes";
|
||||||
|
|
||||||
interface props extends RouteComponentProps {}
|
interface props extends RouteComponentProps {
|
||||||
|
}
|
||||||
|
|
||||||
interface state {
|
interface state {
|
||||||
sideinfo: VideoTypes.startDataType
|
sideinfo: VideoTypes.startDataType
|
||||||
@ -50,6 +51,8 @@ export class HomePage extends React.Component<props, state> {
|
|||||||
// initial get of all videos
|
// initial get of all videos
|
||||||
this.fetchVideoData(DefaultTags.all.TagId);
|
this.fetchVideoData(DefaultTags.all.TagId);
|
||||||
this.fetchStartData();
|
this.fetchStartData();
|
||||||
|
|
||||||
|
console.log(this.props)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -100,7 +103,8 @@ export class HomePage extends React.Component<props, state> {
|
|||||||
onChange={(e): void => {
|
onChange={(e): void => {
|
||||||
this.keyword = e.target.value;
|
this.keyword = e.target.value;
|
||||||
}}/>
|
}}/>
|
||||||
<button data-testid='searchbtnsubmit' className='btn btn-success' type='submit'>Search</button>
|
<button data-testid='searchbtnsubmit' className='btn btn-success' type='submit'>Search
|
||||||
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</PageTitle>
|
</PageTitle>
|
||||||
<SideBar>
|
<SideBar>
|
||||||
@ -133,7 +137,19 @@ export class HomePage extends React.Component<props, state> {
|
|||||||
</SideBar>
|
</SideBar>
|
||||||
{this.state.data.length !== 0 ?
|
{this.state.data.length !== 0 ?
|
||||||
<VideoContainer
|
<VideoContainer
|
||||||
data={this.state.data}/> :
|
data={this.state.data}
|
||||||
|
onScrollPositionChange={(pos, loadedTiles): void => {
|
||||||
|
this.props.location.state = {pos: pos, loaded: loadedTiles};
|
||||||
|
|
||||||
|
console.log("history state update called...")
|
||||||
|
const {state} = this.props.location;
|
||||||
|
const stateCopy: { pos: number, loaded: number } = {...state as { pos: number, loaded: number }};
|
||||||
|
stateCopy.loaded = loadedTiles;
|
||||||
|
stateCopy.pos = pos;
|
||||||
|
this.props.history.replace({state: stateCopy});
|
||||||
|
console.log(this.props)
|
||||||
|
}}
|
||||||
|
initialScrollPosition={this.props.location.state !== null ? {scrollPos: (this.props.location.state as { pos: number, loaded: number }).pos, loadedTiles: (this.props.location.state as { pos: number, loaded: number }).loaded} : undefined}/> :
|
||||||
<div>No Data found!</div>}
|
<div>No Data found!</div>}
|
||||||
<div className={style.rightinfo}>
|
<div className={style.rightinfo}>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user