sourabhrealtime
Version:
ROBUST RICH TEXT EDITOR: Single-pane contentEditable with direct text selection formatting, speech features, undo/redo, professional UI - Perfect TipTap alternative
62 lines (58 loc) • 2.07 kB
JavaScript
// Supabase configuration and API
const SUPABASE_URL = "https://supabase.merai.app";
const SERVICE_ROLE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q";
export const supabaseAPI = {
async getUsers() {
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();
return data.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 || 'editor',
created_at: user.created_at,
last_sign_in_at: user.last_sign_in_at
})) : [];
}
return [];
} catch (error) {
console.error('Supabase API error:', error);
return [];
}
},
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 || 'editor'
}
};
}
return { success: false, message: 'Invalid credentials' };
} catch (error) {
return { success: false, message: 'Authentication failed' };
}
}
};