@@ -4,11 +4,72 @@ import relativeTime from 'dayjs/plugin/relativeTime';
44import { api } from '@/services/api' ;
55import { getToken } from '@/services/request' ;
66import 'dayjs/locale/zh-cn' ;
7- import { useMemo } from 'react' ;
7+ import { useEffect , useMemo , useState } from 'react' ;
88
99dayjs . locale ( 'zh-cn' ) ;
1010dayjs . extend ( relativeTime ) ;
1111
12+ const getCooldownRemainingSeconds = (
13+ storageKey : string ,
14+ durationMs : number ,
15+ ) => {
16+ const storedSentAt = window . localStorage . getItem ( storageKey ) ;
17+ const sentAt = Number ( storedSentAt ) ;
18+
19+ if ( ! Number . isFinite ( sentAt ) || sentAt <= 0 ) {
20+ return 0 ;
21+ }
22+
23+ const remainingMs = durationMs - ( Date . now ( ) - sentAt ) ;
24+ if ( remainingMs <= 0 ) {
25+ window . localStorage . removeItem ( storageKey ) ;
26+ return 0 ;
27+ }
28+
29+ return Math . ceil ( remainingMs / 1000 ) ;
30+ } ;
31+
32+ export const useLocalStorageCooldown = ( {
33+ storageKey,
34+ durationMs,
35+ } : {
36+ storageKey : string ;
37+ durationMs : number ;
38+ } ) => {
39+ const [ remainingSeconds , setRemainingSeconds ] = useState ( 0 ) ;
40+
41+ useEffect ( ( ) => {
42+ const syncRemainingSeconds = ( ) => {
43+ setRemainingSeconds ( getCooldownRemainingSeconds ( storageKey , durationMs ) ) ;
44+ } ;
45+
46+ syncRemainingSeconds ( ) ;
47+ const timer = window . setInterval ( syncRemainingSeconds , 1000 ) ;
48+ const handleStorage = ( event : StorageEvent ) => {
49+ if ( event . key === storageKey ) {
50+ syncRemainingSeconds ( ) ;
51+ }
52+ } ;
53+
54+ window . addEventListener ( 'storage' , handleStorage ) ;
55+ return ( ) => {
56+ window . clearInterval ( timer ) ;
57+ window . removeEventListener ( 'storage' , handleStorage ) ;
58+ } ;
59+ } , [ storageKey , durationMs ] ) ;
60+
61+ const startCooldown = ( ) => {
62+ window . localStorage . setItem ( storageKey , String ( Date . now ( ) ) ) ;
63+ setRemainingSeconds ( Math . ceil ( durationMs / 1000 ) ) ;
64+ } ;
65+
66+ return {
67+ isCoolingDown : remainingSeconds > 0 ,
68+ remainingSeconds,
69+ startCooldown,
70+ } ;
71+ } ;
72+
1273export const useUserInfo = ( ) => {
1374 const { data } = useQuery ( {
1475 queryKey : [ 'userInfo' ] ,
0 commit comments