Browser API's turned into React Hooks and Suspense-friendly React elements for common situations.
npm i the-platform
Detect and retrieve current device Motion.
import { useDeviceMotion } from 'the-platform';
const Example = () => {
const { acceleration, rotationRate, interval } = useDeviceMotion();
// ...
};
Detect and retrieve current device orientation.
import { useDeviceOrientation } from 'the-platform';
const Example = () => {
const { alpha, beta, gamma, absolute } = useDeviceOrientation();
// ...
};
Retrieve Geo position from the browser. This will throw a promise (must use with Suspense).
import { useGeoPosition } from 'the-platform';
const Example = () => {
const {
coords: { latitude, longitude },
} = useGeoPosition();
// ...
};
Retrieve network status from the browser.
Object containing:
-
online: boolean
:true
if the browser has network access.false
otherwise. -
offlineAt?: Date
: Date when network connection was lost.
import { useNetworkStatus } from 'the-platform';
const Example = () => {
const { online, offlineAt } = useNetworkStatus();
// ...
};
query: string | object
: media query string or object (parsed by json2mq).
match: boolean
: true
if the media query matches, false
otherwise.
import { useMedia } from 'the-platform';
const Example = () => {
const small = useMedia('(min-width: 400px)');
const medium = useMedia({ minWidth: 800 });
// ...
};
This will throw a promise (must use with Suspense).
Object containing:
src: string
: The script's URI.
import { useScript } from 'the-platform';
const Example = () => {
const _unused = useScript({ src: 'bundle.js' });
// ...
};
This will throw a promise (must use with Suspense).
Object containing:
href: string
: The stylesheet's URI.media?: string
: Intended destination media for style information.
import { useStylesheet } from 'the-platform';
const Example = () => {
const _unused = useStylesheet({ href: 'normalize.css' });
// ...
};
Object containing:
x: number
: Horizontal scroll in pixels (window.pageXOffset
).y: number
: Vertical scroll in pixels (window.pageYOffset
).
import { useWindowScrollPosition } from 'the-platform';
const Example = () => {
const { x, y } = useWindowScrollPosition();
// ...
};
Object containing:
width
: Width of browser viewport (window.innerWidth
)height
: Height of browser viewport (window.innerHeight
)
import { useWindowSize } from 'the-platform';
const Example = () => {
const { width, height } = useWindowSize();
// ...
};
src: string
- anything else you can pass to an
<img>
tag
import React from 'react';
import { Img } from 'the-platform';
function App() {
return (
<div>
<h1>Hello</h1>
<React.Suspense maxDuration={300} fallback={'loading...'}>
<Img src="https://source.unsplash.com/random/4000x2000" />
</React.Suspense>
</div>
);
}
export default App;
src: string
children?: () => React.ReactNode
- This render prop will only execute after the script has loaded.- anything else you can pass to a
<script>
tag
import React from 'react';
import { Script } from 'the-platform';
function App() {
return (
<div>
<h1>Load Stripe.js Async</h1>
<React.Suspense maxDuration={300} fallback={'loading...'}>
<Script src="https://js.stripe.com/v3/" async>
{() => console.log(window.Stripe) || null}
</Script>
</React.Suspense>
</div>
);
}
export default App;
src: string
- anything else you can pass to a
<video>
tag
import React from 'react';
import { Video } from 'the-platform';
function App() {
return (
<div>
<h1>Ken Wheeler on a Scooter</h1>
<React.Suspense maxDuration={300} fallback={'loading...'}>
<Video
src="https://video.twimg.com/ext_tw_video/1029780437437014016/pu/vid/360x640/QLNTqYaYtkx9AbeH.mp4?tag=5"
preload="auto"
autoPlay
/>
</React.Suspense>
</div>
);
}
export default App;
src: string
- anything else you can pass to a
<audio>
tag
import React from 'react';
import { Audio } from 'the-platform';
function App() {
return (
<div>
<h1>Meavy Boy - Compassion</h1>
{/* source: http://freemusicarchive.org/music/Meavy_Boy/EP_71_to_20/Compassion */}
<React.Suspense maxDuration={300} fallback={'loading...'}>
<Audio src="https://file-dnzavydoqu.now.sh/" preload="auto" autoPlay />
</React.Suspense>
</div>
);
}
export default App;
Preload a resource with <link rel="preload">
. For more information check out MDN or the Google Developer Blog.
href: string
as: string
- resource type
import React from 'react';
import { Preload, Script } from 'the-platform';
function App() {
return (
<div>
<h1>Preload</h1>
<React.Suspense maxDuration={300} fallback={'loading...'}>
<Preload href="https://js.stripe.com/v3/" rel="preload" as="script" />
<Script src="https://js.stripe.com/v3/" async />
</React.Suspense>
</div>
);
}
export default App;
Lazy load a stylesheet.
href: string
import React from 'react';
import { Stylesheet } from 'the-platform';
function App() {
return (
<div>
<h1>Styles</h1>
<React.Suspense maxDuration={300} fallback={'loading...'}>
<Stylesheet href="style.css" />
</React.Suspense>
</div>
);
}
export default App;