import clsx from 'clsx'
import {IS_LOCAL} from 'common/hosting/constants'
import {Row as rowfor} from 'common/supabase/utils'
import {groupBy, orderBy} from 'lodash'
import {Button} from 'web/components/buttons/button'
import {Col} from 'web/components/layout/col'
import {Row} from 'web/components/layout/row'
import {NoSEO} from 'web/components/NoSEO'
import {UserAvatarAndBadge} from 'web/components/widgets/user-link'
import {useAdmin} from 'web/hooks/use-admin'
import {useAPIGetter} from 'web/hooks/use-api-getter'
import {usePersistentQueryState} from 'web/hooks/use-persistent-query-state'
export default function Journeys() {
const [hoursFromNowQ, setHoursFromNowQ] = usePersistentQueryState('h', '5')
const hoursFromNow = parseInt(hoursFromNowQ ?? '5')
const {data} = useAPIGetter('get-user-journeys', {hoursFromNow: String(hoursFromNow)})
const users = data?.users ?? []
const events = data?.events ?? []
const bannedUsers = users.filter((u) => u.isBannedFromPosting)
const unBannedUsers = users.filter((u) => !u.isBannedFromPosting)
const eventsByUser = groupBy(orderBy(events as rowfor<'user_events'>[], 'ts', 'asc'), 'user_id')
const isAdmin = useAdmin()
const authorized = isAdmin || IS_LOCAL
if (!authorized) return
Not authorized
return (
User Journeys
Viewing journeys from {unBannedUsers.length} users. Showing users created: {hoursFromNow}h
ago.
{Object.keys(eventsByUser).map((userId) => {
if (bannedUsers.find((u) => u.id === userId)) return null
const events = eventsByUser[userId]
const eventGroups: {[key: string]: any[]} = {}
let eventName = ''
let groupKey = ''
events.forEach((event, index) => {
if (event.name !== eventName) groupKey = `${event.name}_${index}`
if (!eventGroups[groupKey]) eventGroups[groupKey] = []
eventGroups[groupKey].push(event)
eventName = event.name
})
const user = unBannedUsers.find((u) => u.id === userId)
return (
{user ? : userId}
- {new Date(events[0].ts!).toLocaleString()}
{Object.values(eventGroups).map((group, index) => {
const name = group[0].name
const times = group.length
const timePeriod =
new Date(group[times - 1].ts!).valueOf() - new Date(group[0].ts!).valueOf()
const duration = Math.round(timePeriod / 1000)
const data = group
.map((g) => {
if (!Object.keys(g.data).length) return
return Object.entries(g.data)
.map(([_k, v]) => `${v}`)
.join(' ')
})
.filter(Boolean)
.join('. ')
return (
{name} {times > 1 ? `${times}x` : ' '}
{duration > 1 ? ` (${duration}s)` : ' '}
{data && }
)
})}
- {new Date(events[events.length - 1].ts!).toLocaleString()}
)
})}
)
}