mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-11-05 04:04:07 +00:00
8433251c86
The welcome chose the journal's words whenever the Studio had not registered as the chat's host, which also hit the Studio's own panel before (or without) that registration. A journey's chat now speaks of the journal only where the window or the phone's chat screen say they show it for its journal; everywhere else, the Studio included, it stays the book's. AssistantWindow had gone past the complexity limit choosing between the planner's trip, the journal on screen, a picked chat and the home chat; that choice now lives in windowChat.
68 lines
2.8 KiB
TypeScript
68 lines
2.8 KiB
TypeScript
import type { AssistantScope } from '@trek/shared';
|
|
import { createContext, useContext } from 'react';
|
|
|
|
import { type AssistantChatKey, assistantScopeOf } from '../../store/assistantChatKey';
|
|
import type { EntityTarget } from './cards/cardTypes';
|
|
|
|
/** What the parts deep inside a chat need from whoever shows it. */
|
|
export interface AssistantView {
|
|
/**
|
|
* The chat's key, which every part hands to the assistant store: the trip's
|
|
* id in the planner, a journey's key in TREK Studio (`assistantChatKey`).
|
|
* No trip is held under a journey's key, so the parts that read the trip
|
|
* (its map, its days, found places) stay empty there.
|
|
*/
|
|
tripId: AssistantChatKey;
|
|
/** 'window' on the desktop, 'fullscreen' on the phone. */
|
|
variant: 'window' | 'fullscreen';
|
|
/** How much room the chat has: a narrow window and the phone are 'compact'. */
|
|
density?: 'compact' | 'roomy';
|
|
/**
|
|
* Opens what a card or an applied change points at: a spot on the plan's
|
|
* map, a tab of the trip, another page. The buttons are left out where
|
|
* nothing can open them.
|
|
*/
|
|
onOpen?: (target: EntityTarget) => void;
|
|
/** Selects a day in the planner, from its weather; left out where no planner can show it. */
|
|
onFocusDay?: (dayId: number) => void;
|
|
/** Brings the map into view where the chat covers it (the phone), before the map moves. */
|
|
onRevealMap?: () => void;
|
|
/**
|
|
* The stored book's version the book open in TREK Studio stands on, null
|
|
* before it has one; left out outside the Studio. A book card draws the page
|
|
* after as the server's trial made it only while the book is still at the
|
|
* version the trial ran on.
|
|
*/
|
|
bookVersion?: number | null;
|
|
/**
|
|
* Goes on in a trip's own chat with a question waiting there, from the home
|
|
* chat's card that offers it; left out where no chat can be switched to.
|
|
*/
|
|
onOpenTripChat?: (trip: AssistantChatTrip, question: string | null) => void;
|
|
/**
|
|
* A journey's chat shown for its journal (on the journey's page, from the
|
|
* home chat), not for its book in TREK Studio; left out in the Studio and
|
|
* for a trip. The empty chat then speaks of the journal.
|
|
*/
|
|
journal?: boolean;
|
|
}
|
|
|
|
/** A trip as the chat switches to it: its id, which is its chat's key, and its title for the head. */
|
|
export interface AssistantChatTrip {
|
|
id: number;
|
|
title: string;
|
|
}
|
|
|
|
export const AssistantViewContext = createContext<AssistantView | null>(null);
|
|
|
|
export function useAssistantView(): AssistantView {
|
|
const view = useContext(AssistantViewContext);
|
|
if (!view) throw new Error('useAssistantView outside AssistantSurface');
|
|
return view;
|
|
}
|
|
|
|
/** What the chat on screen is about, for the parts that only make sense on a trip. */
|
|
export function useAssistantScope(): AssistantScope {
|
|
return assistantScopeOf(useAssistantView().tripId);
|
|
}
|