teqo-backup/src/lib/homeSearchExcludeCurrentEntity.ts
2026-08-01 20:38:53 +00:00

83 lines
3.2 KiB
TypeScript

import { parseAdvisorDetailId } from '@/lib/campaignAdvisorQuickActions'
import type { HomeSearchSuccessResponse } from '@/lib/campaignHomeSearchHits'
import { parseMunicipalityDetailSlug } from '@/lib/campaignMunicipalityQuickActions'
import type { CampaignQuickActionContext } from '@/lib/campaignQuickActionContext'
import { isDemandDetailPath } from '@/lib/campaignQuickActionDemands'
import {
parseActivityQuickActionSurface,
parseOrganizationQuickActionSurface,
} from '@/lib/campaignQuickActionPaths'
const leadershipDetailIdFromPath = (pathname: string): number | undefined => {
const match = pathname.match(/^\/campanha\/liderancas\/(\d+)(?:\/|$)/)
if (!match?.[1]) return undefined
const id = Number(match[1])
return Number.isInteger(id) && id > 0 ? id : undefined
}
const demandSlugFromPath = (pathname: string): string | undefined => {
if (!isDemandDetailPath(pathname)) return undefined
const rest = pathname.slice('/campanha/demandas/'.length)
return rest || undefined
}
/** Merged pathname + page context for client-side hit exclusion (B109). */
export const resolveHomeSearchExcludeContext = (
pathname: string,
context: CampaignQuickActionContext,
): CampaignQuickActionContext => {
const organizationSurface = parseOrganizationQuickActionSurface(pathname)
const activitySurface = parseActivityQuickActionSurface(pathname)
return {
municipalitySlug: context.municipalitySlug ?? parseMunicipalityDetailSlug(pathname),
municipalityId: context.municipalityId,
leadershipId: context.leadershipId ?? leadershipDetailIdFromPath(pathname),
organizationSlug:
context.organizationSlug ??
(organizationSurface?.kind === 'detail' ? organizationSurface.organizationSlug : undefined),
activitySlug:
context.activitySlug ??
(activitySurface?.kind === 'detail' ? activitySurface.activitySlug : undefined),
demandSlug: context.demandSlug ?? demandSlugFromPath(pathname),
advisorId: context.advisorId ?? parseAdvisorDetailId(pathname),
}
}
const hasExcludeTarget = (context: CampaignQuickActionContext): boolean =>
Boolean(
context.municipalitySlug ||
context.leadershipId !== undefined ||
context.organizationSlug ||
context.activitySlug ||
context.demandSlug ||
context.advisorId !== undefined,
)
export const filterHomeSearchResponseForContext = (
data: HomeSearchSuccessResponse,
context: CampaignQuickActionContext,
): HomeSearchSuccessResponse => {
if (!hasExcludeTarget(context)) return data
return {
...data,
municipalities: context.municipalitySlug
? data.municipalities.filter((hit) => hit.slug !== context.municipalitySlug)
: data.municipalities,
leaderships:
context.leadershipId !== undefined
? data.leaderships.filter((hit) => hit.id !== context.leadershipId)
: data.leaderships,
advisors:
context.advisorId !== undefined
? data.advisors.filter((hit) => hit.id !== context.advisorId)
: data.advisors,
activities: context.activitySlug
? data.activities.filter((hit) => hit.slug !== context.activitySlug)
: data.activities,
demands: context.demandSlug
? data.demands.filter((hit) => hit.slug !== context.demandSlug)
: data.demands,
}
}