react-use#useWindowSize TypeScript Examples
The following examples show how to use
react-use#useWindowSize.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: ListViewport.tsx From flood with GNU General Public License v3.0 | 6 votes |
ListViewport = forwardRef<FixedSizeList, ListViewportProps>((props: ListViewportProps, ref) => {
const {className, itemCount, itemKey, itemRenderer, itemSize, outerRef} = props;
const {height: windowHeight} = useWindowSize();
return (
<FixedSizeList
className={`${className} ${ConfigStore.isPreferDark ? 'os-theme-light' : 'os-theme-dark'}`}
height={Math.max(itemSize * 30, windowHeight)}
itemCount={itemCount}
itemKey={itemKey}
itemSize={itemSize}
width="100%"
outerElementType={ConfigStore.isSmallScreen ? undefined : Overflow} // Don't use custom scrollbar on smaller screens
ref={ref}
overscanCount={30}
outerRef={outerRef}
>
{itemRenderer}
</FixedSizeList>
);
})
Example #2
Source File: screen.ts From oxen-website with GNU General Public License v3.0 | 6 votes |
export function useScreenSize() {
// Default to mobile view
const { width } = useWindowSize();
// Default to mobile view
const [isMobile, setIsMobile] = useState(true);
const [isTablet, setIsTablet] = useState(false);
const [isDesktop, setIsDesktop] = useState(false);
const [isHuge, setIsHuge] = useState(false);
useEffect(() => {
const _isMobile = width <= UI.MOBILE_BREAKPOINT;
const _isTablet =
width > UI.MOBILE_BREAKPOINT && width <= UI.TABLET_BREAKPOINT;
const _isDesktop = width > UI.TABLET_BREAKPOINT;
const _isHuge = width > UI.DESKTOP_BREAKPOINT;
if (isMobile !== _isMobile) setIsMobile(_isMobile);
if (isTablet !== _isTablet) setIsTablet(_isTablet);
if (isDesktop !== _isDesktop) setIsDesktop(_isDesktop);
if (isHuge !== _isHuge) setIsHuge(_isHuge);
}, [width]);
return { isMobile, isTablet, isDesktop, isHuge, width };
}
Example #3
Source File: collection.tsx From react-notion-x with MIT License | 4 votes |
CollectionViewBlock: React.FC<{
block: types.CollectionViewBlock | types.CollectionViewPageBlock
className?: string
}> = ({ block, className }) => {
const { recordMap, showCollectionViewDropdown } = useNotionContext()
const { view_ids: viewIds } = block
const collectionId = getBlockCollectionId(block, recordMap)
const [isMounted, setIsMounted] = React.useState(false)
React.useEffect(() => {
setIsMounted(true)
}, [])
const defaultCollectionViewId = viewIds[0]
const [collectionState, setCollectionState] = useLocalStorage(block.id, {
collectionViewId: defaultCollectionViewId
})
const collectionViewId =
(isMounted &&
viewIds.find((id) => id === collectionState.collectionViewId)) ||
defaultCollectionViewId
const onChangeView = React.useCallback(
(collectionViewId: string) => {
console.log('change collection view', collectionViewId)
setCollectionState({
...collectionState,
collectionViewId
})
},
[collectionState, setCollectionState]
)
let { width: windowWidth } = useWindowSize()
if (isServer) {
windowWidth = 1024
}
const collection = recordMap.collection[collectionId]?.value
const collectionView = recordMap.collection_view[collectionViewId]?.value
const collectionData =
recordMap.collection_query[collectionId]?.[collectionViewId]
const parentPage = getBlockParentPage(block, recordMap)
const { style, width, padding } = React.useMemo(() => {
const style: React.CSSProperties = {}
if (collectionView?.type !== 'table' && collectionView?.type !== 'board') {
return {
style,
width: 0,
padding: 0
}
}
const width = windowWidth
// TODO: customize for mobile?
const maxNotionBodyWidth = 708
let notionBodyWidth = maxNotionBodyWidth
if (parentPage?.format?.page_full_width) {
notionBodyWidth = (width - 2 * Math.min(96, width * 0.08)) | 0
} else {
notionBodyWidth =
width < maxNotionBodyWidth
? (width - width * 0.02) | 0 // 2vw
: maxNotionBodyWidth
}
const padding =
isServer && !isMounted ? 96 : ((width - notionBodyWidth) / 2) | 0
style.paddingLeft = padding
style.paddingRight = padding
return {
style,
width,
padding
}
}, [windowWidth, parentPage, collectionView?.type, isMounted])
// console.log({
// width,
// padding
// })
if (!(collection && collectionView && collectionData)) {
console.warn('skipping missing collection view for block', block.id, {
collectionId,
collectionViewId,
collectionView,
collectionData,
recordMap
})
return null
}
const title = getTextContent(collection.name).trim()
if (collection.icon) {
block.format = {
...block.format,
page_icon: collection.icon
}
}
return (
<div className={cs('notion-collection', className)}>
<div className='notion-collection-header' style={style}>
{title && (
<div className='notion-collection-header-title'>
<PageIcon
block={block}
className='notion-page-title-icon'
hideDefaultIcon
/>
{title}
</div>
)}
{viewIds.length > 1 && showCollectionViewDropdown && (
<CollectionViewDropdownMenu
collectionView={collectionView}
collectionViewId={collectionViewId}
viewIds={viewIds}
onChangeView={onChangeView}
/>
)}
</div>
<CollectionView
collection={collection}
collectionView={collectionView}
collectionData={collectionData}
padding={padding}
width={width}
/>
</div>
)
}
Example #4
Source File: HorizontalScrollable.tsx From oxen-website with GNU General Public License v3.0 | 4 votes |
function HorizontalScrollableInner(props: Props) {
const { onItemClick, children } = props;
const scrollRef = useRef(null);
const innerContentRef = useRef(null);
const { x } = useScroll(scrollRef);
const pageWidth = useWindowSize().width;
const scrollDistance = pageWidth > 1400 ? 450 : pageWidth / 3;
const [rightScrollHidden, setRightScrollHidden] = useState(false);
const { isDesktop } = useContext(ScreenContext);
const handleLeftScroll = () => {
scrollRef.current.scrollBy({
left: -scrollDistance,
behavior: 'smooth',
});
};
const handleRightScroll = () => {
scrollRef.current.scrollBy({
left: scrollDistance,
behavior: 'smooth',
});
};
function handleItemClick() {
if (onItemClick) {
onItemClick();
}
}
useEffect(() => {
const isFullRight =
scrollRef.current.scrollWidth - scrollRef.current.clientWidth ===
scrollRef.current.scrollLeft;
const tooSmallToScroll =
innerContentRef.current.clientWidth < scrollRef.current.clientWidth;
setRightScrollHidden(tooSmallToScroll || isFullRight);
}, [x, children]);
return (
<div className="relative flex w-full">
<div
className={classNames(
'absolute left-0 flex items-center justify-between h-full w-full',
!isDesktop && 'hidden',
)}
>
<div
className={classNames(
'flex flex-col justify-center h-full z-50 duration-300 -ml-8',
x <= 1 && 'opacity-0',
)}
>
<LeftOutlined
onClick={handleLeftScroll}
className={classNames('h-20 mt-1 cursor-pointer')}
/>
</div>
<div
className={classNames(
'flex flex-col justify-center h-full z-50 duration-300 -mr-8',
rightScrollHidden && 'opacity-0',
)}
>
<RightOutlined
onClick={handleRightScroll}
className="h-20 mt-1 cursor-pointer"
/>
</div>
</div>
<div
ref={scrollRef}
className={classNames(
'relative',
'w-full',
'hide_scroll',
'scrolling-touch hide-scroll',
isDesktop ? 'overflow-x-scroll' : 'overflow-x-scroll',
)}
>
<div
ref={innerContentRef}
className={classNames('flex space-x-8 overflow-y-visible')}
style={{
width: 'min-content',
marginLeft: `${!isDesktop ? UI.PAGE_CONTAINED_PADDING_VW : 0}vw`,
paddingRight: `${!isDesktop ? UI.PAGE_CONTAINED_PADDING_VW : 0}vw`,
}}
>
{children}
</div>
</div>
</div>
);
}