🧠 feat: Prompt caching switch, prompt query params; refactor: static cache, prompt/markdown styling, trim copied code, switch new chat to convo URL (#3784)

* refactor: Update staticCache to use oneDayInSeconds for sMaxAge and maxAge

* refactor: role updates

* style: first pass cursor

* style: Update nested list styles in style.css

* feat: setIsSubmitting to true in message handler to prevent edge case where submitting turns false during message stream

* feat: Add logic to redirect to conversation page after creating a new conversation

* refactor: Trim code string before copying in CodeBlock component

* feat: configSchema bookmarks and presets defaults

* feat: Update loadDefaultInterface to handle undefined config

* refactor: use  for compression check

* feat: first pass, query params

* fix: styling issues for prompt cards

* feat: anthropic prompt caching UI switch

* chore: Update static file cache control defaults/comments in .env.example

* ci: fix tests

* ci: fix tests

* chore:  use "submitting" class server error connection suspense fallback
This commit is contained in:
Danny Avila 2024-08-26 15:34:46 -04:00 committed by GitHub
parent bd701c197e
commit 5694ad4e55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
31 changed files with 519 additions and 112 deletions

View file

@ -3,6 +3,7 @@ export { default as useUserKey } from './useUserKey';
export { default as useDebounce } from './useDebounce';
export { default as useTextarea } from './useTextarea';
export { default as useCombobox } from './useCombobox';
export { default as useQueryParams } from './useQueryParams';
export { default as useHandleKeyUp } from './useHandleKeyUp';
export { default as useRequiresKey } from './useRequiresKey';
export { default as useMultipleKeys } from './useMultipleKeys';

View file

@ -0,0 +1,66 @@
import { useEffect, useRef } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useChatFormContext } from '~/Providers';
export default function useQueryParams({
textAreaRef,
}: {
textAreaRef: React.RefObject<HTMLTextAreaElement>;
}) {
const methods = useChatFormContext();
const [searchParams] = useSearchParams();
const attemptsRef = useRef(0);
const processedRef = useRef(false);
const maxAttempts = 50; // 5 seconds maximum (50 * 100ms)
useEffect(() => {
const promptParam = searchParams.get('prompt');
if (!promptParam) {
return;
}
const decodedPrompt = decodeURIComponent(promptParam);
const intervalId = setInterval(() => {
// If already processed or max attempts reached, clear interval and stop
if (processedRef.current || attemptsRef.current >= maxAttempts) {
clearInterval(intervalId);
if (attemptsRef.current >= maxAttempts) {
console.warn('Max attempts reached, failed to process prompt');
}
return;
}
attemptsRef.current += 1;
if (textAreaRef.current) {
const currentText = methods.getValues('text');
// Only update if the textarea is empty
if (!currentText) {
methods.setValue('text', decodedPrompt, { shouldValidate: true });
textAreaRef.current.focus();
textAreaRef.current.setSelectionRange(decodedPrompt.length, decodedPrompt.length);
// Remove the 'prompt' parameter from the URL
searchParams.delete('prompt');
const newUrl = `${window.location.pathname}${
searchParams.toString() ? `?${searchParams.toString()}` : ''
}`;
window.history.replaceState({}, '', newUrl);
processedRef.current = true;
console.log('Prompt processed successfully');
}
clearInterval(intervalId);
}
}, 100); // Check every 100ms
// Clean up the interval on unmount
return () => {
clearInterval(intervalId);
console.log('Cleanup: interval cleared');
};
}, [searchParams, methods, textAreaRef]);
}

View file

@ -86,6 +86,7 @@ export default function useEventHandlers({
isRegenerate = false,
} = submission;
const text = data ?? '';
setIsSubmitting(true);
if (text.length > 0) {
announcePolite({
message: text,
@ -118,7 +119,7 @@ export default function useEventHandlers({
]);
}
},
[setMessages, announcePolite],
[setMessages, announcePolite, setIsSubmitting],
);
const cancelHandler = useCallback(
@ -387,6 +388,10 @@ export default function useEventHandlers({
}
if (setConversation && isAddedRequest !== true) {
if (window.location.pathname === '/c/new') {
window.history.pushState({}, '', '/c/' + conversation.conversationId);
}
setConversation((prevState) => {
const update = {
...prevState,