From 6d5ee3856ec3ca0be23826305b20a9b91c909252 Mon Sep 17 00:00:00 2001 From: c0mrade Date: Wed, 4 Feb 2026 04:08:11 +0300 Subject: [PATCH] Fix ESLint fast-refresh warnings Refactor to resolve react-refresh/only-export-components warnings: - Move buttonVariants export to separate file (Button.variants.ts) - Extract WebSocketContext to dedicated context file - Move useWebSocketContext hook to separate file - Update imports across affected files All component files now export only components, improving fast refresh reliability --- src/components/primitives/Button/Button.tsx | 2 - src/components/primitives/Button/index.ts | 3 +- src/hooks/useWebSocket.ts | 3 +- src/providers/WebSocketContext.ts | 51 ++++++++++++++++ src/providers/WebSocketProvider.tsx | 64 ++------------------- src/providers/useWebSocketContext.ts | 10 ++++ 6 files changed, 70 insertions(+), 63 deletions(-) create mode 100644 src/providers/WebSocketContext.ts create mode 100644 src/providers/useWebSocketContext.ts diff --git a/src/components/primitives/Button/Button.tsx b/src/components/primitives/Button/Button.tsx index 8ea3ec2..9414c0f 100644 --- a/src/components/primitives/Button/Button.tsx +++ b/src/components/primitives/Button/Button.tsx @@ -100,5 +100,3 @@ function LoadingSpinner() { ); } - -export { buttonVariants, type ButtonVariants }; diff --git a/src/components/primitives/Button/index.ts b/src/components/primitives/Button/index.ts index ce23aa1..c6f2572 100644 --- a/src/components/primitives/Button/index.ts +++ b/src/components/primitives/Button/index.ts @@ -1 +1,2 @@ -export { Button, type ButtonProps, buttonVariants, type ButtonVariants } from './Button'; +export { Button, type ButtonProps } from './Button'; +export { buttonVariants, type ButtonVariants } from './Button.variants'; diff --git a/src/hooks/useWebSocket.ts b/src/hooks/useWebSocket.ts index 7ad8857..9824c4d 100644 --- a/src/hooks/useWebSocket.ts +++ b/src/hooks/useWebSocket.ts @@ -1,5 +1,6 @@ import { useEffect, useRef } from 'react'; -import { useWebSocketContext, WSMessage } from '../providers/WebSocketProvider'; +import { useWebSocketContext } from '../providers/useWebSocketContext'; +import { WSMessage } from '../providers/WebSocketProvider'; // Re-export WSMessage type for convenience export type { WSMessage }; diff --git a/src/providers/WebSocketContext.ts b/src/providers/WebSocketContext.ts new file mode 100644 index 0000000..edee8f2 --- /dev/null +++ b/src/providers/WebSocketContext.ts @@ -0,0 +1,51 @@ +import { createContext } from 'react'; + +export interface WSMessage { + type: string; + // Ticket events + ticket_id?: number; + title?: string; + // Common + message?: string; + user_id?: number; + is_admin?: boolean; + // Balance events + amount_kopeks?: number; + amount_rubles?: number; + new_balance_kopeks?: number; + new_balance_rubles?: number; + description?: string; + // Subscription events + expires_at?: string; + new_expires_at?: string; + tariff_name?: string; + days_left?: number; + // Device purchase events + devices_added?: number; + new_device_limit?: number; + // Traffic purchase events + traffic_gb_added?: number; + new_traffic_limit_gb?: number; + // Autopay events + required_kopeks?: number; + required_rubles?: number; + balance_kopeks?: number; + balance_rubles?: number; + reason?: string; + // Account events (ban/warning) + // Referral events + bonus_kopeks?: number; + bonus_rubles?: number; + referral_name?: string; + // Payment events + payment_method?: string; +} + +export type MessageHandler = (message: WSMessage) => void; + +export interface WebSocketContextValue { + isConnected: boolean; + subscribe: (handler: MessageHandler) => () => void; +} + +export const WebSocketContext = createContext(null); diff --git a/src/providers/WebSocketProvider.tsx b/src/providers/WebSocketProvider.tsx index 2712d9b..777e85b 100644 --- a/src/providers/WebSocketProvider.tsx +++ b/src/providers/WebSocketProvider.tsx @@ -1,58 +1,12 @@ -import { createContext, useContext, useEffect, useRef, useState, useCallback } from 'react'; +import { useEffect, useRef, useState, useCallback } from 'react'; import { useAuthStore } from '../store/auth'; +import { WebSocketContext, type MessageHandler, type WSMessage } from './WebSocketContext'; + +// Re-export for backward compatibility +export type { WSMessage } from './WebSocketContext'; const isDev = import.meta.env.DEV; -export interface WSMessage { - type: string; - // Ticket events - ticket_id?: number; - title?: string; - // Common - message?: string; - user_id?: number; - is_admin?: boolean; - // Balance events - amount_kopeks?: number; - amount_rubles?: number; - new_balance_kopeks?: number; - new_balance_rubles?: number; - description?: string; - // Subscription events - expires_at?: string; - new_expires_at?: string; - tariff_name?: string; - days_left?: number; - // Device purchase events - devices_added?: number; - new_device_limit?: number; - // Traffic purchase events - traffic_gb_added?: number; - new_traffic_limit_gb?: number; - // Autopay events - required_kopeks?: number; - required_rubles?: number; - balance_kopeks?: number; - balance_rubles?: number; - reason?: string; - // Account events (ban/warning) - // Referral events - bonus_kopeks?: number; - bonus_rubles?: number; - referral_name?: string; - // Payment events - payment_method?: string; -} - -type MessageHandler = (message: WSMessage) => void; - -interface WebSocketContextValue { - isConnected: boolean; - subscribe: (handler: MessageHandler) => () => void; -} - -const WebSocketContext = createContext(null); - export function WebSocketProvider({ children }: { children: React.ReactNode }) { const { accessToken, isAuthenticated } = useAuthStore(); const wsRef = useRef(null); @@ -207,11 +161,3 @@ export function WebSocketProvider({ children }: { children: React.ReactNode }) { ); } - -export function useWebSocketContext() { - const context = useContext(WebSocketContext); - if (!context) { - throw new Error('useWebSocketContext must be used within a WebSocketProvider'); - } - return context; -} diff --git a/src/providers/useWebSocketContext.ts b/src/providers/useWebSocketContext.ts new file mode 100644 index 0000000..84389b9 --- /dev/null +++ b/src/providers/useWebSocketContext.ts @@ -0,0 +1,10 @@ +import { useContext } from 'react'; +import { WebSocketContext } from './WebSocketContext'; + +export function useWebSocketContext() { + const context = useContext(WebSocketContext); + if (!context) { + throw new Error('useWebSocketContext must be used within a WebSocketProvider'); + } + return context; +}