sourabhrealtime
Version:
ROBUST RICH TEXT EDITOR: Single-pane contentEditable with direct text selection formatting, speech features, undo/redo, professional UI - Perfect TipTap alternative
196 lines (179 loc) • 6.27 kB
JSX
import React, { useState, useEffect } from 'react';
import { AuthProvider, useAuth } from './AuthProvider';
import LoginForm from './LoginForm';
import ProjectManager from './ProjectManager';
import { RealtimeEditor } from './RealtimeEditor';
import ApprovalWorkflow from './ApprovalWorkflow';
const CollaborationAppContent = ({
apiUrl = 'http://localhost:3002',
requireApproval = true,
showProjectManager = true,
onProjectChange,
defaultProjectId = null
}) => {
const { user, isAuthenticated, logout } = useAuth();
const [currentView, setCurrentView] = useState('dashboard');
const [selectedProject, setSelectedProject] = useState(null);
const [projectContent, setProjectContent] = useState('');
useEffect(() => {
if (defaultProjectId && isAuthenticated) {
setSelectedProject({ id: defaultProjectId, name: 'Default Project' });
setCurrentView('editor');
}
}, [defaultProjectId, isAuthenticated]);
const handleProjectSelect = (project) => {
setSelectedProject(project);
setCurrentView('editor');
onProjectChange?.(project);
};
const handleBackToDashboard = () => {
setCurrentView('dashboard');
setSelectedProject(null);
};
const handleLogout = () => {
logout();
setCurrentView('dashboard');
setSelectedProject(null);
};
if (!isAuthenticated) {
return (
<LoginForm
onSuccess={(user) => {
console.log('User logged in:', user);
}}
/>
);
}
return (
<div className="sourabhrealtime-collaboration-app">
{/* Header */}
<div className="sourabhrealtime-app-header">
<div className="sourabhrealtime-app-title">
<h1>Real-time Collaboration</h1>
{selectedProject && (
<span className="sourabhrealtime-project-name">
- {selectedProject.name}
</span>
)}
</div>
<div className="sourabhrealtime-app-nav">
{currentView === 'editor' && (
<button
onClick={handleBackToDashboard}
className="sourabhrealtime-button sourabhrealtime-button-secondary"
>
← Back to Dashboard
</button>
)}
<div className="sourabhrealtime-user-menu">
<span className="sourabhrealtime-user-name">{user.name}</span>
<span className="sourabhrealtime-user-role">({user.role})</span>
<button
onClick={handleLogout}
className="sourabhrealtime-button sourabhrealtime-button-small"
>
Logout
</button>
</div>
</div>
</div>
{/* Main Content */}
<div className="sourabhrealtime-app-content">
{currentView === 'dashboard' && showProjectManager && (
<ProjectManager
apiUrl={apiUrl}
onProjectSelect={handleProjectSelect}
onProjectCreate={(project) => {
console.log('Project created:', project);
}}
/>
)}
{currentView === 'editor' && selectedProject && (
<div className="sourabhrealtime-editor-view">
<div className="sourabhrealtime-editor-header">
<h2>{selectedProject.name}</h2>
<div className="sourabhrealtime-editor-info">
<span>Project ID: {selectedProject.id}</span>
{requireApproval && user.role !== 'admin' && user.role !== 'super_admin' && (
<span className="sourabhrealtime-approval-notice">
Changes require approval
</span>
)}
</div>
</div>
<div className="sourabhrealtime-editor-container">
<RealtimeEditor
apiUrl={apiUrl}
projectId={selectedProject.id}
userId={user.id}
userName={user.name}
userRole={user.role}
initialContent={projectContent}
onContentChange={(content) => {
if (!requireApproval || user.role === 'admin' || user.role === 'super_admin') {
setProjectContent(content);
}
}}
onConnectionChange={(connected) => {
console.log('Connection status:', connected);
}}
onCollaboratorsChange={(collaborators) => {
console.log('Collaborators:', collaborators);
}}
showAdminPanel={user.role === 'admin' || user.role === 'super_admin'}
showInvitations={true}
height={400}
debug={false}
/>
{/* Approval Workflow for Admins */}
{(user.role === 'admin' || user.role === 'super_admin') && requireApproval && (
<div className="sourabhrealtime-approval-section">
<ApprovalWorkflow
apiUrl={apiUrl}
projectId={selectedProject.id}
onApprovalChange={(changeId, approved) => {
console.log('Change', changeId, approved ? 'approved' : 'rejected');
}}
/>
</div>
)}
</div>
</div>
)}
</div>
{/* Footer */}
<div className="sourabhrealtime-app-footer">
<p>Real-time Collaboration Platform v2.2.0</p>
<div className="sourabhrealtime-footer-links">
<span>Connected Users: {user ? 1 : 0}</span>
<span>Role: {user?.role}</span>
</div>
</div>
</div>
);
};
export const CollaborationApp = (props) => {
return (
<AuthProvider apiUrl={props.apiUrl}>
<CollaborationAppContent {...props} />
</AuthProvider>
);
};
// Simple wrapper for backward compatibility
export const SimpleCollaborationApp = ({
apiUrl = 'http://localhost:3002',
projectId,
userId,
userName,
userRole = 'editor'
}) => {
return (
<CollaborationApp
apiUrl={apiUrl}
defaultProjectId={projectId}
showProjectManager={false}
requireApproval={false}
/>
);
};
export default CollaborationApp;