const copyArray = (array = []) => JSON.parse(JSON.stringify(array));
const [contacts, setContacts] = useState(copyArray(data));
const [contactsInput, setContactsInput] = useState(copyArray(data));
[...data] - это разворачивание массива. В данном случае оно бесполезно, потому что это массив не примитивов. Объекты копируются по ссылке, а не по значению.
Если бы в массиве были значения в виде примитивов, это бы сработало.
Я предложил самый простой способ, но вообще это не оптимально по производительности. Лучше делать это с помощью метода
cloneDeep из библиотеки lodash.