mirror of
https://github.com/lordmathis/lemma.git
synced 2025-11-06 07:54:22 +00:00
Separate modals into components
This commit is contained in:
@@ -6,12 +6,13 @@ import {
|
|||||||
Dot,
|
Dot,
|
||||||
useTheme,
|
useTheme,
|
||||||
useToasts,
|
useToasts,
|
||||||
Modal,
|
|
||||||
Input,
|
|
||||||
} from '@geist-ui/core';
|
} from '@geist-ui/core';
|
||||||
import { Code, Eye } from '@geist-ui/icons';
|
import { Code, Eye } from '@geist-ui/icons';
|
||||||
import FileTree from './FileTree';
|
import FileTree from './FileTree';
|
||||||
import FileActions from './FileActions';
|
import FileActions from './FileActions';
|
||||||
|
import CreateFileModal from './modals/CreateFileModal';
|
||||||
|
import DeleteFileModal from './modals/DeleteFileModal';
|
||||||
|
import CommitMessageModal from './modals/CommitMessageModal';
|
||||||
import ContentView from './ContentView';
|
import ContentView from './ContentView';
|
||||||
import { commitAndPush, saveFileContent, deleteFile } from '../services/api';
|
import { commitAndPush, saveFileContent, deleteFile } from '../services/api';
|
||||||
import { isImageFile } from '../utils/fileHelpers';
|
import { isImageFile } from '../utils/fileHelpers';
|
||||||
@@ -34,6 +35,9 @@ const MainContent = ({
|
|||||||
const { setToast } = useToasts();
|
const { setToast } = useToasts();
|
||||||
const [newFileModalVisible, setNewFileModalVisible] = useState(false);
|
const [newFileModalVisible, setNewFileModalVisible] = useState(false);
|
||||||
const [newFileName, setNewFileName] = useState('');
|
const [newFileName, setNewFileName] = useState('');
|
||||||
|
const [deleteFileModalVisible, setDeleteFileModalVisible] = useState(false);
|
||||||
|
const [commitMessageModalVisible, setCommitMessageModalVisible] =
|
||||||
|
useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isImageFile(selectedFile)) {
|
if (isImageFile(selectedFile)) {
|
||||||
@@ -59,25 +63,6 @@ const MainContent = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleCommitAndPush = async () => {
|
|
||||||
try {
|
|
||||||
const message = prompt('Enter commit message:');
|
|
||||||
if (message) {
|
|
||||||
await commitAndPush(message);
|
|
||||||
setToast({
|
|
||||||
text: 'Changes committed and pushed successfully',
|
|
||||||
type: 'success',
|
|
||||||
});
|
|
||||||
await pullLatestChanges();
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
setToast({
|
|
||||||
text: 'Failed to commit and push changes: ' + error.message,
|
|
||||||
type: 'error',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleCreateFile = () => {
|
const handleCreateFile = () => {
|
||||||
setNewFileModalVisible(true);
|
setNewFileModalVisible(true);
|
||||||
};
|
};
|
||||||
@@ -100,25 +85,44 @@ const MainContent = ({
|
|||||||
setNewFileName('');
|
setNewFileName('');
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDeleteFile = async () => {
|
const handleDeleteFile = () => {
|
||||||
if (selectedFile) {
|
setDeleteFileModalVisible(true);
|
||||||
const confirmDelete = window.confirm(
|
};
|
||||||
`Are you sure you want to delete "${selectedFile}"?`
|
|
||||||
);
|
const confirmDeleteFile = async () => {
|
||||||
if (confirmDelete) {
|
try {
|
||||||
try {
|
await deleteFile(selectedFile);
|
||||||
await deleteFile(selectedFile);
|
setToast({ text: 'File deleted successfully', type: 'success' });
|
||||||
setToast({ text: 'File deleted successfully', type: 'success' });
|
await pullLatestChanges();
|
||||||
await pullLatestChanges();
|
onFileSelect(null);
|
||||||
onFileSelect(null);
|
} catch (error) {
|
||||||
} catch (error) {
|
setToast({
|
||||||
setToast({
|
text: 'Failed to delete file: ' + error.message,
|
||||||
text: 'Failed to delete file: ' + error.message,
|
type: 'error',
|
||||||
type: 'error',
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
setDeleteFileModalVisible(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleCommitAndPush = () => {
|
||||||
|
setCommitMessageModalVisible(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const confirmCommitAndPush = async (message) => {
|
||||||
|
try {
|
||||||
|
await commitAndPush(message);
|
||||||
|
setToast({
|
||||||
|
text: 'Changes committed and pushed successfully',
|
||||||
|
type: 'success',
|
||||||
|
});
|
||||||
|
await pullLatestChanges();
|
||||||
|
} catch (error) {
|
||||||
|
setToast({
|
||||||
|
text: 'Failed to commit and push changes: ' + error.message,
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setCommitMessageModalVisible(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderBreadcrumbs = () => {
|
const renderBreadcrumbs = () => {
|
||||||
@@ -192,24 +196,24 @@ const MainContent = ({
|
|||||||
</div>
|
</div>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid.Container>
|
</Grid.Container>
|
||||||
<Modal
|
<CreateFileModal
|
||||||
visible={newFileModalVisible}
|
visible={newFileModalVisible}
|
||||||
onClose={() => setNewFileModalVisible(false)}
|
onClose={() => setNewFileModalVisible(false)}
|
||||||
>
|
onSubmit={handleNewFileSubmit}
|
||||||
<Modal.Title>Create New File</Modal.Title>
|
fileName={newFileName}
|
||||||
<Modal.Content>
|
setFileName={setNewFileName}
|
||||||
<Input
|
/>
|
||||||
width="100%"
|
<DeleteFileModal
|
||||||
placeholder="Enter file name"
|
visible={deleteFileModalVisible}
|
||||||
value={newFileName}
|
onClose={() => setDeleteFileModalVisible(false)}
|
||||||
onChange={(e) => setNewFileName(e.target.value)}
|
onConfirm={confirmDeleteFile}
|
||||||
/>
|
fileName={selectedFile}
|
||||||
</Modal.Content>
|
/>
|
||||||
<Modal.Action passive onClick={() => setNewFileModalVisible(false)}>
|
<CommitMessageModal
|
||||||
Cancel
|
visible={commitMessageModalVisible}
|
||||||
</Modal.Action>
|
onClose={() => setCommitMessageModalVisible(false)}
|
||||||
<Modal.Action onClick={handleNewFileSubmit}>Create</Modal.Action>
|
onSubmit={confirmCommitAndPush}
|
||||||
</Modal>
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
31
frontend/src/components/modals/CommitMessageModal.js
Normal file
31
frontend/src/components/modals/CommitMessageModal.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import React, { useState } from 'react';
|
||||||
|
import { Modal, Input } from '@geist-ui/core';
|
||||||
|
|
||||||
|
const CommitMessageModal = ({ visible, onClose, onSubmit }) => {
|
||||||
|
const [message, setMessage] = useState('');
|
||||||
|
|
||||||
|
const handleSubmit = () => {
|
||||||
|
onSubmit(message);
|
||||||
|
setMessage('');
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal visible={visible} onClose={onClose}>
|
||||||
|
<Modal.Title>Enter Commit Message</Modal.Title>
|
||||||
|
<Modal.Content>
|
||||||
|
<Input
|
||||||
|
width="100%"
|
||||||
|
placeholder="Enter commit message"
|
||||||
|
value={message}
|
||||||
|
onChange={(e) => setMessage(e.target.value)}
|
||||||
|
/>
|
||||||
|
</Modal.Content>
|
||||||
|
<Modal.Action passive onClick={onClose}>
|
||||||
|
Cancel
|
||||||
|
</Modal.Action>
|
||||||
|
<Modal.Action onClick={handleSubmit}>Commit</Modal.Action>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CommitMessageModal;
|
||||||
30
frontend/src/components/modals/CreateFileModal.js
Normal file
30
frontend/src/components/modals/CreateFileModal.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Modal, Input } from '@geist-ui/core';
|
||||||
|
|
||||||
|
const CreateFileModal = ({
|
||||||
|
visible,
|
||||||
|
onClose,
|
||||||
|
onSubmit,
|
||||||
|
fileName,
|
||||||
|
setFileName,
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<Modal visible={visible} onClose={onClose}>
|
||||||
|
<Modal.Title>Create New File</Modal.Title>
|
||||||
|
<Modal.Content>
|
||||||
|
<Input
|
||||||
|
width="100%"
|
||||||
|
placeholder="Enter file name"
|
||||||
|
value={fileName}
|
||||||
|
onChange={(e) => setFileName(e.target.value)}
|
||||||
|
/>
|
||||||
|
</Modal.Content>
|
||||||
|
<Modal.Action passive onClick={onClose}>
|
||||||
|
Cancel
|
||||||
|
</Modal.Action>
|
||||||
|
<Modal.Action onClick={onSubmit}>Create</Modal.Action>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CreateFileModal;
|
||||||
19
frontend/src/components/modals/DeleteFileModal.js
Normal file
19
frontend/src/components/modals/DeleteFileModal.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Modal, Text } from '@geist-ui/core';
|
||||||
|
|
||||||
|
const DeleteFileModal = ({ visible, onClose, onConfirm, fileName }) => {
|
||||||
|
return (
|
||||||
|
<Modal visible={visible} onClose={onClose}>
|
||||||
|
<Modal.Title>Delete File</Modal.Title>
|
||||||
|
<Modal.Content>
|
||||||
|
<Text>Are you sure you want to delete "{fileName}"?</Text>
|
||||||
|
</Modal.Content>
|
||||||
|
<Modal.Action passive onClick={onClose}>
|
||||||
|
Cancel
|
||||||
|
</Modal.Action>
|
||||||
|
<Modal.Action onClick={onConfirm}>Delete</Modal.Action>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DeleteFileModal;
|
||||||
Reference in New Issue
Block a user