From b3303f2aef42db66eb671cd184af154657065e86 Mon Sep 17 00:00:00 2001 From: denis0001-dev Date: Fri, 10 Oct 2025 11:25:45 +0300 Subject: [PATCH] Remove .. relative imports and replace with absolute paths --- frontend/src/core/api/authApi.ts | 10 +++++----- frontend/src/core/api/dmApi.ts | 14 ++++++------- frontend/src/core/api/profileApi.ts | 4 ++-- frontend/src/core/components/Dialog.tsx | 4 ++-- .../push-notifications/push-notifications.ts | 8 ++++---- frontend/src/core/websocket.ts | 2 +- frontend/src/pages/auth/LoginPage.tsx | 14 ++++++------- frontend/src/pages/auth/RegisterPage.tsx | 10 +++++----- frontend/src/pages/chat/hooks/useDM.ts | 6 +++--- frontend/src/pages/chat/hooks/useProfile.ts | 6 +++--- frontend/src/pages/chat/state.ts | 14 ++++++------- frontend/src/pages/chat/ui/ChatPage.tsx | 2 +- .../src/pages/chat/ui/left/ChatHeader.tsx | 6 +++--- frontend/src/pages/chat/ui/left/ChatTabs.tsx | 2 +- .../src/pages/chat/ui/left/DMUsersList.tsx | 8 ++++---- frontend/src/pages/chat/ui/left/LeftPanel.tsx | 8 ++++---- .../chat/ui/left/profile/ImageCropper.tsx | 2 +- .../chat/ui/left/profile/ProfileDialog.tsx | 10 +++++----- .../chat/ui/left/settings/SettingsDialog.tsx | 14 ++++++------- .../pages/chat/ui/right/ChatInputWrapper.tsx | 10 +++++----- .../pages/chat/ui/right/ChatMainHeader.tsx | 4 ++-- .../src/pages/chat/ui/right/ChatMessages.tsx | 16 +++++++-------- .../src/pages/chat/ui/right/EmojiMenu.tsx | 2 +- frontend/src/pages/chat/ui/right/Message.tsx | 20 +++++++++---------- .../chat/ui/right/MessageContextMenu.tsx | 2 +- .../chat/ui/right/MessagePanelRenderer.tsx | 10 +++++----- .../src/pages/chat/ui/right/RightPanel.tsx | 2 +- .../pages/chat/ui/right/UserProfileDialog.tsx | 10 +++++----- .../src/pages/chat/ui/right/panels/DMPanel.ts | 4 ++-- .../chat/ui/right/panels/MessagePanel.ts | 4 ++-- .../chat/ui/right/panels/PublicChatPanel.ts | 10 +++++----- frontend/src/pages/home/HomePage.tsx | 4 ++-- frontend/tsconfig.json | 6 ++++++ frontend/vite.config.ts | 6 ++++++ 34 files changed, 133 insertions(+), 121 deletions(-) diff --git a/frontend/src/core/api/authApi.ts b/frontend/src/core/api/authApi.ts index a104e4f..28311a7 100644 --- a/frontend/src/core/api/authApi.ts +++ b/frontend/src/core/api/authApi.ts @@ -1,8 +1,8 @@ -import type { Headers, UploadPublicKeyRequest, BackupBlob } from "../types"; -import { generateX25519KeyPair } from "../../utils/crypto/asymmetric"; -import { encodeBlob, encryptBackupWithPassword, decryptBackupWithPassword, decodeBlob } from "../../utils/crypto/backup"; -import { b64, ub64 } from "../../utils/utils"; -import { API_BASE_URL } from "../config"; +import type { Headers, UploadPublicKeyRequest, BackupBlob } from "@/core/types"; +import { generateX25519KeyPair } from "@/utils/crypto/asymmetric"; +import { encodeBlob, encryptBackupWithPassword, decryptBackupWithPassword, decodeBlob } from "@/utils/crypto/backup"; +import { b64, ub64 } from "@/utils/utils"; +import { API_BASE_URL } from "@/core/config"; /** * Generates authentication headers for API requests diff --git a/frontend/src/core/api/dmApi.ts b/frontend/src/core/api/dmApi.ts index 59efea4..629285a 100644 --- a/frontend/src/core/api/dmApi.ts +++ b/frontend/src/core/api/dmApi.ts @@ -1,12 +1,12 @@ -import { API_BASE_URL } from "../config"; +import { API_BASE_URL } from "@/core/config"; import { getAuthHeaders } from "./authApi"; -import { ecdhSharedSecret, deriveWrappingKey } from "../../utils/crypto/asymmetric"; -import { importAesGcmKey, aesGcmEncrypt, aesGcmDecrypt } from "../../utils/crypto/symmetric"; -import { randomBytes } from "../../utils/crypto/kdf"; +import { ecdhSharedSecret, deriveWrappingKey } from "@/utils/crypto/asymmetric"; +import { importAesGcmKey, aesGcmEncrypt, aesGcmDecrypt } from "@/utils/crypto/symmetric"; +import { randomBytes } from "@/utils/crypto/kdf"; import { getCurrentKeys } from "./authApi"; -import { request } from "../websocket"; -import type { SendDMRequest, DmEnvelope, User, DMEditRequest, DmEncryptedJSON, BaseDmEnvelope } from "../types"; -import { b64, ub64 } from "../../utils/utils"; +import { request } from "@/core/websocket"; +import type { SendDMRequest, DmEnvelope, User, DMEditRequest, DmEncryptedJSON, BaseDmEnvelope } from "@/core/types"; +import { b64, ub64 } from "@/utils/utils"; export async function decryptDm(envelope: DmEnvelope, senderPublicKeyB64: string): Promise { const keys = getCurrentKeys(); diff --git a/frontend/src/core/api/profileApi.ts b/frontend/src/core/api/profileApi.ts index 9755bdd..2e5a036 100644 --- a/frontend/src/core/api/profileApi.ts +++ b/frontend/src/core/api/profileApi.ts @@ -1,6 +1,6 @@ import { getAuthHeaders } from "./authApi"; -import { API_BASE_URL } from "../config"; -import type { UserProfile } from "../types"; +import { API_BASE_URL } from "@/core/config"; +import type { UserProfile } from "@/core/types"; export interface ProfileData { profile_picture?: string; diff --git a/frontend/src/core/components/Dialog.tsx b/frontend/src/core/components/Dialog.tsx index 35ef39b..b2247c9 100644 --- a/frontend/src/core/components/Dialog.tsx +++ b/frontend/src/core/components/Dialog.tsx @@ -1,8 +1,8 @@ import type { Dialog as MduiDialog } from "mdui/components/dialog"; import { useEffect, type Ref } from "react" import { createPortal } from "react-dom"; -import { id } from "../../utils/utils"; -import useCombinedRefs from "../hooks/useCombinedRefs"; +import { id } from "@/utils/utils"; +import useCombinedRefs from "@/core/hooks/useCombinedRefs"; export interface BaseDialogProps { onOpenChange: (value: boolean) => void; diff --git a/frontend/src/core/push-notifications/push-notifications.ts b/frontend/src/core/push-notifications/push-notifications.ts index e3edd2b..6c265f8 100644 --- a/frontend/src/core/push-notifications/push-notifications.ts +++ b/frontend/src/core/push-notifications/push-notifications.ts @@ -1,7 +1,7 @@ -import { API_BASE_URL } from "../config"; -import { isElectron } from "../electron/electron"; -import { websocket } from "../websocket"; -import type { NewMessageWebSocketMessage, WebSocketMessage } from "../types"; +import { API_BASE_URL } from "@/core/config"; +import { isElectron } from "@/core/electron/electron"; +import { websocket } from "@/core/websocket"; +import type { NewMessageWebSocketMessage, WebSocketMessage } from "@/core/types"; import serviceWorker from "./service-worker?worker&url"; export interface PushSubscriptionData { diff --git a/frontend/src/core/websocket.ts b/frontend/src/core/websocket.ts index c881cf3..4ec865b 100644 --- a/frontend/src/core/websocket.ts +++ b/frontend/src/core/websocket.ts @@ -7,7 +7,7 @@ import { API_WS_BASE_URL } from "./config"; import type { WebSocketMessage } from "./types"; -import { delay } from "../utils/utils"; +import { delay } from "@/utils/utils"; /** * Creates a new WebSocket connection to the chat server diff --git a/frontend/src/pages/auth/LoginPage.tsx b/frontend/src/pages/auth/LoginPage.tsx index 78e7cd8..4ff1004 100644 --- a/frontend/src/pages/auth/LoginPage.tsx +++ b/frontend/src/pages/auth/LoginPage.tsx @@ -1,15 +1,15 @@ import { useImmer } from "use-immer"; import { AlertsContainer, type Alert, type AlertType } from "./Auth"; import { AuthContainer, AuthHeader } from "./Auth"; -import type { ErrorResponse, LoginRequest, LoginResponse } from "../../core/types"; -import { ensureKeysOnLogin } from "../../core/api/authApi"; -import { API_BASE_URL } from "../../core/config"; +import type { ErrorResponse, LoginRequest, LoginResponse } from "@/core/types"; +import { ensureKeysOnLogin } from "@/core/api/authApi"; +import { API_BASE_URL } from "@/core/config"; import { useRef } from "react"; import type { TextField } from "mdui/components/text-field"; -import { useAppState } from "../chat/state"; -import { MaterialTextField } from "../../core/components/TextField"; -import { initialize, isSupported, startElectronReceiver, subscribe } from "../../core/push-notifications/push-notifications"; -import { isElectron } from "../../core/electron/electron"; +import { useAppState } from "@/pages/chat/state"; +import { MaterialTextField } from "@/core/components/TextField"; +import { initialize, isSupported, startElectronReceiver, subscribe } from "@/core/push-notifications/push-notifications"; +import { isElectron } from "@/core/electron/electron"; import { useNavigate } from "react-router-dom"; import "./auth.scss"; diff --git a/frontend/src/pages/auth/RegisterPage.tsx b/frontend/src/pages/auth/RegisterPage.tsx index f484e51..5e5f000 100644 --- a/frontend/src/pages/auth/RegisterPage.tsx +++ b/frontend/src/pages/auth/RegisterPage.tsx @@ -3,11 +3,11 @@ import { AuthContainer, AuthHeader } from "./Auth"; import { AlertsContainer, type Alert, type AlertType } from "./Auth"; import { useRef } from "react"; import { TextField } from "mdui/components/text-field"; -import type { ErrorResponse, RegisterRequest, LoginResponse } from "../../core/types"; -import { API_BASE_URL } from "../../core/config"; -import { useAppState } from "../chat/state"; -import { MaterialTextField } from "../../core/components/TextField"; -import { ensureKeysOnLogin } from "../../core/api/authApi"; +import type { ErrorResponse, RegisterRequest, LoginResponse } from "@/core/types"; +import { API_BASE_URL } from "@/core/config"; +import { useAppState } from "@/pages/chat/state"; +import { MaterialTextField } from "@/core/components/TextField"; +import { ensureKeysOnLogin } from "@/core/api/authApi"; import { useNavigate } from "react-router-dom"; import "./auth.scss"; diff --git a/frontend/src/pages/chat/hooks/useDM.ts b/frontend/src/pages/chat/hooks/useDM.ts index f3db530..189ef64 100644 --- a/frontend/src/pages/chat/hooks/useDM.ts +++ b/frontend/src/pages/chat/hooks/useDM.ts @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback, useRef } from "react"; -import { useAppState } from "../state"; +import { useAppState } from "@/pages/chat/state"; import { fetchUsers, fetchUserPublicKey, @@ -7,8 +7,8 @@ import { decryptDm, sendDMViaWebSocket } from "../../../core/api/dmApi"; -import type { User, Message, DmEncryptedJSON } from "../../../core/types"; -import { websocket } from "../../../core/websocket"; +import type { User, Message, DmEncryptedJSON } from "@/core/types"; +import { websocket } from "@/core/websocket"; export interface DMUser extends User { lastMessage?: string; diff --git a/frontend/src/pages/chat/hooks/useProfile.ts b/frontend/src/pages/chat/hooks/useProfile.ts index c4c2764..3e0eb65 100644 --- a/frontend/src/pages/chat/hooks/useProfile.ts +++ b/frontend/src/pages/chat/hooks/useProfile.ts @@ -1,7 +1,7 @@ import { useState, useCallback, useEffect } from "react"; -import { useAppState } from "../state"; -import { loadProfile, updateProfile, uploadProfilePicture, type ProfileData } from "../../../core/api/profileApi"; -import { showSuccess, showError } from "../../../utils/notification"; +import { useAppState } from "@/pages/chat/state"; +import { loadProfile, updateProfile, uploadProfilePicture, type ProfileData } from "@/core/api/profileApi"; +import { showSuccess, showError } from "@/utils/notification"; export default function useProfile() { const { user } = useAppState(); diff --git a/frontend/src/pages/chat/state.ts b/frontend/src/pages/chat/state.ts index a7eff88..67bf059 100644 --- a/frontend/src/pages/chat/state.ts +++ b/frontend/src/pages/chat/state.ts @@ -1,14 +1,14 @@ import { create } from "zustand"; -import type { Message, User } from "../../core/types"; -import { request } from "../../core/websocket"; +import type { Message, User } from "@/core/types"; +import { request } from "@/core/websocket"; import { MessagePanel } from "./ui/right/panels/MessagePanel"; import { PublicChatPanel } from "./ui/right/panels/PublicChatPanel"; import { DMPanel, type DMPanelData } from "./ui/right/panels/DMPanel"; -import { getAuthHeaders } from "../../core/api/authApi"; -import { restoreKeys } from "../../core/api/authApi"; -import { API_BASE_URL } from "../../core/config"; -import { initialize, subscribe, startElectronReceiver, isSupported } from "../../core/push-notifications/push-notifications"; -import { isElectron } from "../../core/electron/electron"; +import { getAuthHeaders } from "@/core/api/authApi"; +import { restoreKeys } from "@/core/api/authApi"; +import { API_BASE_URL } from "@/core/config"; +import { initialize, subscribe, startElectronReceiver, isSupported } from "@/core/push-notifications/push-notifications"; +import { isElectron } from "@/core/electron/electron"; export type ChatTabs = "chats" | "channels" | "contacts" | "dms" diff --git a/frontend/src/pages/chat/ui/ChatPage.tsx b/frontend/src/pages/chat/ui/ChatPage.tsx index b5024e9..9bc44fe 100644 --- a/frontend/src/pages/chat/ui/ChatPage.tsx +++ b/frontend/src/pages/chat/ui/ChatPage.tsx @@ -1,6 +1,6 @@ import { LeftPanel } from "./left/LeftPanel"; import { RightPanel } from "./right/RightPanel"; -import "../css/chat.scss"; +import "@/pages/chat/css/chat.scss"; export default function ChatPage() { return ( diff --git a/frontend/src/pages/chat/ui/left/ChatHeader.tsx b/frontend/src/pages/chat/ui/left/ChatHeader.tsx index b94297e..a76bc15 100644 --- a/frontend/src/pages/chat/ui/left/ChatHeader.tsx +++ b/frontend/src/pages/chat/ui/left/ChatHeader.tsx @@ -1,6 +1,6 @@ -import { PRODUCT_NAME } from "../../../../core/config"; -import useProfile from "../../hooks/useProfile"; -import defaultAvatar from "../../../resources/images/default-avatar.png"; +import { PRODUCT_NAME } from "@/core/config"; +import useProfile from "@/pages/chat/hooks/useProfile"; +import defaultAvatar from "@/images/default-avatar.png"; import { useState } from "react"; import { ProfileDialog } from "./profile/ProfileDialog"; diff --git a/frontend/src/pages/chat/ui/left/ChatTabs.tsx b/frontend/src/pages/chat/ui/left/ChatTabs.tsx index 9625567..bf5bb8f 100644 --- a/frontend/src/pages/chat/ui/left/ChatTabs.tsx +++ b/frontend/src/pages/chat/ui/left/ChatTabs.tsx @@ -1,4 +1,4 @@ -import { useAppState } from "../../state"; +import { useAppState } from "@/pages/chat/state"; export function ChatTabs() { const { chat, setActiveTab, switchToPublicChat } = useAppState(); diff --git a/frontend/src/pages/chat/ui/left/DMUsersList.tsx b/frontend/src/pages/chat/ui/left/DMUsersList.tsx index 022532d..6c25f09 100644 --- a/frontend/src/pages/chat/ui/left/DMUsersList.tsx +++ b/frontend/src/pages/chat/ui/left/DMUsersList.tsx @@ -1,8 +1,8 @@ import { useEffect } from "react"; -import { useDM, type DMUser } from "../../hooks/useDM"; -import { useAppState } from "../../state"; -import { fetchUserPublicKey } from "../../../../core/api/dmApi"; -import defaultAvatar from "../../../../images/default-avatar.png"; +import { useDM, type DMUser } from "@/pages/chat/hooks/useDM"; +import { useAppState } from "@/pages/chat/state"; +import { fetchUserPublicKey } from "@/core/api/dmApi"; +import defaultAvatar from "@/images/default-avatar.png"; export function DMUsersList() { const { dmUsers, isLoadingUsers, loadUsers } = useDM(); diff --git a/frontend/src/pages/chat/ui/left/LeftPanel.tsx b/frontend/src/pages/chat/ui/left/LeftPanel.tsx index a74a8aa..a6bf4d8 100644 --- a/frontend/src/pages/chat/ui/left/LeftPanel.tsx +++ b/frontend/src/pages/chat/ui/left/LeftPanel.tsx @@ -1,12 +1,12 @@ -import { PRODUCT_NAME } from "../../../../core/config"; -import { useAppState } from "../../state"; -import defaultAvatar from "../../../../images/default-avatar.png"; +import { PRODUCT_NAME } from "@/core/config"; +import { useAppState } from "@/pages/chat/state"; +import defaultAvatar from "@/images/default-avatar.png"; import { useState, type FormEvent } from "react"; import { ProfileDialog } from "./profile/ProfileDialog"; import { SettingsDialog } from "./settings/SettingsDialog"; import { DMUsersList } from "./DMUsersList"; import type { Tabs } from "mdui"; -import type { ChatTabs } from "../../state"; +import type { ChatTabs } from "@/pages/chat/state"; function BottomAppBar() { const [settingsOpen, onSettingsOpenChange] = useState(false); diff --git a/frontend/src/pages/chat/ui/left/profile/ImageCropper.tsx b/frontend/src/pages/chat/ui/left/profile/ImageCropper.tsx index 805b290..36ceb00 100644 --- a/frontend/src/pages/chat/ui/left/profile/ImageCropper.tsx +++ b/frontend/src/pages/chat/ui/left/profile/ImageCropper.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState } from "react"; -import type { Size2D, Rect } from "../../../../../core/types"; +import type { Size2D, Rect } from "@/core/types"; interface ImageCropperProps { onCrop: (croppedImageData: string) => void; diff --git a/frontend/src/pages/chat/ui/left/profile/ProfileDialog.tsx b/frontend/src/pages/chat/ui/left/profile/ProfileDialog.tsx index 1ad53de..5d5414c 100644 --- a/frontend/src/pages/chat/ui/left/profile/ProfileDialog.tsx +++ b/frontend/src/pages/chat/ui/left/profile/ProfileDialog.tsx @@ -1,11 +1,11 @@ import { useState, useEffect, useRef, type FormEvent } from "react"; -import defaultAvatar from "../../../../../images/default-avatar.png"; +import defaultAvatar from "@/images/default-avatar.png"; import type { TextField } from "mdui/components/text-field"; -import type { DialogProps } from "../../../../../core/types"; -import { MaterialDialog } from "../../../../../core/components/Dialog"; -import useProfile from "../../../hooks/useProfile"; +import type { DialogProps } from "@/core/types"; +import { MaterialDialog } from "@/core/components/Dialog"; +import useProfile from "@/pages/chat/hooks/useProfile"; import { ImageCropper } from "./ImageCropper"; -import { MaterialTextField } from "../../../../../core/components/TextField"; +import { MaterialTextField } from "@/core/components/TextField"; export function ProfileDialog({ isOpen, onOpenChange }: DialogProps) { const { profileData, isLoading, isUpdating, updateProfileData, uploadProfilePictureData } = useProfile(); diff --git a/frontend/src/pages/chat/ui/left/settings/SettingsDialog.tsx b/frontend/src/pages/chat/ui/left/settings/SettingsDialog.tsx index 806891e..1ea0bb6 100644 --- a/frontend/src/pages/chat/ui/left/settings/SettingsDialog.tsx +++ b/frontend/src/pages/chat/ui/left/settings/SettingsDialog.tsx @@ -1,12 +1,12 @@ import { useState, useEffect } from "react"; -import { PRODUCT_NAME, API_BASE_URL } from "../../../../../core/config"; -import type { DialogProps } from "../../../../../core/types"; -import { MaterialDialog } from "../../../../../core/components/Dialog"; -import { initialize, isSupported, startElectronReceiver, stopElectronReceiver, subscribe, unsubscribe } from "../../../../../core/push-notifications/push-notifications"; -import { isElectron } from "../../../../../core/electron/electron"; -import { useAppState } from "../../../state"; +import { PRODUCT_NAME, API_BASE_URL } from "@/core/config"; +import type { DialogProps } from "@/core/types"; +import { MaterialDialog } from "@/core/components/Dialog"; +import { initialize, isSupported, startElectronReceiver, stopElectronReceiver, subscribe, unsubscribe } from "@/core/push-notifications/push-notifications"; +import { isElectron } from "@/core/electron/electron"; +import { useAppState } from "@/pages/chat/state"; import type { Switch } from "mdui/components/switch"; -import { getAuthHeaders } from "../../../../../core/api/authApi"; +import { getAuthHeaders } from "@/core/api/authApi"; export function SettingsDialog({ isOpen, onOpenChange }: DialogProps) { const [activePanel, setActivePanel] = useState("notifications-settings"); diff --git a/frontend/src/pages/chat/ui/right/ChatInputWrapper.tsx b/frontend/src/pages/chat/ui/right/ChatInputWrapper.tsx index eeccf6e..59ed54c 100644 --- a/frontend/src/pages/chat/ui/right/ChatInputWrapper.tsx +++ b/frontend/src/pages/chat/ui/right/ChatInputWrapper.tsx @@ -1,9 +1,9 @@ import { useState, useEffect, useRef } from "react"; -import { MaterialDialog } from "../../../../core/components/Dialog"; -import { RichTextArea } from "../../../../core/components/RichTextArea"; -import type { Message } from "../../../../core/types"; -import Quote from "../../../../core/components/Quote"; -import AnimatedHeight from "../../../../core/components/animations/AnimatedHeight"; +import { MaterialDialog } from "@/core/components/Dialog"; +import { RichTextArea } from "@/core/components/RichTextArea"; +import type { Message } from "@/core/types"; +import Quote from "@/core/components/Quote"; +import AnimatedHeight from "@/core/components/animations/AnimatedHeight"; import { useImmer } from "use-immer"; import { EmojiMenu } from "./EmojiMenu"; diff --git a/frontend/src/pages/chat/ui/right/ChatMainHeader.tsx b/frontend/src/pages/chat/ui/right/ChatMainHeader.tsx index 19720bb..09b5635 100644 --- a/frontend/src/pages/chat/ui/right/ChatMainHeader.tsx +++ b/frontend/src/pages/chat/ui/right/ChatMainHeader.tsx @@ -1,5 +1,5 @@ -import { useAppState } from "../../state"; -import defaultAvatar from "../../../resources/images/default-avatar.png"; +import { useAppState } from "@/pages/chat/state"; +import defaultAvatar from "@/images/default-avatar.png"; export function ChatMainHeader() { const { currentChat } = useAppState().chat; diff --git a/frontend/src/pages/chat/ui/right/ChatMessages.tsx b/frontend/src/pages/chat/ui/right/ChatMessages.tsx index 3d8d8f7..25b5cc3 100644 --- a/frontend/src/pages/chat/ui/right/ChatMessages.tsx +++ b/frontend/src/pages/chat/ui/right/ChatMessages.tsx @@ -1,15 +1,15 @@ import { Message } from "./Message"; -import { useAppState } from "../../state"; -import type { Message as MessageType } from "../../../../core/types"; -import type { UserProfile } from "../../../../core/types"; +import { useAppState } from "@/pages/chat/state"; +import type { Message as MessageType } from "@/core/types"; +import type { UserProfile } from "@/core/types"; import { UserProfileDialog } from "./UserProfileDialog"; import { MessageContextMenu, type ContextMenuState } from "./MessageContextMenu"; -import { fetchUserProfile } from "../../../../core/api/profileApi"; +import { fetchUserProfile } from "@/core/api/profileApi"; import { useEffect, useState, type ReactNode } from "react"; -import { delay } from "../../../../utils/utils"; -import { MaterialDialog } from "../../../../core/components/Dialog"; -import { request } from "../../../../core/websocket"; -import type { AddReactionRequest, AddDmReactionRequest } from "../../../../core/types"; +import { delay } from "@/utils/utils"; +import { MaterialDialog } from "@/core/components/Dialog"; +import { request } from "@/core/websocket"; +import type { AddReactionRequest, AddDmReactionRequest } from "@/core/types"; interface ChatMessagesProps { messages?: MessageType[]; diff --git a/frontend/src/pages/chat/ui/right/EmojiMenu.tsx b/frontend/src/pages/chat/ui/right/EmojiMenu.tsx index 196166c..9b1c4f5 100644 --- a/frontend/src/pages/chat/ui/right/EmojiMenu.tsx +++ b/frontend/src/pages/chat/ui/right/EmojiMenu.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useRef, useCallback } from "react"; import { EMOJI_CATEGORIES, getRecentEmojis, addRecentEmoji } from "./emojiData"; -import type { Size2D } from "../../../../core/types"; +import type { Size2D } from "@/core/types"; interface BaseEmojiMenuProps { isOpen: boolean; diff --git a/frontend/src/pages/chat/ui/right/Message.tsx b/frontend/src/pages/chat/ui/right/Message.tsx index a7e8cbc..025528f 100644 --- a/frontend/src/pages/chat/ui/right/Message.tsx +++ b/frontend/src/pages/chat/ui/right/Message.tsx @@ -1,16 +1,16 @@ -import { formatTime, id } from "../../../../utils/utils"; -import type { Attachment, Message as MessageType, Reaction } from "../../../../core/types"; -import defaultAvatar from "../../../../images/default-avatar.png"; -import Quote from "../../../../core/components/Quote"; +import { formatTime, id } from "@/utils/utils"; +import type { Attachment, Message as MessageType, Reaction } from "@/core/types"; +import defaultAvatar from "@/images/default-avatar.png"; +import Quote from "@/core/components/Quote"; import { parse } from "marked"; import DOMPurify from "dompurify"; import { useEffect, useState, useRef } from "react"; -import { getCurrentKeys } from "../../../../core/api/authApi"; -import { ecdhSharedSecret, deriveWrappingKey } from "../../../../utils/crypto/asymmetric"; -import { importAesGcmKey, aesGcmDecrypt } from "../../../../utils/crypto/symmetric"; -import { getAuthHeaders } from "../../../../core/api/authApi"; -import { useAppState } from "../../state"; -import { ub64 } from "../../../../utils/utils"; +import { getCurrentKeys } from "@/core/api/authApi"; +import { ecdhSharedSecret, deriveWrappingKey } from "@/utils/crypto/asymmetric"; +import { importAesGcmKey, aesGcmDecrypt } from "@/utils/crypto/symmetric"; +import { getAuthHeaders } from "@/core/api/authApi"; +import { useAppState } from "@/pages/chat/state"; +import { ub64 } from "@/utils/utils"; import { useImmer } from "use-immer"; import { createPortal } from "react-dom"; diff --git a/frontend/src/pages/chat/ui/right/MessageContextMenu.tsx b/frontend/src/pages/chat/ui/right/MessageContextMenu.tsx index c13677e..8405aa5 100644 --- a/frontend/src/pages/chat/ui/right/MessageContextMenu.tsx +++ b/frontend/src/pages/chat/ui/right/MessageContextMenu.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useRef } from "react"; -import type { Message, Size2D } from "../../../../core/types"; +import type { Message, Size2D } from "@/core/types"; import { EmojiMenu } from "./EmojiMenu"; interface MessageContextMenuProps { diff --git a/frontend/src/pages/chat/ui/right/MessagePanelRenderer.tsx b/frontend/src/pages/chat/ui/right/MessagePanelRenderer.tsx index 4c5ed43..c9bb259 100644 --- a/frontend/src/pages/chat/ui/right/MessagePanelRenderer.tsx +++ b/frontend/src/pages/chat/ui/right/MessagePanelRenderer.tsx @@ -1,12 +1,12 @@ import { useState, useEffect, useRef } from "react"; -import { useAppState } from "../../state"; +import { useAppState } from "@/pages/chat/state"; import { MessagePanel, type MessagePanelState } from "./panels/MessagePanel"; import { ChatMessages } from "./ChatMessages"; import { ChatInputWrapper } from "./ChatInputWrapper"; -import { setGlobalMessageHandler } from "../../../../core/websocket"; -import type { Message, WebSocketMessage } from "../../../../core/types"; -import defaultAvatar from "../../../../images/default-avatar.png"; -import AnimatedOpacity from "../../../../core/components/animations/AnimatedOpacity"; +import { setGlobalMessageHandler } from "@/core/websocket"; +import type { Message, WebSocketMessage } from "@/core/types"; +import defaultAvatar from "@/images/default-avatar.png"; +import AnimatedOpacity from "@/core/components/animations/AnimatedOpacity"; import type { DMPanel } from "./panels/DMPanel"; interface MessagePanelRendererProps { diff --git a/frontend/src/pages/chat/ui/right/RightPanel.tsx b/frontend/src/pages/chat/ui/right/RightPanel.tsx index 05c0d46..278b091 100644 --- a/frontend/src/pages/chat/ui/right/RightPanel.tsx +++ b/frontend/src/pages/chat/ui/right/RightPanel.tsx @@ -1,4 +1,4 @@ -import { useAppState } from "../../state"; +import { useAppState } from "@/pages/chat/state"; import { MessagePanelRenderer } from "./MessagePanelRenderer"; export function RightPanel() { diff --git a/frontend/src/pages/chat/ui/right/UserProfileDialog.tsx b/frontend/src/pages/chat/ui/right/UserProfileDialog.tsx index 878ed1b..2e890f9 100644 --- a/frontend/src/pages/chat/ui/right/UserProfileDialog.tsx +++ b/frontend/src/pages/chat/ui/right/UserProfileDialog.tsx @@ -1,8 +1,8 @@ -import type { DialogProps } from "../../../../core/types"; -import type { UserProfile } from "../../../../core/types"; -import { MaterialDialog } from "../../../../core/components/Dialog"; -import { formatTime } from "../../../../utils/utils"; -import defaultAvatar from "../../../../images/default-avatar.png"; +import type { DialogProps } from "@/core/types"; +import type { UserProfile } from "@/core/types"; +import { MaterialDialog } from "@/core/components/Dialog"; +import { formatTime } from "@/utils/utils"; +import defaultAvatar from "@/images/default-avatar.png"; interface UserProfileDialogProps extends DialogProps { userProfile: UserProfile | null; diff --git a/frontend/src/pages/chat/ui/right/panels/DMPanel.ts b/frontend/src/pages/chat/ui/right/panels/DMPanel.ts index b8e4aa6..bfc7b47 100644 --- a/frontend/src/pages/chat/ui/right/panels/DMPanel.ts +++ b/frontend/src/pages/chat/ui/right/panels/DMPanel.ts @@ -7,8 +7,8 @@ import { editDmEnvelope, deleteDmEnvelope } from "../../../../../core/api/dmApi"; -import type { DmEncryptedJSON, DmEnvelope, DMWebSocketMessage, EncryptedMessageJson, Message } from "../../../../../core/types"; -import type { UserState } from "../../../state"; +import type { DmEncryptedJSON, DmEnvelope, DMWebSocketMessage, EncryptedMessageJson, Message } from "@/core/types"; +import type { UserState } from "@/pages/chat/state"; export interface DMPanelData { userId: number; diff --git a/frontend/src/pages/chat/ui/right/panels/MessagePanel.ts b/frontend/src/pages/chat/ui/right/panels/MessagePanel.ts index c291d03..5357e16 100644 --- a/frontend/src/pages/chat/ui/right/panels/MessagePanel.ts +++ b/frontend/src/pages/chat/ui/right/panels/MessagePanel.ts @@ -1,5 +1,5 @@ -import type { Message, WebSocketMessage } from "../../../../../core/types"; -import type { UserState } from "../../../state"; +import type { Message, WebSocketMessage } from "@/core/types"; +import type { UserState } from "@/pages/chat/state"; export interface MessagePanelState { id: string; diff --git a/frontend/src/pages/chat/ui/right/panels/PublicChatPanel.ts b/frontend/src/pages/chat/ui/right/panels/PublicChatPanel.ts index 7f9c085..86da1d2 100644 --- a/frontend/src/pages/chat/ui/right/panels/PublicChatPanel.ts +++ b/frontend/src/pages/chat/ui/right/panels/PublicChatPanel.ts @@ -1,9 +1,9 @@ import { MessagePanel } from "./MessagePanel"; -import { API_BASE_URL } from "../../../../../core/config"; -import { getAuthHeaders } from "../../../../../core/api/authApi"; -import { request } from "../../../../../core/websocket"; -import type { ChatWebSocketMessage, Message, SendMessageRequest, ReactionUpdateWebSocketMessage } from "../../../../../core/types"; -import type { UserState } from "../../../state"; +import { API_BASE_URL } from "@/core/config"; +import { getAuthHeaders } from "@/core/api/authApi"; +import { request } from "@/core/websocket"; +import type { ChatWebSocketMessage, Message, SendMessageRequest, ReactionUpdateWebSocketMessage } from "@/core/types"; +import type { UserState } from "@/pages/chat/state"; export class PublicChatPanel extends MessagePanel { private messagesLoaded: boolean = false; diff --git a/frontend/src/pages/home/HomePage.tsx b/frontend/src/pages/home/HomePage.tsx index 3df3874..9ed2c3c 100644 --- a/frontend/src/pages/home/HomePage.tsx +++ b/frontend/src/pages/home/HomePage.tsx @@ -1,6 +1,6 @@ import { Navigate, useNavigate } from "react-router-dom"; -import { useAppState } from "../chat/state"; -import { isElectron } from "../../core/electron/electron"; +import { useAppState } from "@/pages/chat/state"; +import { isElectron } from "@/core/electron/electron"; import "./home.scss"; function GitHubLink({ children }: { children: React.ReactNode }) { diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index ad5ff1c..4189505 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -13,6 +13,12 @@ "moduleDetection": "force", "noEmit": true, + /* Path mapping */ + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + /* Linting */ "strict": true, "erasableSyntaxOnly": true, diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index bb5d989..3c46f4c 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -3,6 +3,7 @@ import { createHtmlPlugin } from "vite-plugin-html"; import autoprefixer from "autoprefixer"; import electron from "vite-plugin-electron/simple"; import react from "@vitejs/plugin-react"; +import path from "path"; const plugins: PluginOption[] = [ react(), @@ -46,6 +47,11 @@ if (process.env.VITE_ELECTRON) { export default defineConfig({ plugins: plugins, + resolve: { + alias: { + "@": path.resolve(__dirname, "./src") + } + }, server: { host: '0.0.0.0', port: 8301,