mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-05-25 23:24:03 +00:00
Major additions: - Complete Next.js studio application with 1600+ components - Docker support (Dockerfile.combined, docker-compose.yml) - GCP deployment documentation and benchmarks - SQL benchmark scripts for performance testing - Sentry integration for monitoring - Comprehensive test suite and mocks Studio features: - Dashboard and admin interfaces - Data visualization components - Authentication and user management - API integration with RuVector backend - Static data and public assets 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import { createClient } from '@supabase/supabase-js'
|
|
|
|
const SUPPORT_API_URL = process.env.NEXT_PUBLIC_SUPPORT_API_URL || ''
|
|
const SUPPORT_API_KEY = process.env.NEXT_PUBLIC_SUPPORT_ANON_KEY || ''
|
|
|
|
// [Joshen TODO] Feedback form and support attachments should use this
|
|
export const uploadAttachment = async (
|
|
bucket: string,
|
|
fileName: string,
|
|
image: File,
|
|
getUrl: boolean = true
|
|
) => {
|
|
const supabaseClient = createClient(SUPPORT_API_URL, SUPPORT_API_KEY, {
|
|
auth: {
|
|
persistSession: false,
|
|
autoRefreshToken: false,
|
|
// @ts-ignore
|
|
multiTab: false,
|
|
detectSessionInUrl: false,
|
|
localStorage: {
|
|
getItem: (key: string) => undefined,
|
|
setItem: (key: string, value: string) => {},
|
|
removeItem: (key: string) => {},
|
|
},
|
|
},
|
|
})
|
|
|
|
const options = { cacheControl: '3600' }
|
|
|
|
const { data: file, error } = await supabaseClient.storage
|
|
.from(bucket)
|
|
.upload(fileName, image, options)
|
|
|
|
if (error) {
|
|
console.error('Failed to upload:', error)
|
|
return undefined
|
|
}
|
|
|
|
if (file && getUrl) {
|
|
const { data } = await supabaseClient.storage.from(bucket).getPublicUrl(file.path)
|
|
return data?.publicUrl
|
|
}
|
|
|
|
return undefined
|
|
}
|