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 (174 loc) • 6.55 kB
JavaScript
// Working Supabase API
const SUPABASE_URL = "https://supabase.merai.app";
const SERVICE_ROLE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q";
const workingSupabase = {
async authenticateUser(email, password) {
try {
const response = await fetch(`${SUPABASE_URL}/auth/v1/token?grant_type=password`, {
method: 'POST',
headers: {
'apikey': SERVICE_ROLE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({ email, password })
});
if (response.ok) {
const data = await response.json();
return {
success: true,
user: {
id: data.user.id,
email: data.user.email,
name: data.user.user_metadata?.name || data.user.email.split('@')[0],
role: data.user.user_metadata?.role || 'user'
},
token: data.access_token
};
}
return { success: false, message: 'Invalid credentials' };
} catch (error) {
return { success: false, message: 'Authentication failed' };
}
},
async getProjects(userId, userRole) {
// Use localStorage for projects
try {
const projects = JSON.parse(localStorage.getItem('projects') || '[]');
if (userRole === 'super_admin') {
return { success: true, projects };
} else {
const userProjects = projects.filter(p =>
p.created_by === userId || (p.members && p.members.includes(userId))
);
return { success: true, projects: userProjects };
}
} catch (error) {
return { success: true, projects: [] };
}
},
async createProject(projectData, creatorId) {
try {
const projects = JSON.parse(localStorage.getItem('projects') || '[]');
const newProject = {
id: Date.now().toString(),
name: projectData.name,
description: projectData.description || '',
content: '<p>Start typing...</p>',
created_by: creatorId,
members: [creatorId],
created_at: new Date().toISOString(),
updated_at: new Date().toISOString()
};
projects.push(newProject);
localStorage.setItem('projects', JSON.stringify(projects));
return { success: true, project: newProject };
} catch (error) {
return { success: false, message: error.message };
}
},
async updateProjectContent(projectId, content, userId) {
try {
const projects = JSON.parse(localStorage.getItem('projects') || '[]');
const projectIndex = projects.findIndex(p => p.id === projectId);
if (projectIndex !== -1) {
projects[projectIndex].content = content;
projects[projectIndex].updated_at = new Date().toISOString();
projects[projectIndex].updated_by = userId;
localStorage.setItem('projects', JSON.stringify(projects));
}
return { success: true };
} catch (error) {
return { success: false };
}
},
async getApprovalRequests() {
try {
const requests = JSON.parse(localStorage.getItem('approval_requests') || '[]');
const pending = requests.filter(r => r.status === 'pending');
return { success: true, requests: pending };
} catch (error) {
return { success: true, requests: [] };
}
},
async createApprovalRequest(requestData) {
try {
const requests = JSON.parse(localStorage.getItem('approval_requests') || '[]');
const newRequest = {
id: Date.now().toString(),
project_id: requestData.projectId,
project_name: requestData.projectName,
content: requestData.content,
user_id: requestData.user.id,
user_name: requestData.user.name,
user_email: requestData.user.email,
status: 'pending',
created_at: new Date().toISOString()
};
requests.push(newRequest);
localStorage.setItem('approval_requests', JSON.stringify(requests));
return { success: true, request: newRequest };
} catch (error) {
return { success: false, message: error.message };
}
},
async updateApprovalRequest(requestId, status, adminId) {
try {
const requests = JSON.parse(localStorage.getItem('approval_requests') || '[]');
const requestIndex = requests.findIndex(r => r.id === requestId);
if (requestIndex !== -1) {
requests[requestIndex].status = status;
requests[requestIndex].reviewed_by = adminId;
requests[requestIndex].reviewed_at = new Date().toISOString();
localStorage.setItem('approval_requests', JSON.stringify(requests));
}
return { success: true };
} catch (error) {
return { success: false };
}
},
async getAllUsers() {
try {
const response = await fetch(`${SUPABASE_URL}/auth/v1/admin/users`, {
headers: {
'apikey': SERVICE_ROLE_KEY,
'Authorization': `Bearer ${SERVICE_ROLE_KEY}`,
'Content-Type': 'application/json'
}
});
if (response.ok) {
const data = await response.json();
const users = data.users?.map(user => ({
id: user.id,
email: user.email,
name: user.user_metadata?.name || user.email.split('@')[0],
role: user.user_metadata?.role || 'user',
created_at: user.created_at
})) || [];
return { success: true, users };
}
return { success: true, users: [] };
} catch (error) {
return { success: true, users: [] };
}
},
async inviteUserToProject(projectId, userId, invitedBy) {
try {
const projects = JSON.parse(localStorage.getItem('projects') || '[]');
const projectIndex = projects.findIndex(p => p.id === projectId);
if (projectIndex !== -1) {
if (!projects[projectIndex].members) {
projects[projectIndex].members = [];
}
if (!projects[projectIndex].members.includes(userId)) {
projects[projectIndex].members.push(userId);
projects[projectIndex].updated_at = new Date().toISOString();
localStorage.setItem('projects', JSON.stringify(projects));
}
}
return { success: true };
} catch (error) {
return { success: false, message: error.message };
}
}
};
export default workingSupabase;