| 144 | // search query (filter the preset list). Anything with a scheme, slash, or |
| 145 | // host-with-TLD is treated as a URL; everything else is search. |
| 146 | const looksLikeUrl = (raw: string): boolean => { |
| 147 | const v = raw.trim(); |
| 148 | if (v.length === 0) return false; |
| 149 | if (/^[a-z][a-z0-9+\-.]*:\/\//i.test(v)) return true; |
| 150 | if (v.includes("/")) return true; |
| 151 | if (/^[a-z0-9][a-z0-9.-]*\.[a-z]{2,}(?::\d+)?$/i.test(v)) return true; |
| 152 | return false; |
| 153 | }; |
| 154 | |
| 155 | function ConnectDialog(props: { open: boolean; onOpenChange: (open: boolean) => void }) { |
| 156 | const integrationPlugins = useIntegrationPlugins(); |