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 };
}