fixed building app

This commit is contained in:
Ida Dittrich 2025-08-22 13:09:24 +02:00
parent f7481b24cb
commit 172ddb7001
30 changed files with 55 additions and 96 deletions

View file

@ -1,8 +1,7 @@
import {
AuthenticationResult,
EventType,
PublicClientApplication,
InteractionStatus
PublicClientApplication
} from "@azure/msal-browser";
import { msalConfig } from "./authConfig";
import { MsalProvider } from "@azure/msal-react";
@ -15,7 +14,7 @@ import {
export const AuthProvider = ({ children }: AuthProviderProps) => {
const [msalInstance, setMsalInstance] = useState<PublicClientApplication | null>(null);
const [isInitialized, setIsInitialized] = useState(false);
const [loginAttempted, setLoginAttempted] = useState(false);
useEffect(() => {
const msalApp = new PublicClientApplication(msalConfig);

View file

@ -1,4 +1,4 @@
import React from 'react';
import { Popup, EditForm } from '../Popup';
import styles from './ConnectionEditModal.module.css';
import { ConnectionEditModalProps } from './connectionsInterfaces';
@ -11,7 +11,7 @@ export function ConnectionEditModal({
onSave,
onCancel
}: ConnectionEditModalProps) {
const { t, isLoading } = useLanguage();
const { t } = useLanguage();
if (!connection) {
return null;

View file

@ -1,4 +1,4 @@
import React from 'react';
import styles from './ConnectionsErrorDisplay.module.css';
import { ConnectionsErrorDisplayProps } from './connectionsInterfaces';
import { useLanguage } from '../../contexts/LanguageContext';

View file

@ -1,12 +1,13 @@
import { ColumnConfig } from '../FormGenerator';
import { EditFieldConfig } from '../Popup';
// Re-export connection-related interfaces from hooks
export type { Connection, CreateConnectionData } from '../../hooks/useConnections';
// Import React for component types
import React from 'react';
// Re-export connection-related interfaces from hooks
export type { Connection, CreateConnectionData } from '../../hooks/useConnections';
import type { Connection } from '../../hooks/useConnections';
// Component Props Interfaces
export interface ConnectionsTableProps {
connections: Connection[];

View file

@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
import { IoIosLink, IoIosTrash } from 'react-icons/io';
import { MdModeEdit } from 'react-icons/md';
import { GoUnlink } from 'react-icons/go';
import React from 'react';
import { useConnections, useOAuthConnect, useDisconnect } from '../../hooks/useConnections';
import { useLanguage } from '../../contexts/LanguageContext';
@ -24,8 +24,6 @@ export function useConnectionsLogic(): ConnectionsLogicReturn {
fetchConnections,
createConnection,
updateConnection,
connectService,
disconnectService,
deleteConnection,
isLoading,
error

View file

@ -1,6 +1,6 @@
import React, { useState } from "react";
import MessageList from "./DashboardChatAreaMessageList";
import FilePreview from "./DashboardChatAreaFilePreview";
import InputArea from "./DashboardChatAreaInput";
import ConnectedFiles from "./DashboardChatAreaConnectedFiles";
import { DashboardChatAreaProps } from "./dashboardChatAreaTypes";
@ -19,7 +19,6 @@ const DashboardChatArea: React.FC<DashboardChatAreaProps> = ({
<div className={`${styles.quadrant} ${styles.messages_quadrant}`}>
<MessageList
workflowState={workflowState}
onFilePreview={setSelectedFile}
/>
</div>

View file

@ -1,5 +1,5 @@
import React from 'react';
import { useFileDownload } from '../../../hooks/useWorkflows';
import { ConnectedFilesProps } from './dashboardChatAreaTypes';
import styles from './DashboardChatAreaStyles/DashboardChatConnectedFiles.module.css';
import { IoIosAttach } from 'react-icons/io';

View file

@ -179,7 +179,7 @@ const InputArea: React.FC<InputAreaProps> = ({
if (files.length > 0) {
// Convert File objects to AttachedFile format
const attachedFiles: AttachedFile[] = files.map((file, index) => ({
id: Date.now() + index, // Simple ID generation
id: (Date.now() + index).toString(), // Simple ID generation
name: file.name,
size: file.size,
type: file.type,

View file

@ -1,4 +1,4 @@
import React, { useState } from "react";
import React from "react";
import { WorkflowLog } from "./dashboardChatAreaTypes";
import messageStyles from './DashboardChatAreaStyles/DashboardChatMessages.module.css';
@ -8,7 +8,7 @@ interface LogItemProps {
}
const LogItem: React.FC<LogItemProps> = ({ log }) => {
const [showDetails, setShowDetails] = useState(false);
// Format timestamp with robust parsing (same logic as MessageList)
const formatTimestamp = (timestamp: any) => {

View file

@ -1,14 +1,12 @@
import React from "react";
import { useFileDownload } from "../../../hooks/useWorkflows";
import { Message, Document } from "./dashboardChatAreaTypes";
import messageStyles from './DashboardChatAreaStyles/DashboardChatMessages.module.css';
import { FaDownload, FaEye } from "react-icons/fa";
interface MessageItemProps {
message: Message;
index: number;
onFilePreview?: (file: any) => void;
}
const formatFileSize = (bytes?: number) => {
@ -19,40 +17,16 @@ const formatFileSize = (bytes?: number) => {
};
const MessageItem: React.FC<MessageItemProps> = ({ message, onFilePreview }) => {
const { downloadFile, isDownloading } = useFileDownload();
const MessageItem: React.FC<MessageItemProps> = ({ message }) => {
const handleDocumentClick = (doc: Document) => {
const link = doc.downloadUrl || doc.url;
if (link) window.open(link, '_blank');
};
const handlePreview = (doc: Document, e: React.MouseEvent) => {
e.stopPropagation();
const fileId = doc.fileId || parseInt(doc.id || '0');
if (!fileId || isNaN(fileId)) return;
if (onFilePreview) {
onFilePreview({
id: fileId.toString(),
name: doc.name,
mimeType: doc.type || 'application/octet-stream',
size: doc.size,
fileId
});
}
};
const handleDownload = async (doc: Document, e: React.MouseEvent) => {
e.stopPropagation();
const fileId = doc.fileId || parseInt(doc.id || '0');
if (!fileId) return;
const fileName = doc.ext ? `${doc.name}.${doc.ext}` : doc.name;
await downloadFile(fileId, fileName);
};
const hasDocuments = message.documents?.length > 0;
const hasDocuments = message.documents && message.documents.length > 0;
const formatTimestamp = (ts?: string) => {
if (!ts) return '';

View file

@ -8,7 +8,7 @@ import messageStyles from './DashboardChatAreaStyles/DashboardChatMessages.modul
import { IoIosArrowDown, IoIosChatbubbles } from 'react-icons/io';
import { useLanguage } from '../../../contexts/LanguageContext';
const MessageList: React.FC<MessageListProps> = ({ workflowState, onFilePreview }) => {
const MessageList: React.FC<MessageListProps> = ({ workflowState }) => {
const { t } = useLanguage();
const { request } = useApiRequest();
const [messages, setMessages] = React.useState<any[]>([]);
@ -140,7 +140,6 @@ const MessageList: React.FC<MessageListProps> = ({ workflowState, onFilePreview
key={`message-${item.item.id}`}
message={item.item}
index={index}
onFilePreview={onFilePreview}
/>
);
} else if (item.type === 'log') {

View file

@ -1,12 +1,8 @@
import React, { useState, useRef, useEffect } from 'react';
import React, { useState, useRef } from 'react';
import { useUserFiles, UserFile } from '../../../hooks/useFiles';
import DateienAll from '../../../Dateien/DateienAll';
import DateienShared from '../../../Dateien/DateienShared';
import DateienCreated from '../../../Dateien/DateienCreated';
import DateienUploads from '../../../Dateien/DateienUploads';
interface AttachedFile {
id: number;
id: string;
name: string;
size: number;
type: string;
@ -67,7 +63,7 @@ const FileAttachmentPopup: React.FC<FileAttachmentPopupProps> = ({
// Create file objects with data for preview
const uploadedFiles: AttachedFile[] = files.map((file, index) => {
const fileObj: AttachedFile = {
id: Date.now() + index,
id: (Date.now() + index).toString(),
name: file.name,
size: file.size,
type: file.type,
@ -107,9 +103,7 @@ const FileAttachmentPopup: React.FC<FileAttachmentPopupProps> = ({
});
};
const isFileSelected = (fileId: number) => {
return selectedFiles.some(f => f.id === fileId);
};
const handleConfirm = () => {
onFilesSelected(selectedFiles);
@ -153,7 +147,7 @@ const FileAttachmentPopup: React.FC<FileAttachmentPopupProps> = ({
}
});
const isFileSelected = (fileId: number) => {
const isFileSelected = (fileId: string) => {
return selectedFiles.some(f => f.id === fileId);
};

View file

@ -52,7 +52,7 @@ export interface WorkflowMessage {
sequenceNr: number;
publishedAt: string;
timestamp?: string; // For backward compatibility
fileIds?: number[]; // For backward compatibility
fileIds?: string[]; // For backward compatibility
stats?: WorkflowMessageStats;
success: boolean;
actionId?: string;
@ -136,8 +136,8 @@ export interface WorkflowState {
export interface WorkflowActions {
loadWorkflow: (workflowId: string) => void;
startNewWorkflow: (prompt: string, fileIds?: number[]) => Promise<string | null>;
continueWorkflow: (prompt: string, fileIds?: number[]) => Promise<boolean>;
startNewWorkflow: (prompt: string, fileIds?: string[]) => Promise<string | null>;
continueWorkflow: (prompt: string, fileIds?: string[]) => Promise<boolean>;
stopWorkflow: () => Promise<boolean>;
clearWorkflow: () => void;
selectPrompt: (prompt: Prompt | null) => void;
@ -145,7 +145,7 @@ export interface WorkflowActions {
}
export interface FileInfo {
id: number;
id: string;
name: string;
mimeType: string;
size?: number;
@ -184,7 +184,7 @@ export interface InputAreaProps {
}
export interface AttachedFile {
id: number;
id: string;
name: string;
size: number;
type: string;
@ -196,12 +196,11 @@ export interface ConnectedFilesProps {
onFileSelect?: (file: FileInfo) => void;
selectedFile?: FileInfo | null;
attachedFiles?: AttachedFile[];
onRemoveFile?: (fileId: number) => void;
onRemoveFile?: (fileId: string) => void;
}
export interface MessageListProps {
workflowState: WorkflowState;
onFilePreview?: (file: any) => void;
}
// Progress bar interfaces

View file

@ -22,7 +22,7 @@ export function useWorkflowManager(initialWorkflowId?: string | null): [Workflow
const currentWorkflow = workflowStatus || workflow;
// Helper to create optimistic user message
const createOptimisticMessage = useCallback((prompt: string, fileIds: number[] = []) => {
const createOptimisticMessage = useCallback((prompt: string, fileIds: string[] = []) => {
const timestamp = new Date().toISOString();
return {
id: `temp-${Date.now()}`,
@ -83,7 +83,7 @@ export function useWorkflowManager(initialWorkflowId?: string | null): [Workflow
setCurrentWorkflowId(workflowId);
}, []);
const startNewWorkflow = useCallback(async (prompt: string, fileIds: number[] = []): Promise<string | null> => {
const startNewWorkflow = useCallback(async (prompt: string, fileIds: string[] = []): Promise<string | null> => {
// Add optimistic message immediately
const optimisticMessage = createOptimisticMessage(prompt, fileIds);
setPendingMessages(prev => [...prev, optimisticMessage]);
@ -119,7 +119,7 @@ export function useWorkflowManager(initialWorkflowId?: string | null): [Workflow
return null;
}, [startWorkflow, refetchMessages, createOptimisticMessage]);
const continueWorkflow = useCallback(async (prompt: string, fileIds: number[] = []): Promise<boolean> => {
const continueWorkflow = useCallback(async (prompt: string, fileIds: string[] = []): Promise<boolean> => {
if (!currentWorkflowId) return false;
// Add optimistic message immediately

View file

@ -1,6 +1,6 @@
import React, { useMemo } from 'react';
import { useMemo } from 'react';
import { useOrgUsers, User } from '../../hooks/useUsers';
import { useOrgUsers } from '../../hooks/useUsers';
import { useLanguage } from '../../contexts/LanguageContext';
import type {
@ -10,7 +10,7 @@ import type {
} from './mitgliederTypes';
export function useMitgliederLogic(): MitgliederLogicReturn {
const { users, loading, error, refetch, deleteUser } = useOrgUsers();
const { users, loading, error, refetch } = useOrgUsers();
const { t } = useLanguage();
// Configure columns for the users table

View file

@ -143,7 +143,7 @@ const PageManager: React.FC<PageManagerProps> = ({ loadingComponent: LoadingComp
<div className={styles.pageManager}>
{Array.from(pageInstances.values()).map((instance) => {
const isVisible = instance.isActive;
const shouldAnimate = !instance.shouldPreserve; // Only animate non-preserved pages
if (instance.shouldPreserve) {
// Preserved pages: Always mounted, just show/hide with animations

View file

@ -5,7 +5,7 @@ import { lazy } from 'react';
import { MdOutlineWorkOutline } from 'react-icons/md';
import { LuWorkflow, LuTicket } from "react-icons/lu";
import { GoGear } from "react-icons/go";
import { FaPlug, FaRegFileAlt, FaShare } from "react-icons/fa";
import { FaPlug, FaRegFileAlt } from "react-icons/fa";
import { LuMessageSquareText } from "react-icons/lu";
// Lazy load components for better performance
@ -15,7 +15,7 @@ const TeamBereich = lazy(() => import('../../pages/Home/TeamBereich'));
const Connections = lazy(() => import('../../pages/Home/Connections'));
const Workflows = lazy(() => import('../../pages/Home/Workflows'));
const Einstellungen = lazy(() => import('../../pages/Home/Einstellungen'));
const TestSharepoint = lazy(() => import('../../pages/Home/TestSharepoint'));
const Prompts = lazy(() => import('../../pages/Home/Prompts'));
// Page configuration with caching and lifecycle settings

View file

@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react';
import { useState, useEffect } from 'react';
import styles from './EditForm.module.css';
// Field configuration interface (moved from EditPopup)

View file

@ -1,4 +1,4 @@
import React from 'react';
import styles from './ViewForm.module.css';
import { EditFieldConfig } from './EditForm';

View file

@ -1,4 +1,4 @@
import React, { useState, useEffect, useMemo } from 'react';
import { useState, useMemo } from 'react';
import { IoIosTrash, IoIosCopy } from 'react-icons/io';
import { MdModeEdit } from 'react-icons/md';

View file

@ -1,7 +1,7 @@
import React from "react";
import { Link } from "react-router-dom";
import { IoIosArrowDown } from "react-icons/io";
import { motion, AnimatePresence } from "framer-motion";
import styles from './SidebarStyles/SidebarItem.module.css';
import SidebarSubmenu from "./SidebarSubmenu";

View file

@ -1,5 +1,5 @@
import { useState } from 'react';
import axios from 'axios';
import { useMsal } from '@azure/msal-react';
import api from '../api';
import { useApiRequest } from './useApi';

View file

@ -1,4 +1,4 @@
import { useState, useEffect } from 'react';
import { useState } from 'react';
import { useApiRequest } from './useApi';
// Connection interfaces based on backend UserConnection model

View file

@ -38,7 +38,7 @@ export function usePrompts() {
export function usePromptOperations() {
const [deletingPrompts, setDeletingPrompts] = useState<Set<string>>(new Set());
const [creatingPrompt, setCreatingPrompt] = useState(false);
const { request, error: apiError, isLoading } = useApiRequest();
const { request, isLoading } = useApiRequest();
const [deleteError, setDeleteError] = useState<string | null>(null);
const [createError, setCreateError] = useState<string | null>(null);
const [updateError, setUpdateError] = useState<string | null>(null);

View file

@ -7,7 +7,7 @@ export type { Workflow, WorkflowMessage, WorkflowStats, WorkflowDocument, Workfl
export interface StartWorkflowRequest {
prompt: string;
listFileId: number[];
listFileId: string[];
}
export interface StartWorkflowResponse {

View file

@ -340,10 +340,7 @@ export default {
'files.type.audio': 'Audio',
'files.type.file': 'Fichier',
// File Sources
'files.source.uploaded': 'Téléchargé',
'files.source.created': 'Créé par IA',
'files.source.shared': 'Partagé',
// File Actions
'files.action.download': 'Télécharger',

View file

@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react';
import { useState, useEffect } from 'react';
import styles from './HomeStyles/Einstellungen.module.css';
import sharedStyles from '../../components/PageManager/pages.module.css';
import { useLanguage, Language } from '../../contexts/LanguageContext';

View file

@ -1,19 +1,19 @@
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import styles from './HomeStyles/Home.module.css'
import Sidebar from '../../components/Sidebar';
import PageManager from '../../components/PageManager';
import { AnimatePresence, motion } from "framer-motion";
function Home () {
useEffect(()=> {
document.title = "PowerOn";
}, []);
const location = useLocation();
// Loading component
const LoadingComponent = () => (

View file

@ -1,6 +1,6 @@
import { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { FaMicrosoft } from 'react-icons/fa';
import styles from './Register.module.css';
import { useRegister, useMsalRegister, useUsernameAvailability } from '../hooks/useAuthentication';
@ -15,7 +15,7 @@ interface RegisterFormData {
function Register() {
const navigate = useNavigate();
const { register, error: registerError, isLoading } = useRegister();
const { registerWithMsal, error: msalError, isLoading: msalLoading } = useMsalRegister();
const { error: msalError } = useMsalRegister();
const { checkAvailability, isChecking, error: availabilityError } = useUsernameAvailability();
const [formData, setFormData] = useState<RegisterFormData>({
username: '',

View file

@ -1,6 +1,5 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { httpsConfig } from './server.ts';
export default defineConfig({
plugins: [react()],