UX improvements: clearer copy, consistent naming, no fabricated replies - #12
UX improvements: clearer copy, consistent naming, no fabricated replies#12alfredodelfabro wants to merge 9 commits into
Conversation
- Normalize display name and help header to 'Time-off' - Reword the not-started notification to clarify auto-reply is off
Add i18n description and params example so the slash command autocomplete shows helpful usage text before the command runs.
Reword the 'not marked as Time Off' status reply to match the not-started message, clarifying that auto-replies are off.
Replace the preview LayoutBlock with a section that quotes the user's left-behind message using markdown blockquote formatting.
Reword the start confirmation to emphasize the app only auto-replies to DMs and that the user must manually end with /time-off end. Show the custom reply message as a blockquote when one is provided.
The app no longer stores or sends a default out-of-office message the user never wrote. When no custom message is set, senders simply see that the user is on time off, and the start confirmation and status command note that no custom reply message was set.
scuciatto
left a comment
There was a problem hiding this comment.
Requesting one change before merge: the legacy-message gap described in the inline comment. Everything else in the PR looks good.
| ): Promise<void> { | ||
| const formattedMessage = TimeOffMessageFormatter.format(receiver.username, timeOffMessage); | ||
| await this.notifier.notifyUser(message.room, sender, timeOffMessage, formattedMessage); | ||
| const fallbackText = timeOffMessage |
There was a problem hiding this comment.
Legacy-message gap: entries created before this PR have the old default "I am out of office, I will get back to you soon." persisted in message — the previous Start.ts wrote it into the record at save time. For anyone already on time off when this version deploys, this branch still sees a truthy message, so the app keeps sending the fabricated text — now explicitly framed as "They left the following message:", i.e. presented as something the user personally wrote. /time-off status has the same problem, so the PR's headline goal (never put words in the user's mouth) silently fails for exactly those users, with no migration to fix it.
Suggested fix: normalize at read time in TimeOffRepository.findByUserId — if the stored message equals the legacy default string, treat it as unset:
const LEGACY_DEFAULT_REPLY_MESSAGE = 'I am out of office, I will get back to you soon.';
// in findByUserId, before returning:
if (timeOffEntry?.message === LEGACY_DEFAULT_REPLY_MESSAGE) {
timeOffEntry.message = undefined;
}A single read-time check covers both this handler and the status command, and it self-heals persistence: the next saveTimeOff (e.g. the cooldown-timestamp update) writes the record back without the legacy message.
Goals
Improve the Time-Off app's user-facing copy and behavior so it reads clearly, uses consistent naming, and never puts words in a user's mouth. These are UX refinements gathered from design feedback — no functional/data-model changes beyond how the reply message is stored.
Changes
Naming & copy consistency
Slash command discoverability
/time-off(before Enter) shows a friendly hint: "Manage your time off — start, end, or check your status" withstart | end | status | help.Clearer start confirmation
/time-off startconfirmation to emphasize the app only auto-replies to DMs and that the user must manually end with/time-off end.Stop sending fabricated messages on the user's behalf
messageis now optional on the time-off entry;/time-off statusreflects whether a custom reply message was set.DM reply presentation
previewlayout block with a section that renders the user's message as a>blockquote.Notes