diff --git a/apps/rebreak-native/app/(app)/blocker.tsx b/apps/rebreak-native/app/(app)/blocker.tsx index bf96943..3029392 100644 --- a/apps/rebreak-native/app/(app)/blocker.tsx +++ b/apps/rebreak-native/app/(app)/blocker.tsx @@ -409,8 +409,8 @@ export default function BlockerScreen() { setAddSheetOpen(false); refreshDomains(); }} - onAdd={async (pattern) => { - const result = await addDomain(pattern); + onAdd={async (pattern, kind) => { + const result = await addDomain(pattern, kind); if (result.ok) { const sync = await syncBlocklist(); if (sync.ok) refresh(); diff --git a/apps/rebreak-native/components/blocker/AddDomainSheet.tsx b/apps/rebreak-native/components/blocker/AddDomainSheet.tsx index 2867913..1c7bcbd 100644 --- a/apps/rebreak-native/components/blocker/AddDomainSheet.tsx +++ b/apps/rebreak-native/components/blocker/AddDomainSheet.tsx @@ -22,7 +22,7 @@ type Props = { visible: boolean; tier: Tier; onClose: () => void; - onAdd: (pattern: string) => Promise<{ ok: boolean; error?: string; alreadyGlobal?: boolean }>; + onAdd: (pattern: string, kind?: 'web' | 'mail') => Promise<{ ok: boolean; error?: string; alreadyGlobal?: boolean }>; }; function detectKind(input: string): 'web' | 'mail' | null { @@ -70,7 +70,12 @@ export function AddDomainSheet({ visible, tier, onClose, onAdd }: Props) { setAdding(true); setError(null); const pattern = kind === 'web' ? normalizeDomain(input) : normalizedMail; - const result = await onAdd(pattern); + // Pass kind explicitly — we've already stripped the local-part for mail, + // so the backend's auto-detect (which keys on the "@" character) can no + // longer infer the type from the pattern alone. Without this hint a + // "info@only4-subscribers.com" entry would land as type=web because + // the @ disappeared during the strip. + const result = await onAdd(pattern, kind === 'mail' ? 'mail' : 'web'); setAdding(false); if (result.ok) { close();