code: nextjs,frontends,users (5 files)

This commit is contained in:
2025-12-26 00:24:27 +00:00
parent 369d44e1eb
commit c20f8b824d
5 changed files with 91 additions and 75 deletions

View File

@@ -9,9 +9,9 @@ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, D
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui'
import { Separator } from '@/components/ui'
import { toast } from 'sonner'
import { Database } from '@/lib/database'
import { PACKAGE_CATALOG } from '@/lib/package-catalog'
import type { PackageManifest, PackageContent, InstalledPackage } from '@/lib/package-types'
import { installPackage, listInstalledPackages, togglePackageEnabled, uninstallPackage } from '@/lib/api/packages'
import { Package, Download, Trash, Power, MagnifyingGlass, Star, Tag, User, TrendUp, Funnel, Export, ArrowSquareIn } from '@phosphor-icons/react'
import { PackageImportExport } from './PackageImportExport'
@@ -36,7 +36,7 @@ export function PackageManager({ onClose }: PackageManagerProps) {
}, [])
const loadPackages = async () => {
const installed = await Database.getInstalledPackages()
const installed = await listInstalledPackages()
setInstalledPackages(installed)
const allPackages = Object.values(PACKAGE_CATALOG).map(pkg => ({
@@ -56,53 +56,9 @@ export function PackageManager({ onClose }: PackageManagerProps) {
return
}
const { content, manifest } = packageEntry
await installPackage(packageId)
const currentSchemas = await Database.getSchemas()
const currentPages = await Database.getPages()
const currentWorkflows = await Database.getWorkflows()
const currentLuaScripts = await Database.getLuaScripts()
const currentHierarchy = await Database.getComponentHierarchy()
const currentConfigs = await Database.getComponentConfigs()
const newSchemas = [...currentSchemas, ...content.schemas]
const newPages = [...currentPages, ...content.pages]
const newWorkflows = [...currentWorkflows, ...content.workflows]
const newLuaScripts = [...currentLuaScripts, ...content.luaScripts]
const newHierarchy = { ...currentHierarchy, ...content.componentHierarchy }
const newConfigs = { ...currentConfigs, ...content.componentConfigs }
await Database.setSchemas(newSchemas)
await Database.setPages(newPages)
await Database.setWorkflows(newWorkflows)
await Database.setLuaScripts(newLuaScripts)
await Database.setComponentHierarchy(newHierarchy)
await Database.setComponentConfigs(newConfigs)
if (content.cssClasses) {
const currentCssClasses = await Database.getCssClasses()
await Database.setCssClasses([...currentCssClasses, ...content.cssClasses])
}
if (content.dropdownConfigs) {
const currentDropdowns = await Database.getDropdownConfigs()
await Database.setDropdownConfigs([...currentDropdowns, ...content.dropdownConfigs])
}
if (content.seedData) {
await Database.setPackageData(packageId, content.seedData)
}
const installedPackage: InstalledPackage = {
packageId: manifest.id,
installedAt: Date.now(),
version: manifest.version,
enabled: true,
}
await Database.installPackage(installedPackage)
toast.success(`${manifest.name} installed successfully!`)
toast.success(`${packageEntry.manifest.name} installed successfully!`)
await loadPackages()
setShowDetails(false)
} catch (error) {
@@ -121,32 +77,9 @@ export function PackageManager({ onClose }: PackageManagerProps) {
return
}
const { content, manifest } = packageEntry
await uninstallPackage(packageId)
const currentSchemas = await Database.getSchemas()
const currentPages = await Database.getPages()
const currentWorkflows = await Database.getWorkflows()
const currentLuaScripts = await Database.getLuaScripts()
const packageSchemaNames = content.schemas.map(s => s.name)
const packagePageIds = content.pages.map(p => p.id)
const packageWorkflowIds = content.workflows.map(w => w.id)
const packageLuaIds = content.luaScripts.map(l => l.id)
const filteredSchemas = currentSchemas.filter(s => !packageSchemaNames.includes(s.name))
const filteredPages = currentPages.filter(p => !packagePageIds.includes(p.id))
const filteredWorkflows = currentWorkflows.filter(w => !packageWorkflowIds.includes(w.id))
const filteredLuaScripts = currentLuaScripts.filter(l => !packageLuaIds.includes(l.id))
await Database.setSchemas(filteredSchemas)
await Database.setPages(filteredPages)
await Database.setWorkflows(filteredWorkflows)
await Database.setLuaScripts(filteredLuaScripts)
await Database.deletePackageData(packageId)
await Database.uninstallPackage(packageId)
toast.success(`${manifest.name} uninstalled successfully!`)
toast.success(`${packageEntry.manifest.name} uninstalled successfully!`)
await loadPackages()
setShowDetails(false)
} catch (error) {
@@ -157,7 +90,7 @@ export function PackageManager({ onClose }: PackageManagerProps) {
const handleTogglePackage = async (packageId: string, enabled: boolean) => {
try {
await Database.togglePackageEnabled(packageId, enabled)
await togglePackageEnabled(packageId, enabled)
toast.success(enabled ? 'Package enabled' : 'Package disabled')
await loadPackages()
} catch (error) {

View File

@@ -0,0 +1,9 @@
export function createNodeId(prefix: string): string {
const globalCrypto = globalThis.crypto
if (globalCrypto && 'randomUUID' in globalCrypto) {
return `${prefix}-${globalCrypto.randomUUID()}`
}
const fallback = Math.random().toString(16).slice(2)
return `${prefix}-${Date.now()}-${fallback}`
}

View File

@@ -0,0 +1,20 @@
const languageMap: Record<string, string> = {
ts: 'typescript',
tsx: 'typescript',
js: 'javascript',
jsx: 'javascript',
json: 'json',
html: 'html',
css: 'css',
scss: 'scss',
lua: 'lua',
py: 'python',
md: 'markdown',
cpp: 'cpp',
h: 'cpp',
}
export function getLanguageFromFilename(filename: string): string {
const ext = filename.split('.').pop()?.toLowerCase()
return languageMap[ext || ''] || 'plaintext'
}

View File

@@ -0,0 +1,54 @@
export type FileNodeType = 'file' | 'folder'
export interface FileNode {
id: string
name: string
type: FileNodeType
content?: string
language?: string
children?: FileNode[]
expanded?: boolean
exportPath?: string
}
export interface FileEntry {
path: string
content: string
}
export interface PackageTemplate {
id: string
name: string
description: string
rootName: string
tree: FileNode[]
tags?: string[]
}
export interface PackageTemplateConfig {
id: string
name: string
description: string
rootName: string
packageId: string
author: string
version: string
category: string
summary: string
components: Array<Record<string, unknown>>
examples: Record<string, unknown>
luaScripts: Array<{
fileName: string
description: string
code: string
}>
tags?: string[]
}
export interface ReactAppTemplateConfig {
id: string
name: string
description: string
rootName: string
tags?: string[]
}

View File

@@ -50,9 +50,9 @@ export async function initializeUsers() {
for (const user of users) {
const scrambledPassword = getScrambledPassword(user.username)
const passwordHash = await hashPassword(scrambledPassword)
await Database.addUser(user)
await Database.setCredential(user.username, passwordHash)
await Database.setFirstLoginFlag(user.username, true)
await Database.addUser(user)
}
await Database.setGodCredentialsExpiry(Date.now() + 60 * 60 * 1000)