import * as React from 'react';
import { FocusZone, FocusZoneDirection } from '@fluentui/react/lib/FocusZone';
import { DefaultButton } from '@fluentui/react/lib/Button';
import { Dropdown, IDropdownOption } from '@fluentui/react/lib/Dropdown';
import { List, ScrollToMode, IList } from '@fluentui/react/lib/List';
import { TextField } from '@fluentui/react/lib/TextField';
import { createListItems, IExampleItem } from '@fluentui/example-data';
import { mergeStyleSets, getTheme, normalize } from '@fluentui/react/lib/Styling';
import { useConst } from '@fluentui/react-hooks';
const evenItemHeight = 25;
const oddItemHeight = 50;
const numberOfItemsOnPage = 10;
const theme = getTheme();
const dropdownOptions = [
{ key: 'auto', text: 'Auto' },
{ key: 'top', text: 'Top' },
{ key: 'bottom', text: 'Bottom' },
{ key: 'center', text: 'Center' },
];
const styles = mergeStyleSets({
container: {
overflow: 'auto',
maxHeight: 400,
border: '1px solid #CCC',
marginTop: 20,
selectors: {
'.ms-List-cell:nth-child(odd)': {
height: 50,
lineHeight: 50,
background: theme.palette.neutralLighter,
},
'.ms-List-cell:nth-child(even)': {
height: 25,
lineHeight: 25,
},
},
},
itemContent: [
theme.fonts.medium,
normalize,
{
position: 'relative',
boxSizing: 'border-box',
display: 'block',
borderLeft: '3px solid ' + theme.palette.themePrimary,
paddingLeft: 27,
},
],
});
const onRenderCell = (item: IExampleItem, index: number): JSX.Element => {
return (
);
};
export const ListScrollingExample: React.FunctionComponent = () => {
const items = useConst(() => createListItems(5000));
const [selectedIndex, setSelectedIndex] = React.useState(0);
const [scrollToMode, setScrollToMode] = React.useState(ScrollToMode.auto);
const listRef: React.RefObject = React.useRef(null);
const scroll = (index: number, propScrollToMode: ScrollToMode): void => {
const updatedSelectedIndex = Math.min(Math.max(index, 0), items.length - 1);
setSelectedIndex(updatedSelectedIndex);
setScrollToMode(propScrollToMode);
listRef.current?.scrollToIndex(
updatedSelectedIndex,
idx => (idx % 2 === 0 ? evenItemHeight : oddItemHeight),
scrollToMode,
);
};
const getPageHeight = (idx: number): number => {
let h = 0;
for (let i = idx; i < idx + numberOfItemsOnPage; ++i) {
const isEvenRow = i % 2 === 0;
h += isEvenRow ? evenItemHeight : oddItemHeight;
}
return h;
};
const scrollRelative = (delta: number): (() => void) => {
return (): void => {
scroll(selectedIndex + delta, scrollToMode);
};
};
const onChangeText = (ev: React.FormEvent, value: string): void => {
scroll(parseInt(value, 10) || 0, scrollToMode);
};
const onDropdownChange = (event: React.FormEvent, option: IDropdownOption) => {
let scrollMode = scrollToMode;
switch (option.key) {
case 'auto':
scrollMode = ScrollToMode.auto;
break;
case 'top':
scrollMode = ScrollToMode.top;
break;
case 'bottom':
scrollMode = ScrollToMode.bottom;
break;
case 'center':
scrollMode = ScrollToMode.center;
break;
}
scroll(selectedIndex, scrollMode);
};
return (
-10
-1
+1
+10
Scroll item index:
);
};