diff --git a/web/src/actions/serviceSuggestion.ts b/web/src/actions/serviceSuggestion.ts index d3833fb..74b0e62 100644 --- a/web/src/actions/serviceSuggestion.ts +++ b/web/src/actions/serviceSuggestion.ts @@ -12,6 +12,7 @@ import { formatDistanceStrict } from 'date-fns' import { captchaFormSchemaProperties, captchaFormSchemaSuperRefine } from '../lib/captchaValidation' import { defineProtectedAction } from '../lib/defineProtectedAction' import { saveFileLocally } from '../lib/fileStorage' +import { findServicesBySimilarity } from '../lib/findServicesBySimilarity' import { handleHoneypotTrap } from '../lib/honeypot' import { prisma } from '../lib/prisma' import { separateServiceUrlsByType } from '../lib/urls' @@ -29,11 +30,12 @@ export const SUGGESTION_DESCRIPTION_MAX_LENGTH = 100 export const SUGGESTION_MESSAGE_CONTENT_MAX_LENGTH = 1000 const findPossibleDuplicates = async (input: { name: string }) => { - const possibleDuplicates = await prisma.service.findMany({ + const matches = await findServicesBySimilarity(input.name, 0.3) + + return await prisma.service.findMany({ where: { - name: { - contains: input.name, - mode: 'insensitive', + id: { + in: matches.map(({ id }) => id), }, }, select: { @@ -43,8 +45,6 @@ const findPossibleDuplicates = async (input: { name: string }) => { description: true, }, }) - - return possibleDuplicates } const serializeExtraNotes = >( diff --git a/web/src/components/ServicesFilters.astro b/web/src/components/ServicesFilters.astro index 0e1992f..8b49f23 100644 --- a/web/src/components/ServicesFilters.astro +++ b/web/src/components/ServicesFilters.astro @@ -49,6 +49,7 @@ const { class={cn( // Check the scam filter when there is a text quey and the user has checked verified and approved 'has-[input[name=q]:not(:placeholder-shown)]:has-[&_input[name=verification][value=verified]:checked]:has-[&_input[name=verification][value=approved]:checked]:[&_input[name=verification][value=scam]]:checkbox-force-checked', + 'has-[input[name=q]:placeholder-shown]:[&_[data-hide-if-q-is-empty]]:hidden has-[input[name=q]:not(:placeholder-shown)]:[&_[data-hide-if-q-is-filled]]:hidden', className )} > @@ -80,16 +81,20 @@ const { )) } -

+

Ties randomly sorted

+

+ + Sorted by match first +

- + { - countCommunityOnly && ( + !!countCommunityOnly && ( <>