presets community / non community
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
import { useParams, useRouter } from 'next/navigation'
|
||||
import { useCallback, useEffect, useState } from 'react'
|
||||
import { Editor, SceneLoader } from '@pascal-app/editor'
|
||||
import type { SceneGraph } from '@pascal-app/editor'
|
||||
import type { SceneGraph, PresetsAdapter } from '@pascal-app/editor'
|
||||
import { CommunityAppMenu } from '@/features/community/components/community-app-menu'
|
||||
import { ProjectHeader } from '@/features/community/components/project-header'
|
||||
import { useAuth } from '@/features/community/lib/auth/hooks'
|
||||
@@ -49,6 +49,61 @@ export default function EditorPage() {
|
||||
await saveProjectModel(projectId, scene)
|
||||
}, [projectId])
|
||||
|
||||
const apiPresetsAdapter: PresetsAdapter = {
|
||||
tabs: ['community', 'mine'],
|
||||
isAuthenticated,
|
||||
fetchPresets: async (type, tab) => {
|
||||
const res = await fetch(`/api/presets?type=${type}&tab=${tab}`)
|
||||
if (!res.ok) return []
|
||||
const json = await res.json()
|
||||
return json.presets ?? []
|
||||
},
|
||||
savePreset: async (type, name, data) => {
|
||||
const res = await fetch('/api/presets', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ type, name, data }),
|
||||
})
|
||||
if (!res.ok) return null
|
||||
const json = await res.json()
|
||||
return json.preset?.id ?? null
|
||||
},
|
||||
overwritePreset: async (_type, id, data) => {
|
||||
await fetch(`/api/presets/${id}`, {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ data }),
|
||||
})
|
||||
},
|
||||
renamePreset: async (id, name) => {
|
||||
await fetch(`/api/presets/${id}`, {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ name }),
|
||||
})
|
||||
},
|
||||
deletePreset: async (id) => {
|
||||
await fetch(`/api/presets/${id}`, { method: 'DELETE' })
|
||||
},
|
||||
togglePresetCommunity: async (id, current) => {
|
||||
await fetch(`/api/presets/${id}`, {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ is_community: !current }),
|
||||
})
|
||||
},
|
||||
uploadPresetThumbnail: async (presetId, blob) => {
|
||||
const res = await fetch(`/api/presets/${presetId}/thumbnail`, {
|
||||
method: 'POST',
|
||||
body: blob,
|
||||
headers: { 'Content-Type': 'image/png' },
|
||||
})
|
||||
if (!res.ok) return null
|
||||
const json = await res.json()
|
||||
return json.thumbnail_url ?? null
|
||||
},
|
||||
}
|
||||
|
||||
const onThumbnailCapture = useCallback(async (blob: Blob) => {
|
||||
const result = await uploadProjectThumbnail(projectId, blob)
|
||||
if (result.success) {
|
||||
@@ -76,6 +131,7 @@ export default function EditorPage() {
|
||||
isVersionPreviewMode={isVersionPreviewMode}
|
||||
isLoading={isProjectLoading}
|
||||
onThumbnailCapture={onThumbnailCapture}
|
||||
presetsAdapter={apiPresetsAdapter}
|
||||
settingsPanelProps={{
|
||||
projectId,
|
||||
projectVisibility: activeProject ? {
|
||||
|
||||
Reference in New Issue
Block a user