diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..8aa74ab --- /dev/null +++ b/.env.development @@ -0,0 +1,5 @@ +# ffentliche Vite-Variablen fr lokale Entwicklung (in Git, kein Secret) +VITE_APPWRITE_ENDPOINT=http://localhost:5173/v1 +VITE_APPWRITE_PROJECT_ID=6a1058610003c5a13a05 +VITE_APPWRITE_DATABASE_ID=woms-database +VITE_APPWRITE_BUCKET_ID=woms-attachments diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..eb62db4 --- /dev/null +++ b/.env.production @@ -0,0 +1,5 @@ +# ffentliche Vite-Variablen fr Production-Build (in Git, kein Secret) +VITE_APPWRITE_ENDPOINT=https://ticket.webklar.com/v1 +VITE_APPWRITE_PROJECT_ID=6a1058610003c5a13a05 +VITE_APPWRITE_DATABASE_ID=woms-database +VITE_APPWRITE_BUCKET_ID=woms-attachments diff --git a/.gitignore b/.gitignore index 68d61d1..c2712d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ # Dependencies node_modules/ -# Environment variables -#.env -#.env.local -.env.production +# Environment variables (persönliche Overrides — nicht committen) +.env +.env.local +.env.*.local # Build output dist/ diff --git a/src/context/AuthContext.jsx b/src/context/AuthContext.jsx index cbdd777..6084ebd 100644 --- a/src/context/AuthContext.jsx +++ b/src/context/AuthContext.jsx @@ -1,12 +1,37 @@ import { createContext, useContext, useState, useEffect } from 'react' -import { account, databases, DATABASE_ID, COLLECTIONS, ID, Query, hasAppwriteSession } from '../lib/appwrite' +import { + account, + databases, + DATABASE_ID, + COLLECTIONS, + ID, + Query, + hasAppwriteSession, + isDemoMode, + projectId as PROJECT_ID, +} from '../lib/appwrite' const AuthContext = createContext() -// Demo mode when Appwrite is not configured -const DEMO_MODE = !(import.meta.env.VITE_APPWRITE_PROJECT_ID || '').trim() +const DEMO_MODE = isDemoMode -const PROJECT_ID = (import.meta.env.VITE_APPWRITE_PROJECT_ID || '').trim() +// #region agent log +if (typeof window !== 'undefined') { + fetch('http://127.0.0.1:7284/ingest/0747da40-b90b-4354-9b84-c9b550a81ec9', { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '252827' }, + body: JSON.stringify({ + sessionId: '252827', + runId: 'pre-fix', + hypothesisId: 'B', + location: 'AuthContext.jsx:init', + message: 'Auth DEMO_MODE resolved', + data: { DEMO_MODE, PROJECT_ID: PROJECT_ID ? PROJECT_ID.slice(0, 8) : '' }, + timestamp: Date.now(), + }), + }).catch(() => {}) +} +// #endregion function clearStaleAppwriteSessions() { if (typeof window === 'undefined' || !window.localStorage) return diff --git a/src/hooks/useAdminConfig.js b/src/hooks/useAdminConfig.js index acf86f3..e3fe089 100644 --- a/src/hooks/useAdminConfig.js +++ b/src/hooks/useAdminConfig.js @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback } from 'react' -import { databases, DATABASE_ID, COLLECTIONS, ID } from '../lib/appwrite' +import { databases, DATABASE_ID, COLLECTIONS, ID, isDemoMode } from '../lib/appwrite' -const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID +const DEMO_MODE = isDemoMode // Default-Werte für Demo-Modus const DEFAULT_CONFIG = { diff --git a/src/hooks/useCustomers.js b/src/hooks/useCustomers.js index 2a5713a..c920f9f 100644 --- a/src/hooks/useCustomers.js +++ b/src/hooks/useCustomers.js @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback } from 'react' -import { databases, DATABASE_ID, COLLECTIONS, ID, Query } from '../lib/appwrite' +import { databases, DATABASE_ID, COLLECTIONS, ID, Query, isDemoMode } from '../lib/appwrite' -const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID +const DEMO_MODE = isDemoMode // Demo-Kunden für Testing const DEMO_CUSTOMERS = [ diff --git a/src/hooks/useEmployees.js b/src/hooks/useEmployees.js index 5fc0d1c..e19dd00 100644 --- a/src/hooks/useEmployees.js +++ b/src/hooks/useEmployees.js @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback } from 'react' -import { databases, account, DATABASE_ID, COLLECTIONS, ID, Query } from '../lib/appwrite' +import { databases, account, DATABASE_ID, COLLECTIONS, ID, Query, isDemoMode } from '../lib/appwrite' -const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID +const DEMO_MODE = isDemoMode // Demo-Mitarbeiter für Testing const DEMO_EMPLOYEES = [ diff --git a/src/hooks/useWorkorders.js b/src/hooks/useWorkorders.js index 7e443fc..c7e9b63 100644 --- a/src/hooks/useWorkorders.js +++ b/src/hooks/useWorkorders.js @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback } from 'react' -import { databases, DATABASE_ID, COLLECTIONS, Query, ID } from '../lib/appwrite' +import { databases, DATABASE_ID, COLLECTIONS, Query, ID, isDemoMode } from '../lib/appwrite' -const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID +const DEMO_MODE = isDemoMode // Demo data for testing without Appwrite const lastWeek = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) diff --git a/src/hooks/useWorksheets.js b/src/hooks/useWorksheets.js index 6fa06e7..5d457d6 100644 --- a/src/hooks/useWorksheets.js +++ b/src/hooks/useWorksheets.js @@ -1,7 +1,7 @@ import { useState, useEffect, useCallback } from 'react' -import { databases, DATABASE_ID, COLLECTIONS, Query, ID } from '../lib/appwrite' +import { databases, DATABASE_ID, COLLECTIONS, Query, ID, isDemoMode } from '../lib/appwrite' -const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID +const DEMO_MODE = isDemoMode // Demo data für Testing - Vollständiges Dummy-Ticket 10001 mit allen Worksheets const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000) diff --git a/src/lib/appwrite.js b/src/lib/appwrite.js index 4c492cb..b588926 100644 --- a/src/lib/appwrite.js +++ b/src/lib/appwrite.js @@ -1,23 +1,64 @@ import { Client, Account, Databases, Storage, ID, Query } from 'appwrite' +/** Ticket-System Appwrite-Projekt (Fallback wenn keine .env beim Build) */ +const DEFAULT_PROJECT_ID = '6a1058610003c5a13a05' + +const endpoint = import.meta.env.VITE_APPWRITE_ENDPOINT || 'https://ticket.webklar.com/v1' +export const projectId = ( + import.meta.env.VITE_APPWRITE_PROJECT_ID || DEFAULT_PROJECT_ID +).trim() + +/** Demo-Modus nur wenn wirklich keine Projekt-ID (sollte mit Defaults nie passieren) */ +export const isDemoMode = !projectId + +// #region agent log +if (typeof window !== 'undefined') { + const _dbg = { + sessionId: '252827', + runId: 'pre-fix', + hypothesisId: 'A', + location: 'appwrite.js:init', + message: 'Appwrite env at runtime', + data: { + mode: import.meta.env.MODE, + isDemoMode, + projectIdPrefix: projectId ? projectId.slice(0, 8) : '', + fromEnv: Boolean((import.meta.env.VITE_APPWRITE_PROJECT_ID || '').trim()), + endpointHost: (() => { + try { + return new URL(endpoint).host + } catch { + return 'invalid' + } + })(), + pageHost: window.location.host, + }, + timestamp: Date.now(), + } + fetch('http://127.0.0.1:7284/ingest/0747da40-b90b-4354-9b84-c9b550a81ec9', { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '252827' }, + body: JSON.stringify(_dbg), + }).catch(() => {}) + if (import.meta.env.DEV) { + console.info('[DEBUG 252827]', _dbg) + } +} +// #endregion + if (import.meta.env.DEV) { console.log('🔧 Appwrite Konfiguration:') - console.log('Endpoint:', import.meta.env.VITE_APPWRITE_ENDPOINT || 'NICHT GESETZT') - console.log('Project ID:', import.meta.env.VITE_APPWRITE_PROJECT_ID || 'NICHT GESETZT') - console.log('Database ID:', import.meta.env.VITE_APPWRITE_DATABASE_ID || 'NICHT GESETZT') + console.log('Endpoint:', endpoint) + console.log('Project ID:', projectId || 'NICHT GESETZT') + console.log('Demo-Modus:', isDemoMode) + console.log('Database ID:', import.meta.env.VITE_APPWRITE_DATABASE_ID || 'woms-database') } -const endpoint = import.meta.env.VITE_APPWRITE_ENDPOINT || 'https://ticket.webklar.com/v1' -const projectId = (import.meta.env.VITE_APPWRITE_PROJECT_ID || '').trim() - if (!projectId) { console.error('❌ FEHLER: VITE_APPWRITE_PROJECT_ID ist nicht gesetzt!') - console.error('Bitte überprüfe deine .env Datei im Root-Verzeichnis.') } -const client = new Client() - .setEndpoint(endpoint) - .setProject(projectId) +const client = new Client().setEndpoint(endpoint).setProject(projectId) export const account = new Account(client) export const databases = new Databases(client) @@ -32,7 +73,7 @@ export const COLLECTIONS = { EMPLOYEES: 'employees', WORKSHEETS: 'worksheets', USERS: 'users', - ATTACHMENTS: 'attachments' + ATTACHMENTS: 'attachments', } export const BUCKET_ID = import.meta.env.VITE_APPWRITE_BUCKET_ID || 'woms-attachments' @@ -45,7 +86,9 @@ export function hasAppwriteSession() { if (apiHost === window.location.hostname) { return true } - } catch { /* ignore */ } + } catch { + /* ignore */ + } try { const raw = window.localStorage.getItem('cookieFallback') if (!raw) return false