a9aff5a120
* Enhance booking template functionality and add sandbox extraction checks * Implement Recapt integration for feedback submission and user identification * Add Recapt identification component and bank sync status chip; update crontab entries * Update .gitignore to ignore the entire scripts directory * Refactor Recapt integration: add loader component, update privacy policy, and enhance bank sync status messages * Fix .gitignore to correctly ignore the scripts directory
39 lines
877 B
TypeScript
39 lines
877 B
TypeScript
'use client'
|
|
|
|
import { useEffect } from 'react'
|
|
|
|
/**
|
|
* Hides Recapt's floating feedback bubble while keeping the SDK active so
|
|
* `window.recapt('identify', ...)` and programmatic `window.recapt('feedback',
|
|
* { message })` calls continue to work. Mounted globally in the root layout.
|
|
*/
|
|
export function RecaptHideWidget() {
|
|
useEffect(() => {
|
|
let attempts = 0
|
|
const maxAttempts = 50
|
|
|
|
const hide = (): boolean => {
|
|
if (typeof window.recapt !== 'function') return false
|
|
try {
|
|
window.recapt('feedback', { widget: 'hide' })
|
|
} catch {
|
|
// best-effort
|
|
}
|
|
return true
|
|
}
|
|
|
|
if (hide()) return
|
|
|
|
const interval = setInterval(() => {
|
|
attempts++
|
|
if (hide() || attempts >= maxAttempts) {
|
|
clearInterval(interval)
|
|
}
|
|
}, 100)
|
|
|
|
return () => clearInterval(interval)
|
|
}, [])
|
|
|
|
return null
|
|
}
|