diff --git a/1000-hours/package.json b/1000-hours/package.json
index f818b1ab..f5ea4794 100644
--- a/1000-hours/package.json
+++ b/1000-hours/package.json
@@ -20,6 +20,6 @@
},
"dependencies": {
"cheerio": "^1.0.0",
- "swiper": "^11.1.14"
+ "swiper": "^11.1.15"
}
}
diff --git a/enjoy/lib/whisper.cpp/x64/linux/.keep b/enjoy/lib/whisper.cpp/x64/linux/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/enjoy/lib/whisper.cpp/x64/win32/.keep b/enjoy/lib/whisper.cpp/x64/win32/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/enjoy/package.json b/enjoy/package.json
index eea0f59e..6ab87a89 100644
--- a/enjoy/package.json
+++ b/enjoy/package.json
@@ -40,7 +40,7 @@
"@electron-forge/plugin-vite": "<7.5.0",
"@electron-forge/publisher-github": "<7.5.0",
"@electron/fuses": "^1.8.0",
- "@playwright/test": "^1.48.2",
+ "@playwright/test": "^1.49.0",
"@tailwindcss/typography": "^0.5.15",
"@types/ahoy.js": "^0.4.2",
"@types/autosize": "^4.0.3",
@@ -62,8 +62,8 @@
"@types/unzipper": "^0.10.10",
"@types/validator": "^13.12.2",
"@types/wavesurfer.js": "^6.0.12",
- "@typescript-eslint/eslint-plugin": "^8.14.0",
- "@typescript-eslint/parser": "^8.14.0",
+ "@typescript-eslint/eslint-plugin": "^8.15.0",
+ "@typescript-eslint/parser": "^8.15.0",
"@vitejs/plugin-react": "^4.3.3",
"autoprefixer": "^10.4.20",
"electron": "^33.2.0",
diff --git a/enjoy/src/renderer/components/documents/document-player.tsx b/enjoy/src/renderer/components/documents/document-player.tsx
index 7ee1a5e5..eb8d71aa 100644
--- a/enjoy/src/renderer/components/documents/document-player.tsx
+++ b/enjoy/src/renderer/components/documents/document-player.tsx
@@ -199,7 +199,12 @@ export const DocumentPlayer = () => {
data-tooltip-id="global-tooltip"
variant="outline"
size="icon"
- onClick={() => locateSegment(playingSegment.id)}
+ onClick={() => {
+ const el = locateSegment(playingSegment.id);
+ if (el) {
+ el.scrollIntoView({ behavior: "smooth" });
+ }
+ }}
>
diff --git a/enjoy/src/renderer/components/layouts/index.ts b/enjoy/src/renderer/components/layouts/index.ts
index 325b6fdc..b5c87d97 100644
--- a/enjoy/src/renderer/components/layouts/index.ts
+++ b/enjoy/src/renderer/components/layouts/index.ts
@@ -1,2 +1,3 @@
export * from "./layout";
export * from "./title-bar";
+export * from "./sidebar";
diff --git a/enjoy/src/renderer/components/misc/sidebar.tsx b/enjoy/src/renderer/components/layouts/sidebar.tsx
similarity index 80%
rename from enjoy/src/renderer/components/misc/sidebar.tsx
rename to enjoy/src/renderer/components/layouts/sidebar.tsx
index 62843bd1..4287b343 100644
--- a/enjoy/src/renderer/components/misc/sidebar.tsx
+++ b/enjoy/src/renderer/components/layouts/sidebar.tsx
@@ -32,6 +32,7 @@ import {
PanelLeftCloseIcon,
ChevronsUpDownIcon,
LogOutIcon,
+ CreditCardIcon,
} from "lucide-react";
import { useLocation, Link, useNavigate } from "react-router-dom";
import { t } from "i18next";
@@ -46,7 +47,7 @@ export const Sidebar = () => {
const activeTab = location.pathname;
const { EnjoyApp, cable, displayPreferences, setDisplayPreferences } =
useContext(AppSettingsProviderContext);
- const [isOpen, setIsOpen] = useState(true);
+ const [isCollapsed, setIsCollapsed] = useState(false);
useEffect(() => {
if (!cable) return;
@@ -61,14 +62,14 @@ export const Sidebar = () => {
// Save the sidebar state to cache
useEffect(() => {
- EnjoyApp.cacheObjects.set("sidebarOpen", isOpen);
- }, [isOpen]);
+ EnjoyApp.cacheObjects.set("sidebarOpen", isCollapsed);
+ }, [isCollapsed]);
// Restore the sidebar state from cache
useEffect(() => {
EnjoyApp.cacheObjects.get("sidebarOpen").then((value) => {
if (value !== undefined) {
- setIsOpen(!!value);
+ setIsCollapsed(!!value);
}
});
}, []);
@@ -76,17 +77,17 @@ export const Sidebar = () => {
return (
-
+
{
tooltip={t("sidebar.home")}
active={activeTab === "/"}
Icon={HomeIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
{
tooltip={t("sidebar.chats")}
active={activeTab.startsWith("/chats")}
Icon={MessagesSquareIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
{
tooltip={t("sidebar.courses")}
active={activeTab.startsWith("/courses")}
Icon={GraduationCapIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
@@ -123,7 +124,7 @@ export const Sidebar = () => {
tooltip={t("sidebar.audios")}
active={activeTab.startsWith("/audios")}
Icon={HeadphonesIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
{
tooltip={t("sidebar.videos")}
active={activeTab.startsWith("/videos")}
Icon={VideoIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
{
tooltip={t("sidebar.documents")}
active={activeTab.startsWith("/documents")}
Icon={NewspaperIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
@@ -153,7 +154,7 @@ export const Sidebar = () => {
active={activeTab.startsWith("/conversations")}
Icon={BotIcon}
testid="sidebar-conversations"
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
{
active={activeTab.startsWith("/pronunciation_assessments")}
Icon={SpeechIcon}
testid="sidebar-pronunciation-assessments"
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
{
tooltip={t("sidebar.notes")}
active={activeTab === "/notes"}
Icon={NotebookPenIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
{
tooltip={t("sidebar.vocabulary")}
active={activeTab.startsWith("/vocabulary")}
Icon={BookMarkedIcon}
- isOpen={isOpen}
+ isCollapsed={isCollapsed}
/>
@@ -192,7 +193,7 @@ export const Sidebar = () => {
variant={displayPreferences ? "default" : "ghost"}
id="preferences-button"
className={`w-full ${
- isOpen ? "justify-start" : "justify-center"
+ isCollapsed ? "justify-center" : "justify-start"
}`}
data-tooltip-id="global-tooltip"
data-tooltip-content={t("sidebar.preferences")}
@@ -200,7 +201,7 @@ export const Sidebar = () => {
onClick={() => setDisplayPreferences(true)}
>
- {isOpen && (
+ {!isCollapsed && (
{t("sidebar.preferences")}
)}
@@ -228,16 +229,18 @@ export const Sidebar = () => {
size="sm"
variant="ghost"
className={`w-full non-draggable-region ${
- isOpen ? "justify-start" : "justify-center"
+ isCollapsed ? "justify-center" : "justify-start"
}`}
- onClick={() => setIsOpen(!isOpen)}
+ onClick={() => setIsCollapsed(!isCollapsed)}
>
- {isOpen ? (
-
- ) : (
+ {isCollapsed ? (
+ ) : (
+
+ )}
+ {!isCollapsed && (
+ {t("sidebar.collapse")}
)}
- {isOpen && {t("sidebar.collapse")} }
@@ -252,9 +255,9 @@ const SidebarItem = (props: {
active: boolean;
Icon: LucideIcon;
testid?: string;
- isOpen: boolean;
+ isCollapsed: boolean;
}) => {
- const { href, label, tooltip, active, Icon, testid, isOpen } = props;
+ const { href, label, tooltip, active, Icon, testid, isCollapsed } = props;
return (
- {isOpen &&
{label}}
+ {!isCollapsed &&
{label}}
);
};
-const SidebarHeader = (props: { isOpen: boolean }) => {
- const { isOpen } = props;
- const { user, logout } = useContext(AppSettingsProviderContext);
+const SidebarHeader = (props: { isCollapsed: boolean }) => {
+ const { isCollapsed } = props;
+ const { user, logout, refreshAccount, setDisplayDepositDialog } = useContext(
+ AppSettingsProviderContext
+ );
+ const [open, setOpen] = useState(false);
const navigate = useNavigate();
+ useEffect(() => {
+ if (open) {
+ refreshAccount?.();
+ }
+ }, [open]);
+
if (!user) {
return null;
}
return (
-
+