From e9c8ec79d2492594ae46357beebe20edee15e1a9 Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Tue, 10 Feb 2026 18:13:07 +0100 Subject: [PATCH] Add inline set-claim action support --- .../AdaptiveVisitorContextProvider.tsx | 4 +++ .../DocumentView/InlineActionButton.tsx | 36 +++++++++++++++++-- .../components/DocumentView/InlineButton.tsx | 10 ++++-- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/packages/gitbook/src/components/Adaptive/AdaptiveVisitorContextProvider.tsx b/packages/gitbook/src/components/Adaptive/AdaptiveVisitorContextProvider.tsx index 1edf65068..8d03a2574 100644 --- a/packages/gitbook/src/components/Adaptive/AdaptiveVisitorContextProvider.tsx +++ b/packages/gitbook/src/components/Adaptive/AdaptiveVisitorContextProvider.tsx @@ -14,6 +14,10 @@ const adaptiveVisitorReaderCache = new Map< ReturnType> >(); +export function clearAdaptiveVisitorClaimsCache() { + adaptiveVisitorReaderCache.clear(); +} + function createResourceReader(promise: Promise) { let result: T | null | undefined; diff --git a/packages/gitbook/src/components/DocumentView/InlineActionButton.tsx b/packages/gitbook/src/components/DocumentView/InlineActionButton.tsx index a7e5a3c77..20e7caf69 100644 --- a/packages/gitbook/src/components/DocumentView/InlineActionButton.tsx +++ b/packages/gitbook/src/components/DocumentView/InlineActionButton.tsx @@ -1,13 +1,23 @@ 'use client'; +import { clearAdaptiveVisitorClaimsCache } from '@/components/Adaptive/AdaptiveVisitorContextProvider'; import { tString, useLanguage } from '@/intl/client'; import { useAI, useAIChatController, useAIChatState } from '../AI'; import { useSetSearchState } from '../Search'; import { Button, type ButtonProps, Input } from '../primitives'; +type ClaimInput = { + key: string; + value: string | number | boolean | null; +}; + export function InlineActionButton( - props: { action: 'ask' | 'search'; query?: string } & { buttonProps: ButtonProps } // TODO: Type this properly: Pick & { buttonProps: ButtonProps } + props: { + action: 'ask' | 'search' | 'set-claim'; + query?: string; + claims?: ClaimInput[]; + } & { buttonProps: ButtonProps } // TODO: Type this properly: Pick & { buttonProps: ButtonProps } ) { - const { action, query, buttonProps } = props; + const { action, query, claims, buttonProps } = props; const { assistants } = useAI(); const chatController = useAIChatController(); @@ -32,11 +42,33 @@ export function InlineActionButton( } }; + const handleSetClaimAction = () => { + if (!claims?.length) { + return; + } + + const mergedClaims: Record = {}; + for (const claim of claims) { + mergedClaims[claim.key] = claim.value; + } + + document.cookie = `gitbook-visitor-public=${encodeURIComponent( + JSON.stringify(mergedClaims) + )}; path=/; SameSite=Lax`; + + clearAdaptiveVisitorClaimsCache(); + window.location.reload(); + }; + const icon = action === 'ask' && buttonProps.icon === 'gitbook-assistant' && assistants.length > 0 ? assistants[0]?.icon : buttonProps.icon; + if (action === 'set-claim') { + return