safetwitch/src/components/StreamPreview.vue

85 lines
2.3 KiB
Vue
Raw Normal View History

2023-03-31 07:50:46 -04:00
<script lang="ts">
2023-05-12 10:21:31 -04:00
import { inject } from 'vue'
import { getEndpoint, abbreviate } from '@/mixins'
import type { StreamerData, CategoryMinifiedStream } from '@/types'
2023-03-31 07:50:46 -04:00
export default {
props: {
stream: {
type: Object
},
2023-03-31 07:50:46 -04:00
name: {
type: String
}
},
async setup(props) {
2023-05-12 10:21:31 -04:00
const protocol = inject('protocol')
let data: StreamerData
if (props.stream) {
const streamData = props.stream as CategoryMinifiedStream
// lossy converstion to avoid making tons of requests
// by using minimal data from category request
data = {
username: streamData.streamer.name,
login: streamData.streamer.name,
followers: 0,
isLive: true,
about: "",
pfp: streamData.streamer.pfp,
banner: "",
isPartner: false,
colorHex: streamData.streamer.colorHex,
id: 0,
stream: {
title: streamData.title,
tags: streamData.tags,
startedAt: 0,
topic: "",
viewers: streamData.viewers,
preview: streamData.preview
}
}
2023-03-31 07:50:46 -04:00
} else {
data = await getEndpoint("api/users/" + props.name)
2023-03-31 07:50:46 -04:00
}
2023-06-13 12:08:43 -04:00
const frontend_url = protocol + import.meta.env.SAFETWITCH_INSTANCE_DOMAIN
2023-03-31 07:50:46 -04:00
return {
frontend_url,
data,
2023-04-08 20:04:28 -04:00
protocol
2023-03-31 07:50:46 -04:00
}
},
methods: {
abbreviate
2023-03-31 07:50:46 -04:00
}
}
</script>
<template>
<div v-if="data.stream">
2023-04-10 21:49:02 -04:00
<div class="bg-ctp-crust rounded-lg w-[23rem] md:w-[27rem]">
<RouterLink :to="'/' + data.login">
<img :src="data.stream.preview" class="rounded-lg rounded-b-none" />
2023-04-10 00:19:39 -04:00
</RouterLink>
<div class="text-white p-2 inline-flex space-x-2 w-full h-16">
2023-03-31 07:50:46 -04:00
<div class="inline-flex">
2023-04-10 00:19:39 -04:00
<div class="inline-flex">
<img :src="data.pfp" class="rounded-full mr-2" />
2023-04-10 00:19:39 -04:00
<div class="w-full">
<p class="font-bold w-[18rem] md:w-[22.9rem] truncate">{{ data.stream.title }}</p>
2023-04-10 00:19:39 -04:00
<div class="inline-flex w-full justify-between">
<p class="text-gray-300">{{ data.username }}</p>
2023-04-10 00:19:39 -04:00
<p class="self-end float-right">
<v-icon name="io-person"></v-icon> {{ abbreviate(data.stream.viewers) }}
2023-04-10 00:19:39 -04:00
</p>
</div>
2023-03-31 07:50:46 -04:00
</div>
</div>
</div>
</div>
</div>
</div>
</template>