diff --git a/app/src/components/auth/LoginPage.jsx b/app/src/components/auth/LoginPage.tsx similarity index 80% rename from app/src/components/auth/LoginPage.jsx rename to app/src/components/auth/LoginPage.tsx index faa7d10..5e0d878 100644 --- a/app/src/components/auth/LoginPage.jsx +++ b/app/src/components/auth/LoginPage.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { FormEvent, useState } from 'react'; import { TextInput, PasswordInput, @@ -11,13 +11,13 @@ import { } from '@mantine/core'; import { useAuth } from '../../contexts/AuthContext'; -const LoginPage = () => { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [loading, setLoading] = useState(false); +const LoginPage: React.FC = () => { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [loading, setLoading] = useState(false); const { login } = useAuth(); - const handleSubmit = async (e) => { + const handleSubmit = async (e: FormEvent): Promise => { e.preventDefault(); setLoading(true); try { diff --git a/app/src/components/modals/account/DeleteAccountModal.jsx b/app/src/components/modals/account/DeleteAccountModal.tsx similarity index 79% rename from app/src/components/modals/account/DeleteAccountModal.jsx rename to app/src/components/modals/account/DeleteAccountModal.tsx index cc77459..0a2255c 100644 --- a/app/src/components/modals/account/DeleteAccountModal.jsx +++ b/app/src/components/modals/account/DeleteAccountModal.tsx @@ -8,8 +8,18 @@ import { Button, } from '@mantine/core'; -const DeleteAccountModal = ({ opened, onClose, onConfirm }) => { - const [password, setPassword] = useState(''); +interface DeleteAccountModalProps { + opened: boolean; + onClose: () => void; + onConfirm: (password: string) => Promise; +} + +const DeleteAccountModal: React.FC = ({ + opened, + onClose, + onConfirm, +}) => { + const [password, setPassword] = useState(''); return ( { - const [password, setPassword] = useState(''); +interface EmailPasswordModalProps { + opened: boolean; + onClose: () => void; + onConfirm: (password: string) => Promise; + email: string; +} + +const EmailPasswordModal: React.FC = ({ + opened, + onClose, + onConfirm, + email, +}) => { + const [password, setPassword] = useState(''); return ( { - const [fileName, setFileName] = useState(''); +interface CreateFileModalProps { + onCreateFile: (fileName: string) => Promise; +} + +const CreateFileModal: React.FC = ({ onCreateFile }) => { + const [fileName, setFileName] = useState(''); const { newFileModalVisible, setNewFileModalVisible } = useModalContext(); - const handleSubmit = async () => { + const handleSubmit = async (): Promise => { if (fileName) { await onCreateFile(fileName); setFileName(''); diff --git a/app/src/components/modals/file/DeleteFileModal.jsx b/app/src/components/modals/file/DeleteFileModal.tsx similarity index 74% rename from app/src/components/modals/file/DeleteFileModal.jsx rename to app/src/components/modals/file/DeleteFileModal.tsx index 056bb21..c21fe26 100644 --- a/app/src/components/modals/file/DeleteFileModal.jsx +++ b/app/src/components/modals/file/DeleteFileModal.tsx @@ -2,11 +2,21 @@ import React from 'react'; import { Modal, Text, Button, Group } from '@mantine/core'; import { useModalContext } from '../../../contexts/ModalContext'; -const DeleteFileModal = ({ onDeleteFile, selectedFile }) => { +interface DeleteFileModalProps { + onDeleteFile: (fileName: string) => Promise; + selectedFile: string | null; +} + +const DeleteFileModal: React.FC = ({ + onDeleteFile, + selectedFile, +}) => { const { deleteFileModalVisible, setDeleteFileModalVisible } = useModalContext(); - const handleConfirm = async () => { + const handleConfirm = async (): Promise => { + if (!selectedFile) return; + await onDeleteFile(selectedFile); setDeleteFileModalVisible(false); }; diff --git a/app/src/components/modals/git/CommitMessageModal.jsx b/app/src/components/modals/git/CommitMessageModal.tsx similarity index 84% rename from app/src/components/modals/git/CommitMessageModal.jsx rename to app/src/components/modals/git/CommitMessageModal.tsx index d0707b9..7443705 100644 --- a/app/src/components/modals/git/CommitMessageModal.jsx +++ b/app/src/components/modals/git/CommitMessageModal.tsx @@ -2,12 +2,18 @@ import React, { useState } from 'react'; import { Modal, TextInput, Button, Group, Box } from '@mantine/core'; import { useModalContext } from '../../../contexts/ModalContext'; -const CommitMessageModal = ({ onCommitAndPush }) => { +interface CommitMessageModalProps { + onCommitAndPush: (message: string) => Promise; +} + +const CommitMessageModal: React.FC = ({ + onCommitAndPush, +}) => { const [message, setMessage] = useState(''); const { commitMessageModalVisible, setCommitMessageModalVisible } = useModalContext(); - const handleSubmit = async () => { + const handleSubmit = async (): Promise => { if (message) { await onCommitAndPush(message); setMessage(''); diff --git a/app/src/components/modals/user/CreateUserModal.jsx b/app/src/components/modals/user/CreateUserModal.tsx similarity index 55% rename from app/src/components/modals/user/CreateUserModal.jsx rename to app/src/components/modals/user/CreateUserModal.tsx index 23d5b5d..7a6dafe 100644 --- a/app/src/components/modals/user/CreateUserModal.jsx +++ b/app/src/components/modals/user/CreateUserModal.tsx @@ -8,20 +8,41 @@ import { Button, Group, } from '@mantine/core'; +import { CreateUserRequest } from '@/types/adminApi'; +import { UserRole } from '@/types/authApi'; -const CreateUserModal = ({ opened, onClose, onCreateUser, loading }) => { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [displayName, setDisplayName] = useState(''); - const [role, setRole] = useState('viewer'); +interface CreateUserModalProps { + opened: boolean; + onClose: () => void; + onCreateUser: (userData: CreateUserRequest) => Promise; + loading: boolean; +} - const handleSubmit = async () => { - const result = await onCreateUser({ email, password, displayName, role }); - if (result.success) { +const CreateUserModal: React.FC = ({ + opened, + onClose, + onCreateUser, + loading, +}) => { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [displayName, setDisplayName] = useState(''); + const [role, setRole] = useState(UserRole.Viewer); + + const handleSubmit = async (): Promise => { + const userData: CreateUserRequest = { + email, + password, + displayName, + role, + }; + + const success = await onCreateUser(userData); + if (success) { setEmail(''); setPassword(''); setDisplayName(''); - setRole('viewer'); + setRole(UserRole.Viewer); onClose(); } }; @@ -53,11 +74,11 @@ const CreateUserModal = ({ opened, onClose, onCreateUser, loading }) => { label="Role" required value={role} - onChange={setRole} + onChange={(value) => value && setRole(value as UserRole)} data={[ - { value: 'admin', label: 'Admin' }, - { value: 'editor', label: 'Editor' }, - { value: 'viewer', label: 'Viewer' }, + { value: UserRole.Admin, label: 'Admin' }, + { value: UserRole.Editor, label: 'Editor' }, + { value: UserRole.Viewer, label: 'Viewer' }, ]} /> diff --git a/app/src/components/modals/user/DeleteUserModal.jsx b/app/src/components/modals/user/DeleteUserModal.tsx similarity index 69% rename from app/src/components/modals/user/DeleteUserModal.jsx rename to app/src/components/modals/user/DeleteUserModal.tsx index 5763a0a..d3f549b 100644 --- a/app/src/components/modals/user/DeleteUserModal.jsx +++ b/app/src/components/modals/user/DeleteUserModal.tsx @@ -1,7 +1,22 @@ import React from 'react'; import { Modal, Text, Button, Group, Stack } from '@mantine/core'; +import { User } from '@/types/authApi'; -const DeleteUserModal = ({ opened, onClose, onConfirm, user, loading }) => ( +interface DeleteUserModalProps { + opened: boolean; + onClose: () => void; + onConfirm: () => Promise; + user: User | null; + loading: boolean; +} + +const DeleteUserModal: React.FC = ({ + opened, + onClose, + onConfirm, + user, + loading, +}) => ( { - const [formData, setFormData] = useState({ +interface EditUserModalProps { + opened: boolean; + onClose: () => void; + onEditUser: (userId: number, userData: UpdateUserRequest) => Promise; + loading: boolean; + user: User | null; +} + +const EditUserModal: React.FC = ({ + opened, + onClose, + onEditUser, + loading, + user, +}) => { + const [formData, setFormData] = useState({ email: '', displayName: '', - role: '', + role: undefined, password: '', }); @@ -29,18 +45,20 @@ const EditUserModal = ({ opened, onClose, onEditUser, loading, user }) => { } }, [user]); - const handleSubmit = async () => { + const handleSubmit = async (): Promise => { + if (!user) return; + const updateData = { ...formData, ...(formData.password ? { password: formData.password } : {}), }; - const result = await onEditUser(user.id, updateData); - if (result.success) { + const success = await onEditUser(user.id, updateData); + if (success) { setFormData({ email: '', displayName: '', - role: '', + role: undefined, password: '', }); onClose(); @@ -71,11 +89,13 @@ const EditUserModal = ({ opened, onClose, onEditUser, loading, user }) => { label="Role" required value={formData.role} - onChange={(value) => setFormData({ ...formData, role: value })} + onChange={(value) => + setFormData({ ...formData, role: value as UserRole | undefined }) + } data={[ - { value: 'admin', label: 'Admin' }, - { value: 'editor', label: 'Editor' }, - { value: 'viewer', label: 'Viewer' }, + { value: UserRole.Admin, label: 'Admin' }, + { value: UserRole.Editor, label: 'Editor' }, + { value: UserRole.Viewer, label: 'Viewer' }, ]} /> { - const [name, setName] = useState(''); - const [loading, setLoading] = useState(false); +interface CreateWorkspaceModalProps { + onWorkspaceCreated?: (workspace: Workspace) => Promise; +} + +const CreateWorkspaceModal: React.FC = ({ + onWorkspaceCreated, +}) => { + const [name, setName] = useState(''); + const [loading, setLoading] = useState(false); const { createWorkspaceModalVisible, setCreateWorkspaceModalVisible } = useModalContext(); - const handleSubmit = async () => { + const handleSubmit = async (): Promise => { if (!name.trim()) { notifications.show({ title: 'Error', diff --git a/app/src/components/modals/workspace/DeleteWorkspaceModal.jsx b/app/src/components/modals/workspace/DeleteWorkspaceModal.tsx similarity index 78% rename from app/src/components/modals/workspace/DeleteWorkspaceModal.jsx rename to app/src/components/modals/workspace/DeleteWorkspaceModal.tsx index 8effeeb..8418fb1 100644 --- a/app/src/components/modals/workspace/DeleteWorkspaceModal.jsx +++ b/app/src/components/modals/workspace/DeleteWorkspaceModal.tsx @@ -1,7 +1,14 @@ import React from 'react'; import { Modal, Text, Button, Group, Stack } from '@mantine/core'; -const DeleteWorkspaceModal = ({ +interface DeleteUserModalProps { + opened: boolean; + onClose: () => void; + onConfirm: () => Promise; + workspaceName: string | undefined; +} + +const DeleteWorkspaceModal: React.FC = ({ opened, onClose, onConfirm,