import { Interaction, InteractionType, InteractionValue } from '../../types/booru-object'; import { FieldMatcher } from './types'; function interactionMatch(imageId: number, type: InteractionType, value: InteractionValue, interactions: Interaction[]): boolean { return interactions.some(v => v.image_id === imageId && v.interaction_type === type && (value === null || v.value === value)); } export function makeUserMatcher(term: string): FieldMatcher { // Should work with most my:conditions except watched. return (value, field, documentId) => { switch (term) { case 'faves': return interactionMatch(documentId, 'faved', null, window.booru.interactions); case 'upvotes': return interactionMatch(documentId, 'voted', 'up', window.booru.interactions); case 'downvotes': return interactionMatch(documentId, 'voted', 'down', window.booru.interactions); case 'watched': case 'hidden': default: // Other my: interactions aren't supported, return false to prevent them from triggering spoiler. return false; } }; }