33 <h2 class =" panel-title" >Activity Feed</h2 >
44 <ul class =" activity-list" >
55 <li v-for =" (activity, idx) in activities" :key =" idx" class =" activity-item" :class =" { 'user-activity': activity.isUser }" >
6- <div class =" avatar" :style =" { backgroundColor: activity.color }" >
6+ <span v-if =" activity.image_data" class =" avatar avatar-img" >
7+ <img
8+ :src =" `data:${activity.image_type || 'image/jpeg'};base64,${activity.image_data}`"
9+ alt =" User"
10+ style =" width : 40px ; height : 40px ; border-radius : 50% ; object-fit : cover ;"
11+ />
12+ </span >
13+ <div v-else class =" avatar" :style =" { backgroundColor: activity.color }" >
714 <span >{{ activity.initials }}</span >
815 </div >
916 <div class =" activity-content" >
@@ -28,6 +35,8 @@ interface Activity {
2835 description: string
2936 time: string
3037 isUser? : boolean
38+ image_data? : string | null
39+ image_type? : string
3140}
3241
3342function formatRelativeTime(iso : string ): string {
@@ -47,15 +56,17 @@ const activities = ref<Activity[]>([])
4756onMounted (async () => {
4857 try {
4958 const { username, activities : backendActivities } = (await api .getActivityFeed ()).data
50- activities .value = backendActivities .map (({ name , time , message }) => {
51- const displayName = name === ' You' ? username : name
59+ activities .value = backendActivities .map (({ name , time , message , image_data , image_type }) => {
60+ const displayName = name === ' You' ? username : name
5261 return {
5362 name: displayName ,
5463 initials: getInitials (displayName ),
5564 color: getColor (displayName ),
5665 description: message ,
5766 time: formatRelativeTime (time ),
58- isUser: name === ' You'
67+ isUser: name === ' You' ,
68+ image_data ,
69+ image_type
5970 }
6071 })
6172 } catch {
0 commit comments