elements
lifecycle
browser
- useAudio
- useBattery
- useBluetooth
- useBreakpoints
- useBroadcastChannel
- useBrowserLocation
- useClipboard
- useCopy
- useCssVar
- useDisplayMedia
- useDocumentEvent
- useDocumentTitle
- useDocumentVisibility
- useEventListener
- useEventSource
- useEyeDropper
- useFavicon
- useFileSystemAccess
- useFps
- useFullscreen
- useGamepad
- useGeolocation
- useMeasure
- useMediaControls
- useMediaQuery
- useMemory
- useNetwork
- useObjectUrl
- useOnline
- useOtpCredential
- usePermission
- usePictureInPicture
- usePointerLock
- usePostMessage
- useRaf
- useShare
- useSpeechRecognition
- useSpeechSynthesis
- useSticky
utilities
state
user
sensors
Project name
Quarterly product roadmap
No changes yetimport { useLastChanged } from '@siberiacancode/reactuse';
import { FileTextIcon } from 'lucide-react';
import { useState } from 'react';
const formatTime = (timestamp: number) => {
const date = new Date(timestamp);
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${hours}:${minutes}:${seconds}`;
};
const Demo = () => {
const [title, setTitle] = useState('Quarterly product roadmap');
const lastChanged = useLastChanged(title);
return (
<section className='flex w-full max-w-md flex-col gap-2 p-4'>
<div className='text-muted-foreground flex items-center gap-1.5 text-[10px] tracking-wider uppercase'>
<FileTextIcon className='size-3' />
Project name
</div>
<div className='flex flex-col gap-1'>
<h1
contentEditable
suppressContentEditableWarning
className='text-foreground hover:bg-muted/30 focus:bg-muted/20 -mx-1 cursor-text rounded-md px-1 pb-1 text-2xl font-bold tracking-tight transition-colors outline-none'
onBlur={(event) => setTitle(event.currentTarget.textContent ?? '')}
onKeyDown={(event) => {
if (event.key === 'Enter') {
event.preventDefault();
event.currentTarget.blur();
}
}}
>
{title}
</h1>
<span className='text-muted-foreground font-mono text-[10px] tabular-nums'>
{lastChanged ? `Edited at ${formatTime(lastChanged)}` : 'No changes yet'}
</span>
</div>
</section>
);
};
export default Demo;
Installation
pnpm add @siberiacancode/reactuseUsage
const lastChanged = useLastChanged(source);Type Declarations
export interface UseLastChangedOptions {
initialValue?: number;
}API
Parameters
| Name | Type | Default | Note |
|---|---|---|---|
| source | any | - | The source of the last change |
| options.initialValue | number | null | null | The initial value |
Returns
number | nullContributors
ddebabinVVLADISLAW9
Last updated on