import * as React from 'react';
import { createListItems, IExampleItem } from '@fluentui/example-data';
import { IColumn, buildColumns, SelectionMode, Toggle, IListProps } from '@fluentui/react/lib/index';
import { ShimmeredDetailsList } from '@fluentui/react/lib/ShimmeredDetailsList';
import { useSetInterval, useConst } from '@fluentui/react-hooks';
interface IShimmerApplicationExampleState {
lastIntervalId: number;
visibleCount: number;
}
const ITEMS_COUNT: number = 200;
const INTERVAL_DELAY: number = 1200;
const toggleStyle: React.CSSProperties = {
marginBottom: '20px',
};
const shimmeredDetailsListProps: IListProps = {
renderedWindowsAhead: 0,
renderedWindowsBehind: 0,
};
const fileIcons: { name: string }[] = [
{ name: 'accdb' },
{ name: 'audio' },
{ name: 'code' },
{ name: 'csv' },
{ name: 'docx' },
{ name: 'dotx' },
{ name: 'mpt' },
{ name: 'model' },
{ name: 'one' },
{ name: 'onetoc' },
{ name: 'pdf' },
{ name: 'photo' },
{ name: 'pptx' },
{ name: 'presentation' },
{ name: 'potx' },
{ name: 'pub' },
{ name: 'rtf' },
{ name: 'spreadsheet' },
{ name: 'txt' },
{ name: 'vector' },
{ name: 'vsdx' },
{ name: 'xlsx' },
{ name: 'xltx' },
{ name: 'xsn' },
];
const randomFileIcon = (): { docType: string; url: string } => {
const docType: string = fileIcons[Math.floor(Math.random() * fileIcons.length) + 0].name;
return {
docType,
url: `https://static2.sharepointonline.com/files/fabric/assets/item-types/16/${docType}.svg`,
};
};
const onRenderItemColumn = (item: IExampleItem, index: number, column: IColumn): JSX.Element | string | number => {
if (column.key === 'thumbnail') {
return
;
}
return item[column.key as keyof IExampleItem];
};
const exampleItems: IExampleItem[] = createListItems(ITEMS_COUNT).map((item: IExampleItem) => {
const randomFileType = randomFileIcon();
return { ...item, thumbnail: randomFileType.url };
});
export const ShimmerApplicationExample: React.FunctionComponent = () => {
const { current: state } = React.useRef({
lastIntervalId: 0,
visibleCount: 0,
});
const [items, setItems] = React.useState<(IExampleItem | null)[] | undefined>(undefined);
const shimmerColumns: IColumn[] = useConst(() => {
const currentItems = createListItems(1);
const columns: IColumn[] = buildColumns(currentItems);
for (const column of columns) {
if (column.key === 'thumbnail') {
column.name = 'FileType';
column.minWidth = 16;
column.maxWidth = 16;
column.isIconOnly = true;
column.iconName = 'Page';
break;
}
}
return columns;
});
const { setInterval, clearInterval } = useSetInterval();
const onLoadData = React.useCallback(
(ev: React.MouseEvent, checked: boolean): void => {
const loadMoreItems = (): void => {
state.visibleCount = Math.min(exampleItems.length, state.visibleCount + 2);
setItems(exampleItems.map((current, index) => (index < state.visibleCount ? current : null)) as IExampleItem[]);
};
state.visibleCount = 0;
if (checked) {
loadMoreItems();
state.lastIntervalId = setInterval(loadMoreItems, INTERVAL_DELAY);
} else {
setItems(undefined);
clearInterval(state.lastIntervalId);
}
},
[clearInterval, setInterval, state],
);
return (
<>
>
);
};