inbox-compiled-query.ts2.8 KBView on GitHub
import type { InboxConfig } from '@/modules/threads/hooks/use-inboxes';
import {
  buildImportantIncludeQuery,
  buildImportantIncludeTerms,
  buildImportantQueryExclusions,
  joinAsOrGroup,
  type ImportantSignal,
} from '@/modules/threads/lib/inbox-query-params';

export type InboxCompiledQueryInput = {
  inbox: InboxConfig;
  inboxes: InboxConfig[];
  hasCategoryPersonal: boolean;
  connectionEmail?: string | null;
  sessionName?: string | null;
  importantSignal?: ImportantSignal;
};

export type InboxCompiledQuery = {
  compiledQuery: string;
  queryHash: string;
  inboxName: string;
};

export function buildInboxCompiledQuery(
  input: InboxCompiledQueryInput,
): InboxCompiledQuery {
  const {
    inbox,
    inboxes,
    hasCategoryPersonal,
    connectionEmail,
    sessionName,
    importantSignal,
  } = input;

  const matchingInbox = inboxes.find(
    // Name fallback covers any legacy stragglers whose id changed without the
    // tabs config catching up.
    (candidate) =>
      candidate.id === inbox.id ||
      candidate.name.toLowerCase() === inbox.name.toLowerCase(),
  );

  let compiledQuery: string;
  if (matchingInbox?.compiledQuery) {
    compiledQuery = matchingInbox.compiledQuery;
  } else if (inbox.query?.trim()) {
    compiledQuery = inbox.query.trim();
  } else if (inbox.id === 'important') {
    const includeQuery = buildImportantIncludeQuery({
      hasCategoryPersonal,
      connectionEmail,
      sessionName,
      signal: importantSignal,
    });
    const exclusions = buildImportantQueryExclusions(inboxes);
    if (exclusions.length === 0) compiledQuery = includeQuery;
    else if (exclusions.length === 1) compiledQuery = `${includeQuery} -(${exclusions[0]})`;
    else compiledQuery = `${includeQuery} -((${exclusions.join(') OR (')}))`;
  } else if (inbox.id === 'default') {
    const exclusions = buildImportantQueryExclusions(inboxes);
    if (exclusions.length === 0) compiledQuery = 'label:INBOX';
    else if (exclusions.length === 1) compiledQuery = `label:INBOX -(${exclusions[0]})`;
    else compiledQuery = `label:INBOX -((${exclusions.join(') OR (')}))`;
  } else if (inbox.id === 'other') {
    const importantTerms = buildImportantIncludeTerms({
      hasCategoryPersonal,
      connectionEmail,
      sessionName,
      signal: importantSignal,
    });
    const importantExclusion = joinAsOrGroup(importantTerms);
    const splitExclusion = joinAsOrGroup(buildImportantQueryExclusions(inboxes));
    const parts = ['label:INBOX'];
    if (importantExclusion) parts.push(`-(${importantExclusion})`);
    if (splitExclusion) parts.push(`-(${splitExclusion})`);
    compiledQuery = parts.join(' ');
  } else {
    compiledQuery = 'label:INBOX';
  }

  const queryHash =
    matchingInbox?.queryHash ?? `client-fallback:${inbox.id}:${compiledQuery}`;

  return { compiledQuery, queryHash, inboxName: inbox.name };
}