Skip to content

Commit 59bcb43

Browse files
authored
Update sidebar (#1188)
* refactor * fix build * refactor * refactor * display deposit in sidebar header menu * minor fix * fix * fix document locate
1 parent 73eb029 commit 59bcb43

File tree

15 files changed

+422
-362
lines changed

15 files changed

+422
-362
lines changed

1000-hours/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@
2020
},
2121
"dependencies": {
2222
"cheerio": "^1.0.0",
23-
"swiper": "^11.1.14"
23+
"swiper": "^11.1.15"
2424
}
2525
}

enjoy/lib/whisper.cpp/x64/linux/.keep

Whitespace-only changes.

enjoy/lib/whisper.cpp/x64/win32/.keep

Whitespace-only changes.

enjoy/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"@electron-forge/plugin-vite": "<7.5.0",
4141
"@electron-forge/publisher-github": "<7.5.0",
4242
"@electron/fuses": "^1.8.0",
43-
"@playwright/test": "^1.48.2",
43+
"@playwright/test": "^1.49.0",
4444
"@tailwindcss/typography": "^0.5.15",
4545
"@types/ahoy.js": "^0.4.2",
4646
"@types/autosize": "^4.0.3",
@@ -62,8 +62,8 @@
6262
"@types/unzipper": "^0.10.10",
6363
"@types/validator": "^13.12.2",
6464
"@types/wavesurfer.js": "^6.0.12",
65-
"@typescript-eslint/eslint-plugin": "^8.14.0",
66-
"@typescript-eslint/parser": "^8.14.0",
65+
"@typescript-eslint/eslint-plugin": "^8.15.0",
66+
"@typescript-eslint/parser": "^8.15.0",
6767
"@vitejs/plugin-react": "^4.3.3",
6868
"autoprefixer": "^10.4.20",
6969
"electron": "^33.2.0",

enjoy/src/renderer/components/documents/document-player.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,12 @@ export const DocumentPlayer = () => {
199199
data-tooltip-id="global-tooltip"
200200
variant="outline"
201201
size="icon"
202-
onClick={() => locateSegment(playingSegment.id)}
202+
onClick={() => {
203+
const el = locateSegment(playingSegment.id);
204+
if (el) {
205+
el.scrollIntoView({ behavior: "smooth" });
206+
}
207+
}}
203208
>
204209
<LocateFixedIcon className="w-4 h-4" />
205210
</Button>
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from "./layout";
22
export * from "./title-bar";
3+
export * from "./sidebar";

enjoy/src/renderer/components/misc/sidebar.tsx renamed to enjoy/src/renderer/components/layouts/sidebar.tsx

+55-35
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
PanelLeftCloseIcon,
3333
ChevronsUpDownIcon,
3434
LogOutIcon,
35+
CreditCardIcon,
3536
} from "lucide-react";
3637
import { useLocation, Link, useNavigate } from "react-router-dom";
3738
import { t } from "i18next";
@@ -46,7 +47,7 @@ export const Sidebar = () => {
4647
const activeTab = location.pathname;
4748
const { EnjoyApp, cable, displayPreferences, setDisplayPreferences } =
4849
useContext(AppSettingsProviderContext);
49-
const [isOpen, setIsOpen] = useState(true);
50+
const [isCollapsed, setIsCollapsed] = useState(false);
5051

5152
useEffect(() => {
5253
if (!cable) return;
@@ -61,40 +62,40 @@ export const Sidebar = () => {
6162

6263
// Save the sidebar state to cache
6364
useEffect(() => {
64-
EnjoyApp.cacheObjects.set("sidebarOpen", isOpen);
65-
}, [isOpen]);
65+
EnjoyApp.cacheObjects.set("sidebarOpen", isCollapsed);
66+
}, [isCollapsed]);
6667

6768
// Restore the sidebar state from cache
6869
useEffect(() => {
6970
EnjoyApp.cacheObjects.get("sidebarOpen").then((value) => {
7071
if (value !== undefined) {
71-
setIsOpen(!!value);
72+
setIsCollapsed(!!value);
7273
}
7374
});
7475
}, []);
7576

7677
return (
7778
<div
7879
className={`h-[calc(100vh-2rem)] pt-8 transition-all relative draggable-region ${
79-
isOpen ? "w-48" : "w-12"
80+
isCollapsed ? "w-12" : "w-48"
8081
}`}
8182
data-testid="sidebar"
8283
>
8384
<div
8485
className={`fixed top-0 left-0 h-full bg-muted ${
85-
isOpen ? "w-48" : "w-12"
86+
isCollapsed ? "w-12" : "w-48"
8687
}`}
8788
>
8889
<ScrollArea className="w-full h-full pb-12 pt-8">
89-
<SidebarHeader isOpen={isOpen} />
90+
<SidebarHeader isCollapsed={isCollapsed} />
9091
<div className="grid gap-2 mb-4">
9192
<SidebarItem
9293
href="/"
9394
label={t("sidebar.home")}
9495
tooltip={t("sidebar.home")}
9596
active={activeTab === "/"}
9697
Icon={HomeIcon}
97-
isOpen={isOpen}
98+
isCollapsed={isCollapsed}
9899
/>
99100

100101
<SidebarItem
@@ -103,7 +104,7 @@ export const Sidebar = () => {
103104
tooltip={t("sidebar.chats")}
104105
active={activeTab.startsWith("/chats")}
105106
Icon={MessagesSquareIcon}
106-
isOpen={isOpen}
107+
isCollapsed={isCollapsed}
107108
/>
108109

109110
<SidebarItem
@@ -112,7 +113,7 @@ export const Sidebar = () => {
112113
tooltip={t("sidebar.courses")}
113114
active={activeTab.startsWith("/courses")}
114115
Icon={GraduationCapIcon}
115-
isOpen={isOpen}
116+
isCollapsed={isCollapsed}
116117
/>
117118

118119
<Separator />
@@ -123,7 +124,7 @@ export const Sidebar = () => {
123124
tooltip={t("sidebar.audios")}
124125
active={activeTab.startsWith("/audios")}
125126
Icon={HeadphonesIcon}
126-
isOpen={isOpen}
127+
isCollapsed={isCollapsed}
127128
/>
128129

129130
<SidebarItem
@@ -132,7 +133,7 @@ export const Sidebar = () => {
132133
tooltip={t("sidebar.videos")}
133134
active={activeTab.startsWith("/videos")}
134135
Icon={VideoIcon}
135-
isOpen={isOpen}
136+
isCollapsed={isCollapsed}
136137
/>
137138

138139
<SidebarItem
@@ -141,7 +142,7 @@ export const Sidebar = () => {
141142
tooltip={t("sidebar.documents")}
142143
active={activeTab.startsWith("/documents")}
143144
Icon={NewspaperIcon}
144-
isOpen={isOpen}
145+
isCollapsed={isCollapsed}
145146
/>
146147

147148
<Separator />
@@ -153,7 +154,7 @@ export const Sidebar = () => {
153154
active={activeTab.startsWith("/conversations")}
154155
Icon={BotIcon}
155156
testid="sidebar-conversations"
156-
isOpen={isOpen}
157+
isCollapsed={isCollapsed}
157158
/>
158159

159160
<SidebarItem
@@ -163,7 +164,7 @@ export const Sidebar = () => {
163164
active={activeTab.startsWith("/pronunciation_assessments")}
164165
Icon={SpeechIcon}
165166
testid="sidebar-pronunciation-assessments"
166-
isOpen={isOpen}
167+
isCollapsed={isCollapsed}
167168
/>
168169

169170
<SidebarItem
@@ -172,7 +173,7 @@ export const Sidebar = () => {
172173
tooltip={t("sidebar.notes")}
173174
active={activeTab === "/notes"}
174175
Icon={NotebookPenIcon}
175-
isOpen={isOpen}
176+
isCollapsed={isCollapsed}
176177
/>
177178

178179
<SidebarItem
@@ -181,7 +182,7 @@ export const Sidebar = () => {
181182
tooltip={t("sidebar.vocabulary")}
182183
active={activeTab.startsWith("/vocabulary")}
183184
Icon={BookMarkedIcon}
184-
isOpen={isOpen}
185+
isCollapsed={isCollapsed}
185186
/>
186187

187188
<Separator />
@@ -192,15 +193,15 @@ export const Sidebar = () => {
192193
variant={displayPreferences ? "default" : "ghost"}
193194
id="preferences-button"
194195
className={`w-full ${
195-
isOpen ? "justify-start" : "justify-center"
196+
isCollapsed ? "justify-center" : "justify-start"
196197
}`}
197198
data-tooltip-id="global-tooltip"
198199
data-tooltip-content={t("sidebar.preferences")}
199200
data-tooltip-place="right"
200201
onClick={() => setDisplayPreferences(true)}
201202
>
202203
<SettingsIcon className="size-4" />
203-
{isOpen && (
204+
{!isCollapsed && (
204205
<span className="ml-2"> {t("sidebar.preferences")} </span>
205206
)}
206207
</Button>
@@ -228,16 +229,18 @@ export const Sidebar = () => {
228229
size="sm"
229230
variant="ghost"
230231
className={`w-full non-draggable-region ${
231-
isOpen ? "justify-start" : "justify-center"
232+
isCollapsed ? "justify-center" : "justify-start"
232233
}`}
233-
onClick={() => setIsOpen(!isOpen)}
234+
onClick={() => setIsCollapsed(!isCollapsed)}
234235
>
235-
{isOpen ? (
236-
<PanelLeftCloseIcon className="size-4" />
237-
) : (
236+
{isCollapsed ? (
238237
<PanelLeftOpenIcon className="size-4" />
238+
) : (
239+
<PanelLeftCloseIcon className="size-4" />
240+
)}
241+
{!isCollapsed && (
242+
<span className="ml-2"> {t("sidebar.collapse")} </span>
239243
)}
240-
{isOpen && <span className="ml-2"> {t("sidebar.collapse")} </span>}
241244
</Button>
242245
</div>
243246
</div>
@@ -252,9 +255,9 @@ const SidebarItem = (props: {
252255
active: boolean;
253256
Icon: LucideIcon;
254257
testid?: string;
255-
isOpen: boolean;
258+
isCollapsed: boolean;
256259
}) => {
257-
const { href, label, tooltip, active, Icon, testid, isOpen } = props;
260+
const { href, label, tooltip, active, Icon, testid, isCollapsed } = props;
258261

259262
return (
260263
<Link
@@ -268,38 +271,47 @@ const SidebarItem = (props: {
268271
<Button
269272
size="sm"
270273
variant={active ? "default" : "ghost"}
271-
className={`w-full ${isOpen ? "justify-start" : "justify-center"}`}
274+
className={`w-full ${isCollapsed ? "justify-center" : "justify-start"}`}
272275
>
273276
<Icon className="size-4" />
274-
{isOpen && <span className="ml-2">{label}</span>}
277+
{!isCollapsed && <span className="ml-2">{label}</span>}
275278
</Button>
276279
</Link>
277280
);
278281
};
279282

280-
const SidebarHeader = (props: { isOpen: boolean }) => {
281-
const { isOpen } = props;
282-
const { user, logout } = useContext(AppSettingsProviderContext);
283+
const SidebarHeader = (props: { isCollapsed: boolean }) => {
284+
const { isCollapsed } = props;
285+
const { user, logout, refreshAccount, setDisplayDepositDialog } = useContext(
286+
AppSettingsProviderContext
287+
);
288+
const [open, setOpen] = useState(false);
283289
const navigate = useNavigate();
284290

291+
useEffect(() => {
292+
if (open) {
293+
refreshAccount?.();
294+
}
295+
}, [open]);
296+
285297
if (!user) {
286298
return null;
287299
}
288300

289301
return (
290302
<div className="py-3 px-1 sticky top-0 bg-muted z-10 non-draggable-region">
291-
<DropdownMenu>
303+
<DropdownMenu open={open} onOpenChange={setOpen}>
292304
<DropdownMenuTrigger asChild>
293305
<Button
294306
variant="ghost"
295307
className={`w-full h-12 hover:bg-background ${
296-
isOpen ? "justify-start" : "justify-center px-1"
308+
isCollapsed ? "justify-center px-1" : "justify-start"
297309
}`}
298310
>
299311
<Avatar className="size-8">
300312
<AvatarImage src={user.avatarUrl} />
301313
</Avatar>
302-
{isOpen && (
314+
{!isCollapsed && (
303315
<>
304316
<div className="ml-2 flex flex-col leading-none">
305317
<span className="text-left text-sm font-medium line-clamp-1">
@@ -334,6 +346,14 @@ const SidebarHeader = (props: { isOpen: boolean }) => {
334346
<UsersRoundIcon className="size-4 ml-auto" />
335347
</DropdownMenuItem>
336348
<DropdownMenuSeparator />
349+
<DropdownMenuItem
350+
onSelect={() => setDisplayDepositDialog(true)}
351+
className="cursor-pointer"
352+
>
353+
<span className="flex-1 truncate">${user.balance}</span>
354+
<CreditCardIcon className="size-4 ml-auto" />
355+
</DropdownMenuItem>
356+
<DropdownMenuSeparator />
337357
<DropdownMenuItem onSelect={logout} className="cursor-pointer">
338358
<span>{t("logout")}</span>
339359
<LogOutIcon className="size-4 ml-auto" />

enjoy/src/renderer/components/misc/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ export * from "./markdown-wrapper";
44
export * from "./no-records-found";
55
export * from "./page-placeholder";
66
export * from "./universal-player";
7-
export * from "./sidebar";
87
export * from "./wavesurfer-player";
98
export * from "./tts-form";
109
export * from "./gpt-form";

0 commit comments

Comments
 (0)