diff --git a/frontend/src/components/admin/content/AvatarManager.tsx b/frontend/src/components/admin/content/AvatarManager.tsx new file mode 100644 index 0000000..bba91f0 --- /dev/null +++ b/frontend/src/components/admin/content/AvatarManager.tsx @@ -0,0 +1,165 @@ +// @ts-nocheck +import React, { useState, useEffect } from 'react'; +import { getDirectusClient } from '@/lib/directus/client'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; + +export default function AvatarManager() { + const [avatars, setAvatars] = useState([]); + const [variants, setVariants] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedAvatar, setSelectedAvatar] = useState(null); + + useEffect(() => { + loadData(); + }, []); + + const loadData = async () => { + try { + const directus = await getDirectusClient(); + + // Load avatars + const avatarData = await directus.request({ + method: 'GET', + path: '/items/avatar_intelligence' + }); + setAvatars(avatarData.data || []); + + // Load variants + const variantData = await directus.request({ + method: 'GET', + path: '/items/avatar_variants' + }); + setVariants(variantData.data || []); + + setLoading(false); + } catch (error) { + console.error('Error loading avatars:', error); + setLoading(false); + } + }; + + const getVariantsForAvatar = (avatarKey) => { + return variants.filter(v => v.avatar_key === avatarKey); + }; + + if (loading) { + return ( +
+
Loading avatars...
+
+ ); + } + + return ( +
+ {/* Summary Stats */} +
+ + +
{avatars.length}
+
Base Avatars
+
+
+ + +
{variants.length}
+
Total Variants
+
+
+ + +
+ {avatars.reduce((sum, a) => sum + (a.business_niches?.length || 0), 0)} +
+
Business Niches
+
+
+
+ + {/* Avatar List */} +
+ {avatars.map((avatar) => { + const avatarVariants = getVariantsForAvatar(avatar.avatar_key); + + return ( + setSelectedAvatar(selectedAvatar === avatar.avatar_key ? null : avatar.avatar_key)} + > + + + {avatar.base_name} + + {avatar.wealth_cluster} + + + + + {/* Avatar Key */} +
+
Avatar Key
+ + {avatar.avatar_key} + +
+ + {/* Business Niches */} +
+
+ Business Niches ({avatar.business_niches?.length || 0}) +
+
+ {(avatar.business_niches || []).slice(0, 5).map((niche, i) => ( + + {niche} + + ))} + {(avatar.business_niches?.length || 0) > 5 && ( + + +{avatar.business_niches.length - 5} more + + )} +
+
+ + {/* Variants */} + {selectedAvatar === avatar.avatar_key && ( +
+
+ Variants ({avatarVariants.length}) +
+
+ {avatarVariants.map((variant) => ( +
+
+ + {variant.variant_type} + + + {variant.data?.pronoun || 'N/A'} + +
+
+
Identity: {variant.data?.identity}
+
Pronouns: + {variant.data?.pronoun}/{variant.data?.ppronoun}/{variant.data?.pospronoun} +
+
+
+ ))} +
+
+ )} +
+
+ ); + })} +
+
+ ); +} diff --git a/frontend/src/pages/admin/content/avatars.astro b/frontend/src/pages/admin/content/avatars.astro index fd5f7e3..12122fe 100644 --- a/frontend/src/pages/admin/content/avatars.astro +++ b/frontend/src/pages/admin/content/avatars.astro @@ -1,13 +1,14 @@ --- import Layout from '@/layouts/AdminLayout.astro'; +import AvatarManager from '@/components/admin/content/AvatarManager'; ---
-

Avatars

-

Manage your 10 Base Avatars and Intelligence here.

-
-

🚧 Intelligence Station Under Construction

+
+

Avatar Intelligence

+

Manage your 10 base avatars, variants, and business niches.

+