|
1 | | -import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react" |
2 | | -import { memo } from "react" |
3 | | -import { useAppTranslation } from "@/i18n/TranslationContext" |
| 1 | +import { useState, memo } from "react" |
4 | 2 | import { Trans } from "react-i18next" |
| 3 | +import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" |
| 4 | + |
| 5 | +import { useAppTranslation } from "@src/i18n/TranslationContext" |
| 6 | +import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@src/components/ui" |
5 | 7 |
|
6 | 8 | interface AnnouncementProps { |
7 | 9 | hideAnnouncement: () => void |
8 | 10 | } |
9 | | -/* |
10 | | -You must update the latestAnnouncementId in ClineProvider for new announcements to show to users. This new id will be compared with whats in state for the 'last announcement shown', and if it's different then the announcement will render. As soon as an announcement is shown, the id will be updated in state. This ensures that announcements are not shown more than once, even if the user doesn't close it themselves. |
11 | | -*/ |
12 | | -const Announcement = ({ hideAnnouncement }: AnnouncementProps) => { |
13 | | - const { t } = useAppTranslation() |
14 | 11 |
|
15 | | - const discordLink = ( |
16 | | - <VSCodeLink |
17 | | - href="https://discord.gg/roocode" |
18 | | - onClick={(e) => { |
19 | | - e.preventDefault() |
20 | | - window.postMessage( |
21 | | - { type: "action", action: "openExternal", data: { url: "https://discord.gg/roocode" } }, |
22 | | - "*", |
23 | | - ) |
24 | | - }}> |
25 | | - Discord |
26 | | - </VSCodeLink> |
27 | | - ) |
| 12 | +/** |
| 13 | + * You must update the `latestAnnouncementId` in ClineProvider for new |
| 14 | + * announcements to show to users. This new id will be compared with what's in |
| 15 | + * state for the 'last announcement shown', and if it's different then the |
| 16 | + * announcement will render. As soon as an announcement is shown, the id will be |
| 17 | + * updated in state. This ensures that announcements are not shown more than |
| 18 | + * once, even if the user doesn't close it themselves. |
| 19 | + */ |
28 | 20 |
|
29 | | - const redditLink = ( |
30 | | - <VSCodeLink |
31 | | - href="https://reddit.com/r/RooCode" |
32 | | - onClick={(e) => { |
33 | | - e.preventDefault() |
34 | | - window.postMessage( |
35 | | - { type: "action", action: "openExternal", data: { url: "https://reddit.com/r/RooCode" } }, |
36 | | - "*", |
37 | | - ) |
38 | | - }}> |
39 | | - Reddit |
40 | | - </VSCodeLink> |
41 | | - ) |
| 21 | +const Announcement = ({ hideAnnouncement }: AnnouncementProps) => { |
| 22 | + const { t } = useAppTranslation() |
| 23 | + const [open, setOpen] = useState(true) |
42 | 24 |
|
43 | 25 | return ( |
44 | | - <div className="flex flex-col justify-center absolute top-0 bottom-0 left-0 right-0 z-50 p-10 bg-black/50"> |
45 | | - <div className="bg-vscode-editor-background rounded-[3px] p-[12px_16px] m-[5px_15px] relative flex-shrink-0"> |
46 | | - <VSCodeButton |
47 | | - appearance="icon" |
48 | | - onClick={hideAnnouncement} |
49 | | - title={t("chat:announcement.hideButton")} |
50 | | - className="absolute top-2 right-2"> |
51 | | - <span className="codicon codicon-close"></span> |
52 | | - </VSCodeButton> |
53 | | - <h2 className="m-0 mb-2">{t("chat:announcement.title")}</h2> |
54 | | - |
55 | | - <p className="my-[5px]">{t("chat:announcement.description")}</p> |
56 | | - |
57 | | - <h3 className="mt-3 mb-[5px] text-sm">{t("chat:announcement.whatsNew")}</h3> |
58 | | - <ul className="my-[5px]"> |
59 | | - <li> |
60 | | - •{" "} |
61 | | - <Trans |
62 | | - i18nKey="chat:announcement.feature1" |
63 | | - components={{ |
64 | | - bold: <b />, |
65 | | - code: <code />, |
66 | | - }} |
67 | | - /> |
68 | | - </li> |
69 | | - <li> |
70 | | - •{" "} |
71 | | - <Trans |
72 | | - i18nKey="chat:announcement.feature2" |
73 | | - components={{ |
74 | | - bold: <b />, |
75 | | - code: <code />, |
76 | | - }} |
77 | | - /> |
78 | | - </li> |
79 | | - <li> |
80 | | - •{" "} |
81 | | - <Trans |
82 | | - i18nKey="chat:announcement.feature3" |
83 | | - components={{ |
84 | | - bold: <b />, |
85 | | - code: <code />, |
86 | | - }} |
87 | | - /> |
88 | | - </li> |
89 | | - </ul> |
| 26 | + <Dialog |
| 27 | + open={open} |
| 28 | + onOpenChange={(open) => { |
| 29 | + setOpen(open) |
90 | 30 |
|
91 | | - <p className="mt-2.5 mb-0"> |
| 31 | + if (!open) { |
| 32 | + hideAnnouncement() |
| 33 | + } |
| 34 | + }}> |
| 35 | + <DialogContent className="max-w-96"> |
| 36 | + <DialogHeader> |
| 37 | + <DialogTitle>{t("chat:announcement.title")}</DialogTitle> |
| 38 | + <DialogDescription>{t("chat:announcement.description")}</DialogDescription> |
| 39 | + </DialogHeader> |
| 40 | + <div> |
| 41 | + <h3>{t("chat:announcement.whatsNew")}</h3> |
| 42 | + <ul className="space-y-2"> |
| 43 | + <li> |
| 44 | + •{" "} |
| 45 | + <Trans i18nKey="chat:announcement.feature1" components={{ bold: <b />, code: <code /> }} /> |
| 46 | + </li> |
| 47 | + <li> |
| 48 | + •{" "} |
| 49 | + <Trans i18nKey="chat:announcement.feature2" components={{ bold: <b />, code: <code /> }} /> |
| 50 | + </li> |
| 51 | + <li> |
| 52 | + •{" "} |
| 53 | + <Trans i18nKey="chat:announcement.feature3" components={{ bold: <b />, code: <code /> }} /> |
| 54 | + </li> |
| 55 | + </ul> |
92 | 56 | <Trans |
93 | 57 | i18nKey="chat:announcement.detailsDiscussLinks" |
94 | | - components={{ |
95 | | - discordLink: discordLink, |
96 | | - redditLink: redditLink, |
97 | | - }} |
| 58 | + components={{ discordLink: <DiscordLink />, redditLink: <RedditLink /> }} |
98 | 59 | /> |
99 | | - </p> |
100 | | - </div> |
101 | | - </div> |
| 60 | + </div> |
| 61 | + </DialogContent> |
| 62 | + </Dialog> |
102 | 63 | ) |
103 | 64 | } |
104 | 65 |
|
| 66 | +const DiscordLink = () => ( |
| 67 | + <VSCodeLink |
| 68 | + href="https://discord.gg/roocode" |
| 69 | + onClick={(e) => { |
| 70 | + e.preventDefault() |
| 71 | + window.postMessage( |
| 72 | + { type: "action", action: "openExternal", data: { url: "https://discord.gg/roocode" } }, |
| 73 | + "*", |
| 74 | + ) |
| 75 | + }}> |
| 76 | + Discord |
| 77 | + </VSCodeLink> |
| 78 | +) |
| 79 | + |
| 80 | +const RedditLink = () => ( |
| 81 | + <VSCodeLink |
| 82 | + href="https://reddit.com/r/RooCode" |
| 83 | + onClick={(e) => { |
| 84 | + e.preventDefault() |
| 85 | + window.postMessage( |
| 86 | + { type: "action", action: "openExternal", data: { url: "https://reddit.com/r/RooCode" } }, |
| 87 | + "*", |
| 88 | + ) |
| 89 | + }}> |
| 90 | + Reddit |
| 91 | + </VSCodeLink> |
| 92 | +) |
| 93 | + |
105 | 94 | export default memo(Announcement) |
0 commit comments