Skip to content

Broken link checker service#336

Merged
Tamir198 merged 26 commits intoDeadlink-Hunter:mainfrom
michal-bakshi:broken-link-checker-service
Mar 17, 2026
Merged

Broken link checker service#336
Tamir198 merged 26 commits intoDeadlink-Hunter:mainfrom
michal-bakshi:broken-link-checker-service

Conversation

@michal-bakshi
Copy link
Copy Markdown
Contributor

@michal-bakshi michal-bakshi commented Mar 11, 2026

Changes

Scanner.page.tsx - Added results, loading, and error state — wired to ScanLinksCard and ScanResultsCard.

ScanLinksCard - Connected to LinkChecker API. Validates input, calls single/multi URL endpoints, and reports loading/error/results via callbacks.

ScanResultsCard - Handles all render states: loading, error, empty, single result, and multiple results — with icons and summaries.

scan.utils.ts (new) - Added helpers: resolveScanResults, sumResponseTimes, and type guards for single vs multi results.

types/scan.ts - Added ScanSummary, ResolvedKind, AsyncCallbacks, and related types.

styles.ts - Added styles for error state, URL rows, status icons, and results layout.

Testing

Tested manually against local Broken Link Checker server:

  • Single URL — working link ✓
  • Single URL — broken link ✓
  • Multiple URLs — mixed results ✓
Screenshot 2026-03-12 011641

Close #320

Summary by CodeRabbit

  • New Features

    • Scanner shows a "Scanning..." loading state, per-request response times, total scan duration, and a summary ("X working, Y broken out of Z").
    • Improved results layout for single and multiple URL scans with clearer loading, error, and empty views.
    • New user-facing error messages for missing/invalid URLs and maximum-URLs limits; localization keys added.
  • Bug Fixes

    • More consistent handling and display of scan errors and empty results.

@github-actions
Copy link
Copy Markdown

👋 Thanks for opening this Pull Request! 🎉

We'll review it as soon as possible.

Before we proceed, please double check:

  • The PR title & description clearly explain the changes.
  • All checks/tests pass.
  • You've linked it to an issue (if applicable).

Happy contributing! 🚀

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 11, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a React Query–backed scanning feature: new mutation hook, result normalization and error-translation utilities, expanded types, UI wiring for scan submission and results (loading/error/empty/single/multiple), styles, localization keys, and QueryClientProvider integration.

Changes

Cohort / File(s) Summary
Localization
public/locals/en.json
Added scan_results_card keys: loading, response_time, total_response_time, summary, and errors messages.
Scanner page & wiring
src/pages/Scanner/Scanner.page.tsx
Integrated useScanMutation; added handleScan/reset logic; passed mutation state to ScanResultsCard.
Scan submission UI
src/pages/Scanner/components/ScanLinksCard.tsx
Added onScan prop and wired submitScanRequest to call onScan({ scanType, url, multipleUrl }).
Scan results UI
src/pages/Scanner/components/ScanResultsCard.tsx
Rewrote as prop-driven component accepting { results, loading, error }; added loading/error/empty/SINGLE/MULTIPLE branches, internal CardShell and UrlResultRow, and summary/total response-time rendering.
Styles
src/pages/Scanner/components/styles.ts
Added styles: errorIcon, errorText, urlRowContainer, statusIcon(isBroken), resultsColumn, resultsListContainer.
Types: scanner
src/pages/Scanner/types/scan.ts
Added ResolvedKind, ScanResult union, ScanSummary, SingleResultData, MultipleResultData, ResolvedScanResults, ScanMutationVariables; updated ScanLinkCardProps and added ScanResultsCardProps.
Types: service
src/services/LinkChecker/types.ts
Introduced UrlCheckData and updated UrlCheckResult.data and MultipleUrlsResponse.data.results to use it.
Mutation hook
src/pages/Scanner/useScanMutation.ts
New React Query mutation useScanMutation implementing single/multiple flows, input validation, error propagation; exports data/loading/error/mutate/reset.
Utilities
src/pages/Scanner/utils/scan.ts, src/pages/Scanner/utils/errorTranslations.ts
Added resolveScanResults(result) and sumResponseTimes(items) to normalize and aggregate results; added error-to-translation-key mapping with optional params.
App infra
package.json, src/App.tsx
Added @tanstack/react-query dependency and wrapped the app with QueryClientProvider.

Sequence Diagram

sequenceDiagram
    participant User as User
    participant LinksCard as ScanLinksCard
    participant Page as ScannerPage
    participant Mutation as useScanMutation
    participant Service as LinkCheckerService
    participant API as BrokenLinkCheckerAPI
    participant ResultsCard as ScanResultsCard

    User->>LinksCard: fill form & submit
    LinksCard->>Page: onScan({scanType, url, multipleUrl})
    Page->>Mutation: reset()
    Page->>Mutation: mutate(variables)
    Mutation->>Mutation: runScan (single or multiple)
    Mutation->>Service: checkLink / checkLinks
    Service->>API: HTTP request
    API-->>Service: response (single or batch)
    Service-->>Mutation: formatted result
    Mutation-->>Page: update data / error / loading
    Page->>ResultsCard: props { results, loading, error }
    ResultsCard->>User: render loading / error / empty / single / multiple summary
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 I hopped through hooks and types today,
I stitched the scans that chase bugs away,
Rows and totals, errors shown bright,
From form to API — a speedy flight,
Carrot cheers for the scanner's light! 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Broken link checker service' directly matches the primary objective of adding a service to call the Broken-Link-Checker backend API for checking single and multiple links.
Linked Issues check ✅ Passed All coding requirements from issue #320 are met: service implementation uses the LinkChecker API, supports single/multi-link checks, uses correct backend port, integrates with existing api service, and includes proper type definitions and error handling.
Out of Scope Changes check ✅ Passed All changes are directly aligned with the objective of implementing a broken link checker service. The PR includes service layer, UI integration, types, utilities, styling, localization, state management setup, and dependencies—all required for a complete feature implementation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
📝 Coding Plan
  • Generate coding plan for human review comments

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

You can validate your CodeRabbit configuration file in your editor.

If your editor has YAML language server, you can enable auto-completion and validation by adding # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json at the top of your CodeRabbit configuration file.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/pages/Scanner/components/ScanLinksCard.tsx`:
- Around line 74-84: getMultipleUrlsCall currently only parses multipleUrl and
ignores the repository `url` from RepositoryScanForm, causing valid
repository-only submissions to trigger ApiErrorTypes.ONE_URL_REQUIRED; update
getMultipleUrlsCall to include the `url` value when present (e.g., if `url` is
non-empty add it to the parsed `urls` array before validation), then run the
existing length checks (urls.length === 0 and > MAX_URLS_PER_REQUEST) and
finally return the call to linkCheckerService.checkLinks(urls); ensure you
reference the same symbols: multipleUrl, url, parseMultipleUrls,
getMultipleUrlsCall, MAX_URLS_PER_REQUEST, ApiErrorTypes, and
linkCheckerService.checkLinks.

In `@src/pages/Scanner/components/ScanResultsCard.tsx`:
- Around line 39-47: UrlResultRow currently only shows status via icons, so
update the component to expose the result status to assistive tech by adding an
accessible status label tied to the row (use the UrlResultRow props
url/isBroken). For example, add a screen-reader-only text node or an aria-label
on the container div (or set role="status") that includes the url and a short
status string like "working" or "broken" derived from isBroken, ensuring the
label is updated per row; keep the visual layout and existing style helpers
(scanPageStyle.statusIcon, scanPageStyle.resultDescription) unchanged.

In `@src/pages/Scanner/types/scan.ts`:
- Around line 38-41: The onError callback in the AsyncCallbacks interface
currently accepts raw string messages which forces UI components (e.g.,
ScanLinksCard, ScanResultsCard) to pass and render English text; change the
contract to use a stable error-code enum (e.g., ApiErrorTypes) or a typed
ErrorCode field instead of string, update AsyncCallbacks.onError signature to
onError: (error: ApiErrorTypes | null) => void (or a small ErrorPayload { code:
ApiErrorTypes; message?: string }), then update callers like ScanLinksCard to
pass the enum value and consumers like ScanResultsCard to map that enum to
localized display text via the i18n/localization layer rather than rendering the
raw message. Ensure ScanResult-related places that used onError (and the
AsyncCallbacks definition at lines ~54-57) follow the same change so all code
paths use error codes not raw strings.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5b0c8057-89b3-421b-9e87-9e7ecd3dfc9a

📥 Commits

Reviewing files that changed from the base of the PR and between 20820a2 and f4bb61b.

📒 Files selected for processing (8)
  • public/locals/en.json
  • src/pages/Scanner/Scanner.page.tsx
  • src/pages/Scanner/components/ScanLinksCard.tsx
  • src/pages/Scanner/components/ScanResultsCard.tsx
  • src/pages/Scanner/components/styles.ts
  • src/pages/Scanner/scan.utils.ts
  • src/pages/Scanner/types/scan.ts
  • src/services/LinkChecker/types.ts

Comment thread src/pages/Scanner/components/ScanLinksCard.tsx Outdated
Comment thread src/pages/Scanner/components/ScanResultsCard.tsx Outdated
Comment thread src/pages/Scanner/types/scan.ts Outdated
Copy link
Copy Markdown
Contributor

@YusufErdemK YusufErdemK left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clean integration overall — the callback-based state flow (onLoading / onError / onResults) keeps the components nicely decoupled.
One thing worth noting: onError takes a raw string | null, which means error messages from ScanLinksCard end up going straight into the UI. If you ever add i18n support for error states, you'll need to trace all the callers. Might be worth using ApiErrorTypes as the error type now and mapping to display text in ScanResultsCard — easier to change later.
Also noticed getMultipleUrlsCall doesn't seem to account for the url field from RepositoryScanForm, so a repo-only submission would hit ONE_URL_REQUIRED. Might be worth double-checking that path.

Copy link
Copy Markdown
Member

@Tamir198 Tamir198 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some comments as a initial review

Comment thread src/pages/Scanner/components/ScanLinksCard.tsx Outdated
Comment thread src/pages/Scanner/components/ScanLinksCard.tsx Outdated
Comment thread src/pages/Scanner/components/ScanResultsCard.tsx Outdated
Comment thread src/pages/Scanner/components/ScanResultsCard.tsx Outdated
Comment thread src/pages/Scanner/components/ScanResultsCard.tsx Outdated
Comment thread src/pages/Scanner/components/styles.ts Outdated
Comment thread src/pages/Scanner/types/scan.ts Outdated
Comment thread src/pages/Scanner/scan.utils.ts Outdated
Comment thread src/pages/Scanner/scan.utils.ts Outdated
Comment thread src/services/LinkChecker/types.ts Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/pages/Scanner/components/ScanResultsCard.tsx (1)

40-49: ⚠️ Potential issue | 🟠 Major

Add accessible status announcement to UrlResultRow.

The working/broken status is conveyed only through icons. Screen readers won't announce the outcome. This was flagged in a previous review.

♿ Suggested fix for accessibility
-const UrlResultRow = ({ url, isBroken }: UrlResultRowProps) => (
-  <div style={scanPageStyle.urlRowContainer}>
-    {isBroken ? (
-      <IconX style={scanPageStyle.statusIcon(isBroken)} />
-    ) : (
-      <IconCheck style={scanPageStyle.statusIcon(isBroken)} />
-    )}
+const UrlResultRow = ({ url, isBroken }: UrlResultRowProps) => (
+  <div
+    style={scanPageStyle.urlRowContainer}
+    aria-label={`${url}: ${isBroken ? 'broken' : 'working'}`}
+  >
+    {isBroken ? (
+      <IconX style={scanPageStyle.statusIcon(isBroken)} aria-hidden />
+    ) : (
+      <IconCheck style={scanPageStyle.statusIcon(isBroken)} aria-hidden />
+    )}
     <span style={scanPageStyle.resultDescription}>{url}</span>
   </div>
 );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Scanner/components/ScanResultsCard.tsx` around lines 40 - 49,
UrlResultRow currently conveys status only via icons; add an accessible textual
status that screen readers can announce by inserting a visually-hidden/aria-live
text node alongside the icon that reflects isBroken (e.g., "Broken" vs
"Working"), or set a role="status" and aria-atomic on the container so screen
readers announce changes; update the UrlResultRow component (props: url,
isBroken) to render that hidden status text next to the IconX/IconCheck and
ensure scanPageStyle or a CSS sr-only class is used to visually hide the text
but keep it accessible.
🧹 Nitpick comments (1)
src/pages/Scanner/components/ScanResultsCard.tsx (1)

65-72: Localize the error message.

The error prop (typed as ApiErrorTypes) is rendered directly as text. Map the enum to a translated string for proper i18n support.

🌐 Suggested fix
   if (error) {
     return (
       <CardShell title={TITLE_KEY} contentStyle={scanPageStyle.resultsStack}>
         <IconX style={scanPageStyle.errorIcon} />
-        <Typography style={scanPageStyle.errorText}>{error}</Typography>
+        <Typography style={scanPageStyle.errorText}>
+          {t(`scanner_page.scan_results_card.errors.${error}`)}
+        </Typography>
       </CardShell>
     );
   }

Then add corresponding keys to public/locals/en.json under scanner_page.scan_results_card.errors.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Scanner/components/ScanResultsCard.tsx` around lines 65 - 72, The
ScanResultsCard currently renders the error prop (typed as ApiErrorTypes)
directly; change it to map the ApiErrorTypes enum to a localized string before
rendering—use the component's i18n hook (e.g., t) to look up keys under
scanner_page.scan_results_card.errors (e.g.,
t(`scanner_page.scan_results_card.errors.${error}`) or a switch that maps each
ApiErrorTypes case to a specific key) and render that translated string instead
of raw error; also add the corresponding keys and human-friendly messages to
public/locals/en.json under scanner_page.scan_results_card.errors so each enum
value has a translation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/pages/Scanner/useScanMutation.ts`:
- Around line 13-14: The type guard hasError incorrectly narrows to `{ error:
string }`; update it to narrow to the correct type used by
UrlCheckResult/MultipleUrlsResponse by changing the predicate to `result is {
error: ApiErrorTypes }` (i.e., accept `error?: ApiErrorTypes | null` and return
`Boolean(result.error)`), and import or reference the ApiErrorTypes type if not
already imported so the throws at lines where `hasError` is used (around the
throw sites in useScanMutation, referenced by hasError and the throw calls on
lines ~23 and ~38) are type-safe.

---

Duplicate comments:
In `@src/pages/Scanner/components/ScanResultsCard.tsx`:
- Around line 40-49: UrlResultRow currently conveys status only via icons; add
an accessible textual status that screen readers can announce by inserting a
visually-hidden/aria-live text node alongside the icon that reflects isBroken
(e.g., "Broken" vs "Working"), or set a role="status" and aria-atomic on the
container so screen readers announce changes; update the UrlResultRow component
(props: url, isBroken) to render that hidden status text next to the
IconX/IconCheck and ensure scanPageStyle or a CSS sr-only class is used to
visually hide the text but keep it accessible.

---

Nitpick comments:
In `@src/pages/Scanner/components/ScanResultsCard.tsx`:
- Around line 65-72: The ScanResultsCard currently renders the error prop (typed
as ApiErrorTypes) directly; change it to map the ApiErrorTypes enum to a
localized string before rendering—use the component's i18n hook (e.g., t) to
look up keys under scanner_page.scan_results_card.errors (e.g.,
t(`scanner_page.scan_results_card.errors.${error}`) or a switch that maps each
ApiErrorTypes case to a specific key) and render that translated string instead
of raw error; also add the corresponding keys and human-friendly messages to
public/locals/en.json under scanner_page.scan_results_card.errors so each enum
value has a translation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8bc3a3c9-5a01-4476-9a0e-199449d3cb8b

📥 Commits

Reviewing files that changed from the base of the PR and between f4bb61b and 79fcb31.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (9)
  • package.json
  • src/App.tsx
  • src/pages/Scanner/Scanner.page.tsx
  • src/pages/Scanner/components/ScanLinksCard.tsx
  • src/pages/Scanner/components/ScanResultsCard.tsx
  • src/pages/Scanner/components/styles.ts
  • src/pages/Scanner/types/scan.ts
  • src/pages/Scanner/useScanMutation.ts
  • src/pages/Scanner/utils/scan.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/pages/Scanner/components/styles.ts
  • src/pages/Scanner/components/ScanLinksCard.tsx

Comment thread src/pages/Scanner/useScanMutation.ts Outdated
@michal-bakshi michal-bakshi marked this pull request as draft March 13, 2026 00:24
@michal-bakshi michal-bakshi marked this pull request as ready for review March 14, 2026 18:05
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
src/pages/Scanner/components/ScanResultsCard.tsx (1)

40-48: ⚠️ Potential issue | 🟠 Major

Expose per-URL result status to assistive tech (still unresolved).

UrlResultRow currently communicates working/broken via icon only; add an accessible label per row and hide decorative icons from screen readers.

♿ Minimal accessibility patch
 const UrlResultRow = ({ url, isBroken }: UrlResultRowProps) => (
-  <div style={scanPageStyle.urlRowContainer}>
+  <div
+    style={scanPageStyle.urlRowContainer}
+    aria-label={`${url}: ${isBroken ? 'broken' : 'working'}`}
+  >
     {isBroken ? (
-      <IconX style={scanPageStyle.statusIcon(isBroken)} />
+      <IconX style={scanPageStyle.statusIcon(isBroken)} aria-hidden />
     ) : (
-      <IconCheck style={scanPageStyle.statusIcon(isBroken)} />
+      <IconCheck style={scanPageStyle.statusIcon(isBroken)} aria-hidden />
     )}
     <span style={scanPageStyle.resultDescription}>{url}</span>
   </div>
 );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Scanner/components/ScanResultsCard.tsx` around lines 40 - 48,
UrlResultRow currently conveys status only via icons; update it to expose
per-URL status to assistive tech by marking the decorative icons
(IconX/IconCheck) as aria-hidden and adding an accessible label on the row
container that includes the URL and its status (e.g., a descriptive aria-label
or a visually-hidden span with text like "{url} — broken" or "{url} — working").
Locate UrlResultRow (props url, isBroken) and modify the JSX so IconX/IconCheck
include aria-hidden={true} and the wrapper div (or
scanPageStyle.resultDescription element) includes an aria-label or an extra
screen-reader-only element that reports the status text derived from isBroken.
🧹 Nitpick comments (1)
src/pages/Scanner/components/ScanResultsCard.tsx (1)

9-9: Use a type-only import for ScanResultsCardProps to improve clarity and enable tree-shaking.

ScanResultsCardProps is used only as a type annotation on line 51. Marking it as type-only clarifies intent and improves dead code elimination.

♻️ Proposed fix
-import { ResolvedKind, ScanResultsCardProps } from '../types/scan';
+import { ResolvedKind, type ScanResultsCardProps } from '../types/scan';
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Scanner/components/ScanResultsCard.tsx` at line 9, Change the mixed
import so that ScanResultsCardProps is imported as a type-only import: keep
ResolvedKind as the runtime/value import and import ScanResultsCardProps using
an "import type" declaration (e.g., separate or combined import statements) in
ScanResultsCard.tsx where ResolvedKind and ScanResultsCardProps are currently
imported; this clarifies intent and enables tree-shaking for the type-only
symbol.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@src/pages/Scanner/components/ScanResultsCard.tsx`:
- Around line 40-48: UrlResultRow currently conveys status only via icons;
update it to expose per-URL status to assistive tech by marking the decorative
icons (IconX/IconCheck) as aria-hidden and adding an accessible label on the row
container that includes the URL and its status (e.g., a descriptive aria-label
or a visually-hidden span with text like "{url} — broken" or "{url} — working").
Locate UrlResultRow (props url, isBroken) and modify the JSX so IconX/IconCheck
include aria-hidden={true} and the wrapper div (or
scanPageStyle.resultDescription element) includes an aria-label or an extra
screen-reader-only element that reports the status text derived from isBroken.

---

Nitpick comments:
In `@src/pages/Scanner/components/ScanResultsCard.tsx`:
- Line 9: Change the mixed import so that ScanResultsCardProps is imported as a
type-only import: keep ResolvedKind as the runtime/value import and import
ScanResultsCardProps using an "import type" declaration (e.g., separate or
combined import statements) in ScanResultsCard.tsx where ResolvedKind and
ScanResultsCardProps are currently imported; this clarifies intent and enables
tree-shaking for the type-only symbol.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 480e8859-a21f-40cc-ba06-010a982b656a

📥 Commits

Reviewing files that changed from the base of the PR and between b83a09f and 4bbd859.

📒 Files selected for processing (1)
  • src/pages/Scanner/components/ScanResultsCard.tsx

@michal-bakshi michal-bakshi force-pushed the broken-link-checker-service branch from 349b56c to e15702e Compare March 14, 2026 23:45
Copy link
Copy Markdown
Member

@Tamir198 Tamir198 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left you some comments

Comment thread src/pages/Scanner/components/ScanResultsCard.tsx Outdated
Comment thread src/pages/Scanner/components/ScanResultsCard.tsx Outdated
Comment thread src/pages/Scanner/components/ScanResultsCard.tsx Outdated
Comment thread src/pages/Scanner/utils/scan.ts Outdated
Comment thread src/pages/Scanner/Scanner.page.tsx Outdated
@Tamir198 Tamir198 merged commit 1e31624 into Deadlink-Hunter:main Mar 17, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add service to call the Broken-Link-Checker

3 participants