mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 06:43:06 +00:00
83 lines
3.2 KiB
TypeScript
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,
|
|
}
|
|
}
|