From c20f8b824d3edacda8b0ac77c915de6f3a3dfd75 Mon Sep 17 00:00:00 2001 From: JohnDoe6345789 Date: Fri, 26 Dec 2025 00:24:27 +0000 Subject: [PATCH] code: nextjs,frontends,users (5 files) --- .../nextjs/src/components/PackageManager.tsx | 81 ++----------------- .../src/lib/nerd-mode-ide/create-node-id.ts | 9 +++ .../get-language-from-filename.ts | 20 +++++ .../nextjs/src/lib/nerd-mode-ide/types.ts | 54 +++++++++++++ frontends/nextjs/src/seed-data/users.ts | 2 +- 5 files changed, 91 insertions(+), 75 deletions(-) create mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/create-node-id.ts create mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/get-language-from-filename.ts create mode 100644 frontends/nextjs/src/lib/nerd-mode-ide/types.ts diff --git a/frontends/nextjs/src/components/PackageManager.tsx b/frontends/nextjs/src/components/PackageManager.tsx index 65e73fecb..ce7850d4e 100644 --- a/frontends/nextjs/src/components/PackageManager.tsx +++ b/frontends/nextjs/src/components/PackageManager.tsx @@ -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) { diff --git a/frontends/nextjs/src/lib/nerd-mode-ide/create-node-id.ts b/frontends/nextjs/src/lib/nerd-mode-ide/create-node-id.ts new file mode 100644 index 000000000..0aa91e7d8 --- /dev/null +++ b/frontends/nextjs/src/lib/nerd-mode-ide/create-node-id.ts @@ -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}` +} diff --git a/frontends/nextjs/src/lib/nerd-mode-ide/get-language-from-filename.ts b/frontends/nextjs/src/lib/nerd-mode-ide/get-language-from-filename.ts new file mode 100644 index 000000000..9c22b9406 --- /dev/null +++ b/frontends/nextjs/src/lib/nerd-mode-ide/get-language-from-filename.ts @@ -0,0 +1,20 @@ +const languageMap: Record = { + 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' +} diff --git a/frontends/nextjs/src/lib/nerd-mode-ide/types.ts b/frontends/nextjs/src/lib/nerd-mode-ide/types.ts new file mode 100644 index 000000000..6f6606ea6 --- /dev/null +++ b/frontends/nextjs/src/lib/nerd-mode-ide/types.ts @@ -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> + examples: Record + luaScripts: Array<{ + fileName: string + description: string + code: string + }> + tags?: string[] +} + +export interface ReactAppTemplateConfig { + id: string + name: string + description: string + rootName: string + tags?: string[] +} diff --git a/frontends/nextjs/src/seed-data/users.ts b/frontends/nextjs/src/seed-data/users.ts index e004581ac..cd9e04ab4 100644 --- a/frontends/nextjs/src/seed-data/users.ts +++ b/frontends/nextjs/src/seed-data/users.ts @@ -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)