void;
+ onLogout: () => void;
+ user?: { avatar_url: string };
+}
+
+export function UserActions({
+ onClickAccountSettings,
+ onLogout,
+ user,
+}: UserActionsProps) {
+ const loginFetcher = useFetcher({ key: "login" });
+
+ const [accountContextMenuIsVisible, setAccountContextMenuIsVisible] =
+ React.useState(false);
+
+ const toggleAccountMenu = () => {
+ setAccountContextMenuIsVisible((prev) => !prev);
+ };
+
+ const closeAccountMenu = () => {
+ setAccountContextMenuIsVisible(false);
+ };
+
+ const handleClickAccountSettings = () => {
+ onClickAccountSettings();
+ closeAccountMenu();
+ };
+
+ const handleLogout = () => {
+ onLogout();
+ closeAccountMenu();
+ };
+
+ return (
+
+
+
+ {accountContextMenuIsVisible && (
+
+ )}
+
+ );
+}
diff --git a/frontend/src/components/user-avatar.tsx b/frontend/src/components/user-avatar.tsx
index 69d6e55709..88f09caf93 100644
--- a/frontend/src/components/user-avatar.tsx
+++ b/frontend/src/components/user-avatar.tsx
@@ -1,68 +1,39 @@
-import { cn } from "@nextui-org/react";
-import React from "react";
-import { isGitHubErrorReponse } from "#/api/github";
-import { AccountSettingsContextMenu } from "./account-settings-context-menu";
import { LoadingSpinner } from "./modals/LoadingProject";
import DefaultUserAvatar from "#/assets/default-user.svg?react";
+import { cn } from "#/utils/utils";
interface UserAvatarProps {
- isLoading: boolean;
- user: GitHubUser | GitHubErrorReponse | null;
- onLogout: () => void;
- handleOpenAccountSettingsModal: () => void;
+ onClick: () => void;
+ avatarUrl?: string;
+ isLoading?: boolean;
}
-export function UserAvatar({
- isLoading,
- user,
- onLogout,
- handleOpenAccountSettingsModal,
-}: UserAvatarProps) {
- const [accountContextMenuIsVisible, setAccountContextMenuIsVisible] =
- React.useState(false);
-
- const validUser = user && !isGitHubErrorReponse(user);
-
- const handleClickUserAvatar = () => {
- setAccountContextMenuIsVisible((prev) => !prev);
- };
-
+export function UserAvatar({ onClick, avatarUrl, isLoading }: UserAvatarProps) {
return (
-
-
- {accountContextMenuIsVisible && (
-
setAccountContextMenuIsVisible(false)}
- onClickAccountSettings={() => {
- setAccountContextMenuIsVisible(false);
- handleOpenAccountSettingsModal();
- }}
- onLogout={() => {
- onLogout();
- setAccountContextMenuIsVisible(false);
- }}
+
+ {!isLoading && !avatarUrl && (
+
+ )}
+ {isLoading &&
}
+
);
}
diff --git a/frontend/src/routes/_oh.tsx b/frontend/src/routes/_oh.tsx
index 573cb0dc5f..2d2597f2a4 100644
--- a/frontend/src/routes/_oh.tsx
+++ b/frontend/src/routes/_oh.tsx
@@ -17,7 +17,7 @@ import AccountSettingsModal from "#/components/modals/AccountSettingsModal";
import { DangerModal } from "#/components/modals/confirmation-modals/danger-modal";
import { LoadingSpinner } from "#/components/modals/LoadingProject";
import { ModalBackdrop } from "#/components/modals/modal-backdrop";
-import { UserAvatar } from "#/components/user-avatar";
+import { UserActions } from "#/components/user-actions";
import { useSocket } from "#/context/socket";
import i18n from "#/i18n";
import { getSettings, settingsAreUpToDate } from "#/services/settings";
@@ -97,7 +97,6 @@ export default function MainApp() {
const location = useLocation();
const { token, user, settingsIsUpdated, settings } =
useLoaderData
();
- const loginFetcher = useFetcher({ key: "login" });
const logoutFetcher = useFetcher({ key: "logout" });
const endSessionFetcher = useFetcher({ key: "end-session" });
@@ -192,13 +191,14 @@ export default function MainApp() {
)}