@tooee/choose 0.7.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/choose-filter.d.ts.map +1 -1
- package/dist/choose-filter.js +11 -2
- package/dist/choose-filter.js.map +1 -1
- package/dist/choose-list.d.ts.map +1 -1
- package/dist/choose-list.js +10 -1
- package/dist/choose-list.js.map +1 -1
- package/dist/choose-panel.d.ts +7 -9
- package/dist/choose-panel.d.ts.map +1 -1
- package/dist/choose-panel.js +5 -8
- package/dist/choose-panel.js.map +1 -1
- package/dist/choose-store.d.ts +57 -0
- package/dist/choose-store.d.ts.map +1 -0
- package/dist/choose-store.js +102 -0
- package/dist/choose-store.js.map +1 -0
- package/dist/choose.d.ts +5 -5
- package/dist/choose.d.ts.map +1 -1
- package/dist/choose.js +26 -12
- package/dist/choose.js.map +1 -1
- package/dist/fuzzy.d.ts.map +1 -1
- package/dist/fuzzy.js +2 -14
- package/dist/fuzzy.js.map +1 -1
- package/dist/launch.d.ts.map +1 -1
- package/dist/launch.js +1 -1
- package/dist/launch.js.map +1 -1
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +17 -5
- package/dist/source.js.map +1 -1
- package/dist/use-choose-dialog.d.ts.map +1 -1
- package/dist/use-choose-dialog.js +22 -84
- package/dist/use-choose-dialog.js.map +1 -1
- package/dist/use-choose.d.ts +1 -1
- package/dist/use-choose.d.ts.map +1 -1
- package/dist/use-choose.js +236 -264
- package/dist/use-choose.js.map +1 -1
- package/package.json +10 -7
- package/src/choose-filter.tsx +10 -2
- package/src/choose-list.tsx +9 -1
- package/src/choose-panel.tsx +18 -71
- package/src/choose-store.ts +146 -0
- package/src/choose.tsx +43 -27
- package/src/fuzzy.ts +2 -17
- package/src/launch.tsx +7 -2
- package/src/source.ts +24 -6
- package/src/use-choose-dialog.tsx +30 -98
- package/src/use-choose.ts +273 -278
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useOverlayDialog } from "@tooee/overlays";
|
|
4
4
|
import { ChooseOverlay } from "./choose-overlay.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
const isDialogItemArray = function isDialogItemArray(items) {
|
|
6
|
+
return Array.isArray(items);
|
|
7
|
+
};
|
|
8
|
+
// oxlint-disable-next-line typescript/no-unnecessary-type-parameters -- T carries the conditional public option evidence for an omitted mapper
|
|
9
|
+
const defaultDialogItem = function defaultDialogItem(item) {
|
|
10
|
+
// SAFETY: ChooseDialogToItem permits an omitted mapper only when T extends ChooseItem.
|
|
11
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- conditional public options enforce the ChooseItem arm
|
|
12
|
+
return item;
|
|
13
|
+
};
|
|
12
14
|
/**
|
|
13
15
|
* Promise-based modal chooser dialog on the overlay stack.
|
|
14
16
|
*
|
|
@@ -24,54 +26,13 @@ let chooseDialogSequence = 0;
|
|
|
24
26
|
* `useCurrentOverlay()`).
|
|
25
27
|
*/
|
|
26
28
|
export const useChooseDialog = function useChooseDialog() {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
overlayRef.current = overlay;
|
|
30
|
-
// Open dialogs by overlay id, so unmounting the owner closes (and thereby
|
|
31
|
-
// settles) every dialog it opened.
|
|
32
|
-
const openHandlesRef = useRef(new Map());
|
|
33
|
-
const unmountedRef = useRef(false);
|
|
34
|
-
useEffect(() => {
|
|
35
|
-
unmountedRef.current = false;
|
|
36
|
-
const handles = openHandlesRef.current;
|
|
37
|
-
return () => {
|
|
38
|
-
unmountedRef.current = true;
|
|
39
|
-
// Map iteration tolerates deletion: settle() removes entries as each
|
|
40
|
-
// close lands.
|
|
41
|
-
for (const handle of handles.values()) {
|
|
42
|
-
handle.close("unmounted");
|
|
43
|
-
}
|
|
44
|
-
handles.clear();
|
|
45
|
-
};
|
|
46
|
-
}, []);
|
|
47
|
-
// Stable identity so command handlers and effects can capture the handle.
|
|
48
|
-
const handleRef = useRef(null);
|
|
49
|
-
if (handleRef.current === null) {
|
|
29
|
+
const dialog = useOverlayDialog();
|
|
30
|
+
return useMemo(() => {
|
|
50
31
|
const open = async (options) => {
|
|
51
|
-
const { promise, resolve } = Promise.withResolvers();
|
|
52
|
-
if (unmountedRef.current) {
|
|
53
|
-
resolve(null);
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
chooseDialogSequence += 1;
|
|
57
|
-
const id = `choose-dialog-${chooseDialogSequence}`;
|
|
58
|
-
let settled = false;
|
|
59
|
-
const settle = (value) => {
|
|
60
|
-
if (settled) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
settled = true;
|
|
64
|
-
openHandlesRef.current.delete(id);
|
|
65
|
-
resolve(value);
|
|
66
|
-
};
|
|
67
32
|
// Displayed rows map back to typed items by identity: every mapped
|
|
68
33
|
// row is a fresh object (spread copy), so duplicates in `items` and
|
|
69
34
|
// `toItem` results that share references stay unambiguous.
|
|
70
|
-
|
|
71
|
-
// (enforced by ChooseDialogToItem).
|
|
72
|
-
// Deferred(lint-sweep): replace the conditional generic API boundary with schema-safe overload implementation typing.
|
|
73
|
-
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- default mapper is enforced by ChooseDialogToItem's public type
|
|
74
|
-
const toItem = options.toItem ?? ((item) => item);
|
|
35
|
+
const toItem = options.toItem ?? defaultDialogItem;
|
|
75
36
|
const rowToValue = new Map();
|
|
76
37
|
const mapValues = (values) => {
|
|
77
38
|
rowToValue.clear();
|
|
@@ -84,11 +45,9 @@ export const useChooseDialog = function useChooseDialog() {
|
|
|
84
45
|
// Created once per open() so the source identity is stable across
|
|
85
46
|
// overlay re-renders (a fresh source each render would reload forever).
|
|
86
47
|
const { items } = options;
|
|
87
|
-
const source =
|
|
48
|
+
const source = isDialogItemArray(items)
|
|
88
49
|
? mapValues(items)
|
|
89
50
|
: () => {
|
|
90
|
-
// Deferred(lint-sweep): replace the conditional generic API boundary with schema-safe overload implementation typing.
|
|
91
|
-
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- implementation narrows the public source union after the branch
|
|
92
51
|
const loaded = items();
|
|
93
52
|
if (loaded instanceof Promise) {
|
|
94
53
|
return (async () => mapValues(await loaded))();
|
|
@@ -108,46 +67,25 @@ export const useChooseDialog = function useChooseDialog() {
|
|
|
108
67
|
renderItem: options.renderItem,
|
|
109
68
|
statusRight: options.statusRight,
|
|
110
69
|
};
|
|
111
|
-
|
|
112
|
-
if (settled) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
70
|
+
return await dialog.open("choose-dialog", (settle) => multi ? (_jsx(ChooseOverlay, { ...shared, multi: true, onSubmit: (result) => {
|
|
115
71
|
const values = result.items.flatMap((row) => {
|
|
116
72
|
const value = rowToValue.get(row);
|
|
117
73
|
return value === undefined ? [] : [value];
|
|
118
74
|
});
|
|
119
75
|
settle(values);
|
|
120
|
-
handle.close("close");
|
|
121
76
|
}, onCancel: () => {
|
|
122
|
-
|
|
77
|
+
settle(null);
|
|
123
78
|
} })) : (_jsx(ChooseOverlay, { ...shared, onSelect: (row) => {
|
|
124
|
-
if (settled) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
79
|
const value = rowToValue.get(row);
|
|
128
80
|
settle(value ?? null);
|
|
129
|
-
handle.close("close");
|
|
130
81
|
}, onCancel: () => {
|
|
131
|
-
handle.close("escape");
|
|
132
|
-
} })), undefined, {
|
|
133
|
-
// Single settlement funnel: every close path (cancel, escape,
|
|
134
|
-
// replacement, unmount, external closeTop) lands here. Select and
|
|
135
|
-
// submit settle first, making this a no-op.
|
|
136
|
-
onClose: () => {
|
|
137
82
|
settle(null);
|
|
138
|
-
}
|
|
139
|
-
ownCommands: true,
|
|
140
|
-
role: "modal",
|
|
141
|
-
surfaceMode: "insert",
|
|
142
|
-
});
|
|
143
|
-
openHandlesRef.current.set(id, handle);
|
|
144
|
-
const result = await promise;
|
|
145
|
-
return result;
|
|
83
|
+
} })));
|
|
146
84
|
};
|
|
147
|
-
//
|
|
85
|
+
// SAFETY: The implementation returns the single or multi result selected by the same options.multi
|
|
86
|
+
// discriminator as the public overloads.
|
|
148
87
|
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- implementation preserves the public overloaded handle contract
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
return handleRef.current;
|
|
88
|
+
return { open: open };
|
|
89
|
+
}, [dialog]);
|
|
152
90
|
};
|
|
153
91
|
//# sourceMappingURL=use-choose-dialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-choose-dialog.js","sourceRoot":"","sources":["../src/use-choose-dialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use-choose-dialog.js","sourceRoot":"","sources":["../src/use-choose-dialog.tsx"],"names":[],"mappings":"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"}
|
package/dist/use-choose.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { ChooseItem, ChooseResult, ChooseSource } from "./types.js";
|
|
|
5
5
|
declare module "@tooee/commands" {
|
|
6
6
|
interface CommandContext {
|
|
7
7
|
/** Contributed by chooser primitives: current filtering and selection state. */
|
|
8
|
-
choose
|
|
8
|
+
choose?: {
|
|
9
9
|
activeItem: ChooseItem | undefined;
|
|
10
10
|
selectedItems: ChooseItem[];
|
|
11
11
|
filterQuery: string;
|
package/dist/use-choose.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-choose.d.ts","sourceRoot":"","sources":["../src/use-choose.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"use-choose.d.ts","sourceRoot":"","sources":["../src/use-choose.ts"],"names":[],"mappings":"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"}
|