You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.8 KiB
88 lines
1.8 KiB
import React, { useState, useEffect } from "react"; |
|
import ReactMarkdown from "react-markdown"; |
|
import { Table, Tag } from "antd"; |
|
|
|
const API_URL = "https://api.github.com/repos/owncast/owncast/releases/latest"; |
|
|
|
export default function Logs() { |
|
const [release, setRelease] = useState({ |
|
html_url: "", |
|
name: "", |
|
created_at: null, |
|
body: "", |
|
assets: [], |
|
|
|
}); |
|
|
|
const getRelease = async () => { |
|
try { |
|
const result = await fetchData(API_URL); |
|
setRelease(result); |
|
} catch (error) { |
|
console.log("==== error", error); |
|
} |
|
}; |
|
|
|
useEffect(() => { |
|
getRelease(); |
|
}, []); |
|
|
|
if (!release) { |
|
return null; |
|
} |
|
|
|
return ( |
|
<div> |
|
<h2> |
|
<a href={release.html_url}>{release.name}</a> |
|
</h2> |
|
<h1>{release.created_at}</h1> |
|
<ReactMarkdown>{release.body}</ReactMarkdown>; |
|
|
|
<h3>Downloads</h3> |
|
<AssetTable {...release.assets} /> |
|
</div> |
|
); |
|
} |
|
|
|
function AssetTable(assets) { |
|
const data = []; |
|
|
|
for (const key in assets) { |
|
data.push(assets[key]); |
|
} |
|
|
|
const columns = [ |
|
{ |
|
title: "Name", |
|
dataIndex: "name", |
|
key: "name", |
|
render: (text, entry) => |
|
`<a href="${entry.browser_download_url}">${text}</a>`, |
|
}, |
|
{ |
|
title: "Size", |
|
dataIndex: "size", |
|
key: "size", |
|
render: (text, entry) => |
|
`${(text/1024/1024).toFixed(2)} MB` |
|
}, |
|
]; |
|
|
|
return <Table dataSource={data} columns={columns} rowKey="id" />; |
|
} |
|
|
|
async function fetchData(url) { |
|
try { |
|
const response = await fetch(url); |
|
if (!response.ok) { |
|
const message = `An error has occured: ${response.status}`; |
|
throw new Error(message); |
|
} |
|
const json = await response.json(); |
|
return json; |
|
} catch (error) { |
|
console.log(error); |
|
} |
|
return {}; |
|
}
|
|
|