{
  "version": 3,
  "sources": ["../../../src/components/sync-connection-error-modal/use-retry-countdown.ts"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport type { ConnectionStatus } from '@wordpress/core-data';\nimport { useState, useEffect, useRef } from '@wordpress/element';\n\ninterface UseRetryCountdownResult {\n\tonManualRetry: () => void;\n\tsecondsRemaining?: number;\n}\n\nexport function useRetryCountdown(\n\tconnectionStatus?: ConnectionStatus | null\n): UseRetryCountdownResult {\n\tconst [ secondsRemaining, setSecondsRemaining ] = useState< number >();\n\tconst hasRetriedRef = useRef( false );\n\n\tuseEffect( () => {\n\t\tif ( ! connectionStatus ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Only clear countdown when explicitly connected.\n\t\tif ( 'connected' === connectionStatus.status ) {\n\t\t\tsetSecondsRemaining( undefined );\n\t\t\thasRetriedRef.current = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// For transient states (e.g. 'connecting' during a retry attempt)\n\t\t// or when retryInMs is not yet available, keep the previous\n\t\t// countdown value to avoid a brief flash.\n\t\tif (\n\t\t\t'disconnected' !== connectionStatus.status ||\n\t\t\t! connectionStatus.willAutoRetryInMs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { willAutoRetryInMs: retryInMs } = connectionStatus;\n\t\tconst retryAt = Date.now() + retryInMs;\n\n\t\t// After a retry attempt (manual or automatic), show \"Retrying...\"\n\t\t// for 500ms before starting the next countdown. Skip the delay on\n\t\t// the very first disconnect so the countdown starts immediately.\n\t\tconst hasRetried = hasRetriedRef.current;\n\t\thasRetriedRef.current = true;\n\n\t\tif ( hasRetried ) {\n\t\t\tsetSecondsRemaining( 0 );\n\t\t}\n\n\t\tlet countdownIntervalId: ReturnType< typeof setInterval > | null = null;\n\n\t\tconst startCountdown = () => {\n\t\t\tsetSecondsRemaining( Math.ceil( ( retryAt - Date.now() ) / 1000 ) );\n\n\t\t\tcountdownIntervalId = setInterval( () => {\n\t\t\t\tconst remaining = Math.ceil( ( retryAt - Date.now() ) / 1000 );\n\t\t\t\tsetSecondsRemaining( Math.max( 0, remaining ) );\n\n\t\t\t\tif ( remaining <= 0 && countdownIntervalId ) {\n\t\t\t\t\tclearInterval( countdownIntervalId );\n\t\t\t\t}\n\t\t\t}, 1000 );\n\t\t};\n\n\t\tconst retryingDelayId = hasRetried\n\t\t\t? setTimeout( startCountdown, 500 )\n\t\t\t: null;\n\n\t\tif ( ! retryingDelayId ) {\n\t\t\tstartCountdown();\n\t\t}\n\n\t\treturn () => {\n\t\t\tif ( retryingDelayId ) {\n\t\t\t\tclearTimeout( retryingDelayId );\n\t\t\t}\n\n\t\t\tif ( countdownIntervalId ) {\n\t\t\t\tclearInterval( countdownIntervalId );\n\t\t\t}\n\t\t};\n\t}, [ connectionStatus ] );\n\n\treturn {\n\t\tonManualRetry: () => {\n\t\t\tsetSecondsRemaining( 0 );\n\t\t},\n\t\tsecondsRemaining,\n\t};\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,qBAA4C;AAOrC,SAAS,kBACf,kBAC0B;AAC1B,QAAM,CAAE,kBAAkB,mBAAoB,QAAI,yBAAmB;AACrE,QAAM,oBAAgB,uBAAQ,KAAM;AAEpC,gCAAW,MAAM;AAChB,QAAK,CAAE,kBAAmB;AACzB;AAAA,IACD;AAGA,QAAK,gBAAgB,iBAAiB,QAAS;AAC9C,0BAAqB,MAAU;AAC/B,oBAAc,UAAU;AACxB;AAAA,IACD;AAKA,QACC,mBAAmB,iBAAiB,UACpC,CAAE,iBAAiB,mBAClB;AACD;AAAA,IACD;AAEA,UAAM,EAAE,mBAAmB,UAAU,IAAI;AACzC,UAAM,UAAU,KAAK,IAAI,IAAI;AAK7B,UAAM,aAAa,cAAc;AACjC,kBAAc,UAAU;AAExB,QAAK,YAAa;AACjB,0BAAqB,CAAE;AAAA,IACxB;AAEA,QAAI,sBAA+D;AAEnE,UAAM,iBAAiB,MAAM;AAC5B,0BAAqB,KAAK,MAAQ,UAAU,KAAK,IAAI,KAAM,GAAK,CAAE;AAElE,4BAAsB,YAAa,MAAM;AACxC,cAAM,YAAY,KAAK,MAAQ,UAAU,KAAK,IAAI,KAAM,GAAK;AAC7D,4BAAqB,KAAK,IAAK,GAAG,SAAU,CAAE;AAE9C,YAAK,aAAa,KAAK,qBAAsB;AAC5C,wBAAe,mBAAoB;AAAA,QACpC;AAAA,MACD,GAAG,GAAK;AAAA,IACT;AAEA,UAAM,kBAAkB,aACrB,WAAY,gBAAgB,GAAI,IAChC;AAEH,QAAK,CAAE,iBAAkB;AACxB,qBAAe;AAAA,IAChB;AAEA,WAAO,MAAM;AACZ,UAAK,iBAAkB;AACtB,qBAAc,eAAgB;AAAA,MAC/B;AAEA,UAAK,qBAAsB;AAC1B,sBAAe,mBAAoB;AAAA,MACpC;AAAA,IACD;AAAA,EACD,GAAG,CAAE,gBAAiB,CAAE;AAExB,SAAO;AAAA,IACN,eAAe,MAAM;AACpB,0BAAqB,CAAE;AAAA,IACxB;AAAA,IACA;AAAA,EACD;AACD;",
  "names": []
}
