first commit

This commit is contained in:
Leonardo
2026-02-18 22:36:45 -03:00
parent ec6b6ef53a
commit 676042268b
122 changed files with 26354 additions and 1615 deletions
+19
View File
@@ -0,0 +1,19 @@
import { ref, onMounted } from 'vue'
import { supabase } from '@/lib/supabase/client'
const user = ref(null)
export function useAuth() {
const init = async () => {
const { data } = await supabase.auth.getSession()
user.value = data.session?.user || null
}
supabase.auth.onAuthStateChange((_, session) => {
user.value = session?.user || null
})
onMounted(init)
return { user }
}
@@ -0,0 +1,114 @@
// src/composables/useUserSettingsPersistence.js
import { ref } from 'vue'
import { supabase } from '@/lib/supabase/client'
import { useLayout } from '@/layout/composables/layout'
export function useUserSettingsPersistence() {
const { layoutConfig } = useLayout()
const userId = ref('')
const saveTimer = ref(null)
const pendingPatch = ref({})
const initializing = ref(false)
function isDarkNow() {
return document.documentElement.classList.contains('app-dark')
}
async function init() {
if (initializing.value) return
initializing.value = true
try {
const { data, error } = await supabase.auth.getUser()
if (error) throw error
userId.value = data?.user?.id || ''
console.log('[user_settings] init userId =', userId.value)
} finally {
initializing.value = false
}
}
async function flush() {
if (!userId.value) {
console.warn('[user_settings] flush cancelado: sem userId')
return
}
const patch = { ...pendingPatch.value }
pendingPatch.value = {}
const payload = {
user_id: userId.value,
theme_mode: patch.theme_mode ?? (isDarkNow() ? 'dark' : 'light'),
preset: patch.preset ?? layoutConfig.preset ?? 'Aura',
primary_color: patch.primary_color ?? layoutConfig.primary ?? 'noir',
surface_color: patch.surface_color ?? layoutConfig.surface ?? 'slate',
menu_mode: patch.menu_mode ?? layoutConfig.menuMode ?? 'static',
updated_at: new Date().toISOString()
}
console.log('[user_settings] flush payload =', payload)
const { error } = await supabase
.from('user_settings')
.upsert(payload, { onConflict: 'user_id' })
if (error) {
console.error('[user_settings] flush falhou:', error.message || error)
throw error
}
}
/**
* @param {object} patch
* @param {object} opts
* @param {number} opts.debounceMs
* @param {boolean} opts.flushNow
*/
function queuePatch(patch, opts = {}) {
const debounceMs = typeof opts.debounceMs === 'number' ? opts.debounceMs : 500
const flushNow = !!opts.flushNow
pendingPatch.value = { ...pendingPatch.value, ...patch }
if (saveTimer.value) clearTimeout(saveTimer.value)
const run = async () => {
if (!userId.value) return
const payload = {
user_id: userId.value,
theme_mode: pendingPatch.value.theme_mode ?? (isDarkNow() ? 'dark' : 'light'),
preset: pendingPatch.value.preset ?? layoutConfig.preset,
primary_color: pendingPatch.value.primary_color ?? layoutConfig.primary,
surface_color: pendingPatch.value.surface_color ?? layoutConfig.surface,
menu_mode: pendingPatch.value.menu_mode ?? layoutConfig.menuMode,
updated_at: new Date().toISOString()
}
pendingPatch.value = {}
const { error } = await supabase
.from('user_settings')
.upsert(payload, { onConflict: 'user_id' })
if (error) {
console.error('[user_settings] save falhou:', error?.message || error, payload)
throw error
}
console.log('[user_settings] saved:', payload)
}
if (flushNow) return run()
saveTimer.value = setTimeout(run, debounceMs)
}
return {
init,
queuePatch,
flush
}
}