mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-23 23:46:35 +00:00
19ae607f54
A third scope, home, next to trip and journey: threads that name neither a trip nor a journey (the CHECK now only forbids both), reached under /api/assistant by their owner only. A home turn reads the user's trips through list_trips into a short card (under way, next, later, behind, undated), offers every read (a trip's on the id the model names, checked by the tool with the user's rights) and only the writes that take no trip or journey (atlas, vacation planner, collections, tour library, settings), all held as change cards. open_trip_chat answers with a card that goes on in that trip's own chat with the question waiting in its composer. On the desktop the window opens on the home chat outside a trip; its head lists the trips to switch into and a switched trip chat has the way back. On the phone the home chat opens full screen from the dashboard head and the dock's More list, and the card opens the trip with its chat. Both run on useAssistantHome.
45 lines
1.8 KiB
TypeScript
45 lines
1.8 KiB
TypeScript
import { useCallback, useMemo } from 'react';
|
|
|
|
import { useTranslation } from '../../i18n';
|
|
import { HOME_CHAT_KEY } from '../../store/assistantChatKey';
|
|
import { useAssistantStore } from '../../store/assistantStore';
|
|
import type { AssistantChatTrip } from './assistantViewContext';
|
|
|
|
/**
|
|
* The home chat, the assistant outside any one trip, as the desktop window
|
|
* and the phone screen both show it: the key its conversations are kept
|
|
* under, the name its head carries, and the way into one trip's own chat.
|
|
* That way leaves the question the home chat handed over waiting in the
|
|
* trip's composer, ready to send, and then lets the view switch (the window
|
|
* shows that trip's chat in place, the phone opens the trip with its chat).
|
|
*/
|
|
export function useAssistantHome(switchTo: (trip: AssistantChatTrip) => void) {
|
|
const { t } = useTranslation();
|
|
const setDraft = useAssistantStore((s) => s.setDraft);
|
|
|
|
const openTripChat = useCallback(
|
|
(trip: AssistantChatTrip, question: string | null) => {
|
|
// A question typed there already stays; the handed-over one only fills an empty composer.
|
|
const typed = useAssistantStore.getState().byTrip[trip.id]?.draft ?? '';
|
|
if (question && !typed.trim()) setDraft(trip.id, question);
|
|
switchTo(trip);
|
|
},
|
|
[setDraft, switchTo]
|
|
);
|
|
|
|
const title = t('assistant.home.title');
|
|
const chat = useMemo((): AssistantChatTrip => ({ id: HOME_CHAT_KEY, title }), [title]);
|
|
return { chat, openTripChat };
|
|
}
|
|
|
|
/**
|
|
* The way into the home chat on the pages outside a trip (the phone's
|
|
* dashboard head and the dock's More list): offered only while the assistant
|
|
* can run for this user, like every other way in.
|
|
*/
|
|
export function useAssistantHomeLauncher() {
|
|
const available = useAssistantStore((s) => s.status?.available === true);
|
|
const open = useAssistantStore((s) => s.open);
|
|
return { available, open };
|
|
}
|