Skip to content

Commit 11d3e94

Browse files
authored
Add ability to update Chat()'s input placeholder (#1594)
1 parent 4113a25 commit 11d3e94

File tree

5 files changed

+47
-13
lines changed

5 files changed

+47
-13
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### New features
1111

12+
* `ui.Chat()` gains a new `.update_user_input()` method, which adds the ability to update the input placeholder message. As a result, `.set_user_message()` is now deprecated (since the new method can also be used to update the message). (#1594)
13+
1214
### Other changes
1315

1416
### Bug fixes

js/chat/chat.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,19 @@ type requestScrollEvent = {
2727
cancelIfScrolledUp: boolean;
2828
};
2929

30+
type UpdateUserInput = {
31+
value?: string;
32+
placeholder?: string;
33+
};
34+
3035
// https://github.com/microsoft/TypeScript/issues/28357#issuecomment-748550734
3136
declare global {
3237
interface GlobalEventHandlersEventMap {
3338
"shiny-chat-input-sent": CustomEvent<Message>;
3439
"shiny-chat-append-message": CustomEvent<Message>;
3540
"shiny-chat-append-message-chunk": CustomEvent<Message>;
3641
"shiny-chat-clear-messages": CustomEvent;
37-
"shiny-chat-set-user-input": CustomEvent<string>;
42+
"shiny-chat-update-user-input": CustomEvent<UpdateUserInput>;
3843
"shiny-chat-remove-loading-message": CustomEvent;
3944
"shiny-chat-request-scroll": CustomEvent<requestScrollEvent>;
4045
}
@@ -270,7 +275,7 @@ class ChatContainer extends LightElement {
270275
this.#onAppendChunk
271276
);
272277
this.addEventListener("shiny-chat-clear-messages", this.#onClear);
273-
this.addEventListener("shiny-chat-set-user-input", this.#onSetUserInput);
278+
this.addEventListener("shiny-chat-update-user-input", this.#onUpdateUserInput);
274279
this.addEventListener(
275280
"shiny-chat-remove-loading-message",
276281
this.#onRemoveLoadingMessage
@@ -291,7 +296,10 @@ class ChatContainer extends LightElement {
291296
this.#onAppendChunk
292297
);
293298
this.removeEventListener("shiny-chat-clear-messages", this.#onClear);
294-
this.removeEventListener("shiny-chat-set-user-input", this.#onSetUserInput);
299+
this.removeEventListener(
300+
"shiny-chat-update-user-input",
301+
this.#onUpdateUserInput
302+
);
295303
this.removeEventListener(
296304
"shiny-chat-remove-loading-message",
297305
this.#onRemoveLoadingMessage
@@ -373,8 +381,14 @@ class ChatContainer extends LightElement {
373381
this.messages.innerHTML = "";
374382
}
375383

376-
#onSetUserInput(event: CustomEvent<string>): void {
377-
this.input.setInputValue(event.detail);
384+
#onUpdateUserInput(event: CustomEvent<UpdateUserInput>): void {
385+
const { value, placeholder } = event.detail;
386+
if (value !== undefined) {
387+
this.input.setInputValue(value);
388+
}
389+
if (placeholder !== undefined) {
390+
this.input.placeholder = placeholder;
391+
}
378392
}
379393

380394
#onRemoveLoadingMessage(): void {

shiny/ui/_chat.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from htmltools import HTML, Tag, TagAttrValue, css
2020

2121
from .. import _utils, reactive
22+
from .._deprecated import warn_deprecated
2223
from .._docstring import add_example
2324
from .._namespaces import ResolvedId, resolve_id
2425
from ..session import require_active_session, session_context
@@ -933,27 +934,44 @@ def _user_input(self) -> str:
933934
id = self.user_input_id
934935
return cast(str, self._session.input[id]())
935936

936-
def set_user_message(self, value: str):
937+
def update_user_input(
938+
self, *, value: str | None = None, placeholder: str | None = None
939+
):
937940
"""
938-
Set the user's message.
941+
Update the user input.
939942
940943
Parameters
941944
----------
942945
value
943946
The value to set the user input to.
947+
placeholder
948+
The placeholder text for the user input.
944949
"""
945950

951+
obj = _utils.drop_none({"value": value, "placeholder": placeholder})
952+
946953
_utils.run_coro_sync(
947954
self._session.send_custom_message(
948955
"shinyChatMessage",
949956
{
950957
"id": self.id,
951-
"handler": "shiny-chat-set-user-input",
952-
"obj": value,
958+
"handler": "shiny-chat-update-user-input",
959+
"obj": obj,
953960
},
954961
)
955962
)
956963

964+
def set_user_message(self, value: str):
965+
"""
966+
Deprecated. Use `update_user_input(value=value)` instead.
967+
"""
968+
969+
warn_deprecated(
970+
"set_user_message() is deprecated. Use update_user_input(value=value) instead."
971+
)
972+
973+
self.update_user_input(value=value)
974+
957975
async def clear_messages(self):
958976
"""
959977
Clear all chat messages.

shiny/www/py-shiny/chat/chat.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

shiny/www/py-shiny/chat/chat.js.map

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)