From 95f449a3d224e0f0f7ad902f5d055167b4738540 Mon Sep 17 00:00:00 2001 From: Pc Date: Sat, 3 Jan 2026 15:54:50 +0100 Subject: [PATCH] fix: vite config allowedhost read from .env --- .env.default | 10 ++--- kittyurl-frontend/src/api/auth.ts | 25 ----------- .../src/context/AuthProvider.tsx | 43 +++++++++++++++---- kittyurl-frontend/vite.config.ts | 35 +++------------ 4 files changed, 46 insertions(+), 67 deletions(-) delete mode 100644 kittyurl-frontend/src/api/auth.ts diff --git a/.env.default b/.env.default index e286ae5..05c3bed 100644 --- a/.env.default +++ b/.env.default @@ -1,7 +1,7 @@ -# Site info -PUBLIC_URL=https://example.com # Publicly accessible website root, used for rewrites. Note there is no trailing slash in the URL. -USE_SUBDOMAINS=true # Whether backend allows for use of subdomains in URL generation. +PUBLIC_URL=https://example.com +USE_SUBDOMAINS=true DEBUG=false + # Frontend specific - -VITE_API_TARGET=kitkat.example.com # Target backend for API requests. \ No newline at end of file +VITE_API_TARGET=https://pies.com +VITE_ALLOWED_HOST=pies.com \ No newline at end of file diff --git a/kittyurl-frontend/src/api/auth.ts b/kittyurl-frontend/src/api/auth.ts deleted file mode 100644 index b24550d..0000000 --- a/kittyurl-frontend/src/api/auth.ts +++ /dev/null @@ -1,25 +0,0 @@ -import axios from 'axios'; -import { sha512 } from 'js-sha512'; - -// Interfejs zgodny z Twoją dokumentacją [cite: 74-79] -export interface AuthResponse { - status: "ok"; - name: string; - role: "user" | "admin"; - token: string; -} - -export const loginUser = async (name: string, pass: string): Promise => { - // Wysyłamy POST zgodnie ze specyfikacją dokumentacji [cite: 68] - const response = await axios.post('https://twoj-backend.pl/api/v1/user/signIn', { - name: name, - password: sha512(pass) // Wymagane SHA-512 [cite: 71] - }); - - // Jeśli sukces, zapisujemy token JWT [cite: 78] - if (response.data.status === "ok") { - localStorage.setItem('token', response.data.token); - } - - return response.data; -}; \ No newline at end of file diff --git a/kittyurl-frontend/src/context/AuthProvider.tsx b/kittyurl-frontend/src/context/AuthProvider.tsx index 4677942..4342c3f 100644 --- a/kittyurl-frontend/src/context/AuthProvider.tsx +++ b/kittyurl-frontend/src/context/AuthProvider.tsx @@ -1,20 +1,35 @@ -// src/context/AuthProvider.tsx -import { useState, useCallback, type ReactNode } from 'react'; -import { AuthContext } from './AuthContext'; // Importujemy stałą z pliku obok +import { useState, useCallback, type ReactNode } from 'react'; +import { AuthContext } from './AuthContext'; import { sha512 } from '../utils/crypto'; import type { AuthResponse } from '../types/auth'; +// Pobieramy bazowy adres i usuwamy ewentualny ukośnik na końcu +// Używamy import.meta.env, który jest dostępny wewnątrz kodu React +const API_BASE_URL = (import.meta.env.VITE_API_TARGET || '').replace(/\/$/, ''); + export function AuthProvider({ children }: { children: ReactNode }) { const [token, setToken] = useState(sessionStorage.getItem('ktty_token')); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const authRequest = useCallback(async (endpoint: 'signUp' | 'signIn', name: string, pass: string) => { + + + if (!API_BASE_URL) { + const msg = "Błąd konfiguracji: VITE_API_TARGET jest pusty. Sprawdź plik .env i restartuj serwer."; + setError(msg); + return null; + } + setLoading(true); setError(null); try { const hashedPassword = await sha512(pass); - const response = await fetch(`/api/v1/user/${endpoint}`, { + const fullUrl = `${API_BASE_URL}/api/v1/user/${endpoint}`; + + + + const response = await fetch(fullUrl, { method: 'POST', headers: { 'accept': 'application/json', @@ -23,16 +38,26 @@ export function AuthProvider({ children }: { children: ReactNode }) { body: JSON.stringify({ name, password: hashedPassword, ttl: 86400 }), }); - const data: AuthResponse = await response.json(); - if (!response.ok) throw new Error(data.error || data.message || `Error ${response.status}`); + const contentType = response.headers.get("content-type"); + let data: AuthResponse | null = null; - if (data.token) { + if (contentType && contentType.includes("application/json")) { + data = await response.json(); + } + + if (!response.ok) { + const errorMsg = data?.error || data?.message || `Błąd serwera: ${response.status}`; + throw new Error(errorMsg); + } + + if (data && data.token) { sessionStorage.setItem('ktty_token', data.token); - setToken(data.token); // To aktualizuje stan w całej aplikacji natychmiast! + setToken(data.token); } return data; } catch (err: unknown) { - setError(err instanceof Error ? err.message : 'Unknown error'); + const message = err instanceof Error ? err.message : 'Unknown error'; + setError(message); return null; } finally { setLoading(false); diff --git a/kittyurl-frontend/vite.config.ts b/kittyurl-frontend/vite.config.ts index eebc049..e9f29b9 100644 --- a/kittyurl-frontend/vite.config.ts +++ b/kittyurl-frontend/vite.config.ts @@ -1,50 +1,29 @@ import { defineConfig, loadEnv } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' -import path from 'path' // Importuj moduł path +import path from 'path' export default defineConfig(({ mode }) => { - // Ustawiamy ścieżkę do folderu, w którym faktycznie znajduje się plik .env - // path.resolve(__dirname, '..') oznacza: "wyjdź jeden poziom wyżej względem tego pliku" + // Ścieżka do folderu nadrzędnego const envDirectory = path.resolve(__dirname, '..'); - // Ładujemy env z określonej lokalizacji + // Wczytujemy zmienne do użytku const env = loadEnv(mode, envDirectory, ''); - const apiTarget = env.VITE_API_TARGET; - return { + + envDir: envDirectory, + plugins: [ react(), tailwindcss(), ], server: { port: 6568, - proxy: { - '/api': { - target: apiTarget, - changeOrigin: true, - secure: false, - headers: { - 'Origin': apiTarget, - 'Referer': `${apiTarget}/` - }, - configure: (proxy) => { - proxy.on('error', (err) => { - console.log('[Proxy Error]:', err.message); - }); - proxy.on('proxyReq', (_, req) => { - console.log(`[Proxy] Wysyłam do: ${apiTarget}${req.url}`); - }); - proxy.on('proxyRes', (proxyRes, req) => { - console.log(`[Proxy] Odpowiedź: ${proxyRes.statusCode} ${req.url}`); - }); - }, - } - } }, preview: { port: 6568, + allowedHosts: [env.VITE_ALLOWED_HOST], }, } }) \ No newline at end of file