Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 05790a6

Browse files
authored
UX: convert AI gist disclosure to a toggle (#878)
1 parent e7a66b0 commit 05790a6

File tree

8 files changed

+123
-45
lines changed

8 files changed

+123
-45
lines changed

assets/javascripts/discourse/components/ai-gist-disclosure.gjs

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import Component from "@glimmer/component";
2+
import { concat, fn } from "@ember/helper";
3+
import { action } from "@ember/object";
4+
import { service } from "@ember/service";
5+
import DButton from "discourse/components/d-button";
6+
import DropdownMenu from "discourse/components/dropdown-menu";
7+
import icon from "discourse-common/helpers/d-icon";
8+
import i18n from "discourse-common/helpers/i18n";
9+
import DMenu from "float-kit/components/d-menu";
10+
11+
export default class AiGistToggle extends Component {
12+
@service router;
13+
@service gistPreference;
14+
15+
get shouldShow() {
16+
return this.router.currentRoute.attributes?.list?.topics?.some(
17+
(topic) => topic.ai_topic_gist
18+
);
19+
}
20+
21+
get buttons() {
22+
return [
23+
{
24+
id: "gists_enabled",
25+
label: "discourse_ai.summarization.gists_enabled_long",
26+
icon: "discourse-sparkles",
27+
},
28+
{
29+
id: "gists_disabled",
30+
label: "discourse_ai.summarization.gists_disabled",
31+
icon: "far-eye-slash",
32+
},
33+
];
34+
}
35+
36+
@action
37+
onRegisterApi(api) {
38+
this.dMenu = api;
39+
}
40+
41+
@action
42+
onSelect(optionId) {
43+
this.gistPreference.setPreference(optionId);
44+
this.dMenu.close();
45+
}
46+
47+
<template>
48+
{{#if this.shouldShow}}
49+
50+
<DMenu
51+
@modalForMobile={{true}}
52+
@autofocus={{true}}
53+
@identifier="ai-gists-dropdown"
54+
@onRegisterApi={{this.onRegisterApi}}
55+
@triggerClass="btn-transparent"
56+
>
57+
<:trigger>
58+
<span class="d-button-label">
59+
{{i18n
60+
(concat
61+
"discourse_ai.summarization." this.gistPreference.preference
62+
)
63+
}}
64+
</span>
65+
{{icon "angle-down"}}
66+
</:trigger>
67+
<:content>
68+
<DropdownMenu as |dropdown|>
69+
{{#each this.buttons as |button|}}
70+
<dropdown.item>
71+
<DButton
72+
@label={{button.label}}
73+
@icon={{button.icon}}
74+
class="btn-transparent"
75+
@action={{fn this.onSelect button.id}}
76+
/>
77+
</dropdown.item>
78+
{{/each}}
79+
</DropdownMenu>
80+
</:content>
81+
</DMenu>
82+
{{/if}}
83+
</template>
84+
}

assets/javascripts/discourse/components/ai-topic-gist.gjs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@ import { service } from "@ember/service";
33

44
export default class AiTopicGist extends Component {
55
@service router;
6+
@service gistPreference;
7+
8+
get prefersGist() {
9+
return this.gistPreference.preference === "gists_enabled";
10+
}
611

712
get showGist() {
813
return (
914
this.router.currentRoute.attributes?.filterType === "hot" &&
1015
this.args.topic?.ai_topic_gist &&
16+
!this.args.topic?.excerpt &&
17+
this.prefersGist &&
1118
!this.args.topic?.excerpt
1219
);
1320
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import Component from "@glimmer/component";
2-
import AiGistDisclosure from "../../components/ai-gist-disclosure";
2+
import AiGistToggle from "../../components/ai-gist-toggle";
33

4-
export default class AiTopicGistDisclosure extends Component {
4+
export default class AiTopicGistToggle extends Component {
55
static shouldRender(outletArgs, helper) {
66
const isMobileView = helper.site.mobileView;
77
return isMobileView;
88
}
99

1010
<template>
11-
<AiGistDisclosure />
11+
<AiGistToggle />
1212
</template>
1313
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Component from "@glimmer/component";
2-
import AiGistDisclosure from "../../components/ai-gist-disclosure";
2+
import AiGistToggle from "../../components/ai-gist-toggle";
33

44
export default class AiTopicGist extends Component {
55
static shouldRender(outletArgs) {
@@ -11,6 +11,6 @@ export default class AiTopicGist extends Component {
1111
}
1212

1313
<template>
14-
<AiGistDisclosure />
14+
<AiGistToggle />
1515
</template>
1616
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { tracked } from "@glimmer/tracking";
2+
import Service from "@ember/service";
3+
4+
export default class GistPreference extends Service {
5+
@tracked
6+
preference = localStorage.getItem("aiGistPreference") || "gists_disabled";
7+
8+
setPreference(value) {
9+
this.preference = value;
10+
localStorage.setItem("aiGistPreference", value);
11+
}
12+
}

assets/stylesheets/modules/summarization/common/ai-summary.scss

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -238,22 +238,18 @@
238238
color: var(--primary-medium);
239239
}
240240
}
241+
}
241242

242-
&__disclosure {
243-
font-size: var(--font-down-1);
244-
color: var(--primary-600);
245-
.desktop-view & {
246-
margin-left: 0.5em;
247-
}
248-
.mobile-view & {
249-
display: block;
250-
margin-top: -0.5em;
251-
margin-bottom: 0.5em;
252-
}
253-
.d-icon {
254-
font-size: var(--font-down-1);
255-
position: relative;
256-
top: -0.05em; // improve vertical alignment
257-
}
243+
.ai-gists-dropdown-trigger {
244+
font-size: var(--font-down-1);
245+
color: var(--primary-medium);
246+
padding-left: 0.25em;
247+
.mobile-view & {
248+
padding-left: 0;
249+
color: var(--primary-high);
250+
}
251+
.d-icon {
252+
color: var(--primary-low-mid);
253+
margin-left: 0.15em;
258254
}
259255
}

config/locales/client.en.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,9 @@ en:
465465
topic:
466466
title: "Topic summary"
467467
close: "Close summary panel"
468-
disclosure: "Summaries generated by AI"
468+
gists_enabled: "with summary"
469+
gists_enabled_long: "with AI-generated summary"
470+
gists_disabled: "without summary"
469471
review:
470472
types:
471473
reviewable_ai_post:

0 commit comments

Comments
 (0)