+ :not([data-jump-hint])]:hidden",
+ )}
+ >
Discard draft
+ {props.jumpLabel ? (
+
+ {props.jumpLabel}
+
+ ) : null}
@@ -133,16 +216,13 @@ const SidebarDraftRow = memo(function SidebarDraftRow(props: {
);
});
-interface SidebarDraftRowData {
- draftId: DraftId;
- session: DraftSessionState;
- composer: ComposerThreadDraftState;
-}
-
export const SidebarDraftBlock = memo(function SidebarDraftBlock(props: {
+ draftIds: readonly DraftId[];
+ routeDraftComposer: ComposerThreadDraftState | null;
+ /** Labels by list position, or null while hints are hidden. */
+ jumpLabels: readonly (string | null)[] | null;
projectByKey: ReadonlyMap;
projectDisplayNameByKey: ReadonlyMap;
- scopedProjectKeys: ReadonlySet | null;
routeDraftId: string | null;
onNavigateToDraft: (draftId: DraftId) => void;
onDraftContextMenu: (draftId: DraftId, position: { x: number; y: number }) => void;
@@ -157,56 +237,19 @@ export const SidebarDraftBlock = memo(function SidebarDraftBlock(props: {
),
),
);
- const [frozenActive, setFrozenActive] = useState<{
- routeDraftId: string | null;
- row: SidebarDraftRowData | null;
- }>({ routeDraftId: null, row: null });
- if (frozenActive.routeDraftId !== props.routeDraftId) {
- let row: SidebarDraftRowData | null = null;
- if (props.routeDraftId !== null) {
- const draftId = DraftId.make(props.routeDraftId);
- const session = draftThreadsByThreadKey[draftId];
- const composer = draftsByThreadKey[draftId];
- row =
- session && session.promotedTo == null && composer && composerDraftHasUserContent(composer)
- ? { draftId, session, composer }
- : null;
- }
- setFrozenActive({ routeDraftId: props.routeDraftId, row });
- }
- const drafts = (() => {
- const rows: SidebarDraftRowData[] = [];
- for (const [draftKey, session] of Object.entries(draftThreadsByThreadKey)) {
- if (session.promotedTo != null) {
- continue;
- }
- if (
- props.scopedProjectKeys !== null &&
- !props.scopedProjectKeys.has(`${session.environmentId}:${session.projectId}`)
- ) {
- continue;
- }
- if (draftKey === props.routeDraftId) {
- if (frozenActive.routeDraftId === draftKey && frozenActive.row !== null) {
- rows.push(frozenActive.row);
- }
- continue;
- }
- const composer = draftsByThreadKey[draftKey];
- if (!composer || !composerDraftHasUserContent(composer)) {
- continue;
- }
- rows.push({ draftId: DraftId.make(draftKey), session, composer });
- }
- rows.sort((left, right) => right.session.createdAt.localeCompare(left.session.createdAt));
- return rows;
- })();
+ const drafts = props.draftIds.flatMap((draftId, slot) => {
+ const session = draftThreadsByThreadKey[draftId];
+ const composer =
+ (draftId === props.routeDraftId ? props.routeDraftComposer : null) ??
+ draftsByThreadKey[draftId];
+ return session && composer ? [{ draftId, slot, session, composer }] : [];
+ });
if (drafts.length === 0) {
return null;
}
return (
<>
- {drafts.map(({ composer, draftId, session }) => {
+ {drafts.map(({ composer, draftId, session, slot }) => {
const projectKey = `${session.environmentId}:${session.projectId}`;
return (