1- import { useEffect , useState } from "react" ;
1+ import { useEffect , useState , useRef } from "react" ;
22import { AppState , Platform } from "react-native" ;
33import { clipboard } from "../utils/clipboard" ;
44
55export const useClipboard = ( ) => {
66 const [ clipboardContent , setClipboardContent ] = useState < string > ( "" ) ;
77 const [ hasCopiedText , setHasCopiedText ] = useState ( false ) ;
88 const [ history , setHistory ] = useState < string [ ] > ( [ ] ) ;
9- const [ previousContent , setPreviousContent ] = useState < string > ( "" ) ;
9+ const previousContentRef = useRef < string > ( "" ) ;
10+ const isMounted = useRef ( true ) ;
1011
1112 const checkClipboard = async ( ) => {
1213 try {
1314 const content = await clipboard . getString ( ) ;
14- if ( content !== previousContent ) {
15- setPreviousContent ( content ) ;
15+ if ( content !== previousContentRef . current ) {
16+ previousContentRef . current = content ;
1617 setClipboardContent ( content ) ;
1718 setHasCopiedText ( content . length > 0 ) ;
1819 addToHistory ( content ) ;
@@ -24,66 +25,60 @@ export const useClipboard = () => {
2425
2526 const addToHistory = ( content : string ) => {
2627 if ( content . trim ( ) && content !== history [ 0 ] ) {
27- setHistory ( ( prev ) => [ content , ...prev . slice ( 0 , 49 ) ] ) ; // Keep last 50 items
28+ setHistory ( ( prev ) => [ content , ...prev . slice ( 0 , 49 ) ] ) ;
2829 }
2930 } ;
3031
31- // useEffect(() => {
32- // const initialLoad = async () => {
33- // const content = await clipboard.getString();
34- // setClipboardContent(content);
35- // setHasCopiedText(content.length > 0);
36- // addToHistory(content);
37- // };
38- // initialLoad();
39-
40- // const subscription = clipboard.addListener((content) => {
41- // setClipboardContent(content);
42- // setHasCopiedText(content.length > 0);
43- // addToHistory(content);
44- // });
45-
46- // return () => {
47- // clipboard.removeListener(subscription);
48- // };
49- // }, []);
50-
5132 useEffect ( ( ) => {
52- let intervalId : NodeJS . Timeout ;
53- const subscription = AppState . addEventListener ( "change" , ( nextAppState ) => {
54- if ( nextAppState === "active" ) {
33+ isMounted . current = true ;
34+
35+ const handleAppStateChange = ( nextAppState : string ) => {
36+ if ( nextAppState === "active" && isMounted . current ) {
5537 checkClipboard ( ) ;
5638 }
57- } ) ;
39+ } ;
40+
41+ const subscription = AppState . addEventListener (
42+ "change" ,
43+ handleAppStateChange
44+ ) ;
5845
5946 // Initial check
6047 checkClipboard ( ) ;
6148
49+ let intervalId : NodeJS . Timeout | null = null ;
50+ let listener : any ;
6251 if ( Platform . OS === "ios" ) {
63- // Poll clipboard every 1.5 seconds for iOS
6452 intervalId = setInterval ( checkClipboard , 1500 ) ;
6553 } else {
66- // Android listener
67- const listenerSubscription = clipboard . addListener ( ( content ) => {
68- setClipboardContent ( content ) ;
69- setHasCopiedText ( content . length > 0 ) ;
70- addToHistory ( content ) ;
54+ listener = clipboard . addListener ( ( content : string ) => {
55+ if ( isMounted . current ) {
56+ previousContentRef . current = content ;
57+ setClipboardContent ( content ) ;
58+ setHasCopiedText ( content . length > 0 ) ;
59+ addToHistory ( content ) ;
60+ }
7161 } ) ;
72-
73- return ( ) => {
74- clipboard . removeListener ( listenerSubscription ) ;
75- } ;
7662 }
7763
7864 return ( ) => {
79- clearInterval ( intervalId ) ;
65+ isMounted . current = false ;
8066 subscription . remove ( ) ;
67+ if ( intervalId ) clearInterval ( intervalId ) ;
68+ if ( Platform . OS === "android" ) {
69+ clipboard . removeListener ( listener ) ;
70+ }
8171 } ;
82- } , [ previousContent ] ) ;
72+ } , [ ] ) ;
8373
8474 const copyToClipboard = async ( text : string ) => {
8575 await clipboard . copy ( text ) ;
86- addToHistory ( text ) ;
76+ if ( isMounted . current ) {
77+ previousContentRef . current = text ;
78+ setClipboardContent ( text ) ;
79+ setHasCopiedText ( true ) ;
80+ addToHistory ( text ) ;
81+ }
8782 } ;
8883
8984 const getLatestClipboard = async ( ) => {
@@ -92,8 +87,11 @@ export const useClipboard = () => {
9287
9388 const clearClipboard = async ( ) => {
9489 await clipboard . clear ( ) ;
95- setClipboardContent ( "" ) ;
96- setHasCopiedText ( false ) ;
90+ if ( isMounted . current ) {
91+ previousContentRef . current = "" ;
92+ setClipboardContent ( "" ) ;
93+ setHasCopiedText ( false ) ;
94+ }
9795 } ;
9896
9997 return {
0 commit comments