Skip to content

Commit 7c85088

Browse files
committed
ui: does not overwrite the first character when searching repo during session creation
1 parent 7e70cc1 commit 7c85088

1 file changed

Lines changed: 24 additions & 3 deletions

File tree

apps/desktop/src/components/RepoPicker/RepoPicker.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export default function RepoPicker({
2626
const rootRef = useRef<HTMLDivElement>(null);
2727
const searchInputRef = useRef<HTMLInputElement>(null);
2828
const optionRefs = useRef<Array<HTMLButtonElement | null>>([]);
29+
const openFocusModeRef = useRef<"select" | "preserve-end">("select");
2930
const menuId = useId();
3031
const filteredDirs = useMemo(() => {
3132
const needle = searchQuery.trim().toLowerCase();
@@ -69,8 +70,17 @@ export default function RepoPicker({
6970
return;
7071
}
7172
const rafId = requestAnimationFrame(() => {
72-
searchInputRef.current?.focus();
73-
searchInputRef.current?.select();
73+
const input = searchInputRef.current;
74+
if (!input) {
75+
return;
76+
}
77+
input.focus();
78+
if (openFocusModeRef.current === "preserve-end") {
79+
const caret = input.value.length;
80+
input.setSelectionRange(caret, caret);
81+
return;
82+
}
83+
input.select();
7484
});
7585
return () => cancelAnimationFrame(rafId);
7686
}, [open]);
@@ -129,6 +139,7 @@ export default function RepoPicker({
129139
}
130140

131141
event.preventDefault();
142+
openFocusModeRef.current = "preserve-end";
132143
setOpen(true);
133144
if (event.key === " ") {
134145
return true;
@@ -145,6 +156,7 @@ export default function RepoPicker({
145156

146157
if (event.key === "Backspace") {
147158
event.preventDefault();
159+
openFocusModeRef.current = "preserve-end";
148160
setOpen(true);
149161
setSearchQuery((prev) => prev.slice(0, -1));
150162
return;
@@ -153,6 +165,7 @@ export default function RepoPicker({
153165
if ((event.key === "ArrowDown" || event.key === "ArrowUp") && filteredDirs.length > 0) {
154166
event.preventDefault();
155167
if (!open) {
168+
openFocusModeRef.current = "select";
156169
setOpen(true);
157170
return;
158171
}
@@ -165,6 +178,7 @@ export default function RepoPicker({
165178

166179
if ((event.key === "Enter" || event.key === " ") && !open) {
167180
event.preventDefault();
181+
openFocusModeRef.current = "select";
168182
setOpen(true);
169183
return;
170184
}
@@ -211,7 +225,14 @@ export default function RepoPicker({
211225
<button
212226
type="button"
213227
className={`${styles.trigger} ${value ? "" : styles.placeholder}`}
214-
onClick={() => setOpen((prev) => !prev)}
228+
onClick={() =>
229+
setOpen((prev) => {
230+
if (!prev) {
231+
openFocusModeRef.current = "select";
232+
}
233+
return !prev;
234+
})
235+
}
215236
onKeyDown={handleTriggerKeyDown}
216237
aria-haspopup="listbox"
217238
aria-expanded={open}

0 commit comments

Comments
 (0)