About Screen

This commit is contained in:
Aria Moradi 2021-05-25 21:06:27 +04:30
parent 4ef32d8037
commit 37bff6c76c
6 changed files with 115 additions and 6 deletions

View File

@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jmailen.gradle.kotlinter.tasks.FormatTask import org.jmailen.gradle.kotlinter.tasks.FormatTask
import org.jmailen.gradle.kotlinter.tasks.LintTask import org.jmailen.gradle.kotlinter.tasks.LintTask
import java.io.BufferedReader import java.io.BufferedReader
import java.time.Instant
plugins { plugins {
application application
@ -117,6 +118,10 @@ buildConfig {
buildConfigField("String", "VERSION", tachideskVersion) buildConfigField("String", "VERSION", tachideskVersion)
buildConfigField("String", "REVISION", tachideskRevision) buildConfigField("String", "REVISION", tachideskRevision)
buildConfigField("String", "BUILD_TYPE", if (System.getenv("TachideskBuildType") == "Stable") "Stable" else "Preview") buildConfigField("String", "BUILD_TYPE", if (System.getenv("TachideskBuildType") == "Stable") "Stable" else "Preview")
buildConfigField("long", "BUILD_TIME", Instant.now().epochSecond.toString())
buildConfigField("String", "GITHUB", "https://github.com/Suwayomi/Tachidesk")
buildConfigField("String", "DISCORD", "https://discord.gg/DDZdqZWaHA")
} }
tasks { tasks {

View File

@ -10,17 +10,25 @@ package ir.armor.tachidesk.server.impl_internal
import ir.armor.tachidesk.server.BuildConfig import ir.armor.tachidesk.server.BuildConfig
data class AboutDataClass( data class AboutDataClass(
val name: String,
val version: String, val version: String,
val revision: String, val revision: String,
val buildType: String, val buildType: String,
val buildTime: Long,
val github: String,
val discord: String,
) )
object About { object About {
fun getAbout(): AboutDataClass { fun getAbout(): AboutDataClass {
return AboutDataClass( return AboutDataClass(
BuildConfig.NAME,
BuildConfig.VERSION, BuildConfig.VERSION,
BuildConfig.REVISION, BuildConfig.REVISION,
BuildConfig.BUILD_TYPE, BuildConfig.BUILD_TYPE,
BuildConfig.BUILD_TIME,
BuildConfig.GITHUB,
BuildConfig.DISCORD,
) )
} }
} }

View File

@ -27,6 +27,7 @@ import Settings from './screens/Settings';
import Categories from './screens/settings/Categories'; import Categories from './screens/settings/Categories';
import Backup from './screens/settings/Backup'; import Backup from './screens/settings/Backup';
import useLocalStorage from './util/useLocalStorage'; import useLocalStorage from './util/useLocalStorage';
import About from './screens/settings/About';
export default function App() { export default function App() {
const [title, setTitle] = useState<string>('Tachidesk'); const [title, setTitle] = useState<string>('Tachidesk');
@ -101,6 +102,9 @@ export default function App() {
<Route path="/library"> <Route path="/library">
<Library /> <Library />
</Route> </Route>
<Route path="/settings/about">
<About />
</Route>
<Route path="/settings/categories"> <Route path="/settings/categories">
<Categories /> <Categories />
</Route> </Route>

View File

@ -12,12 +12,19 @@ import BackupIcon from '@material-ui/icons/Backup';
import Brightness6Icon from '@material-ui/icons/Brightness6'; import Brightness6Icon from '@material-ui/icons/Brightness6';
import DnsIcon from '@material-ui/icons/Dns'; import DnsIcon from '@material-ui/icons/Dns';
import EditIcon from '@material-ui/icons/Edit'; import EditIcon from '@material-ui/icons/Edit';
import { import InfoIcon from '@material-ui/icons/Info';
Button, Dialog, DialogActions, DialogContent,
DialogContentText, IconButton, ListItemSecondaryAction, Switch, TextField,
ListItemIcon, ListItemText,
} from '@material-ui/core';
import ListItem from '@material-ui/core/ListItem'; import ListItem from '@material-ui/core/ListItem';
import ListItemIcon from '@material-ui/core/ListItemIcon';
import ListItemText from '@material-ui/core/ListItemText';
import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';
import Switch from '@material-ui/core/Switch';
import Button from '@material-ui/core/Button';
import IconButton from '@material-ui/core/IconButton';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import TextField from '@material-ui/core/TextField';
import NavbarContext from '../context/NavbarContext'; import NavbarContext from '../context/NavbarContext';
import DarkTheme from '../context/DarkTheme'; import DarkTheme from '../context/DarkTheme';
import useLocalStorage from '../util/useLocalStorage'; import useLocalStorage from '../util/useLocalStorage';
@ -87,9 +94,14 @@ export default function Settings() {
> >
<EditIcon /> <EditIcon />
</IconButton> </IconButton>
</ListItemSecondaryAction> </ListItemSecondaryAction>
</ListItem> </ListItem>
<ListItemLink href="/settings/about">
<ListItemIcon>
<InfoIcon />
</ListItemIcon>
<ListItemText primary="About" />
</ListItemLink>
</List> </List>
<Dialog open={dialogOpen} onClose={handleDialogCancel}> <Dialog open={dialogOpen} onClose={handleDialogCancel}>

View File

@ -0,0 +1,70 @@
import React, { useContext, useEffect, useState } from 'react';
import { CircularProgress, makeStyles } from '@material-ui/core';
import List from '@material-ui/core/List';
import ListItem from '@material-ui/core/ListItem';
import ListItemText from '@material-ui/core/ListItemText';
import client from '../../util/client';
import ListItemLink from '../../util/ListItemLink';
import NavbarContext from '../../context/NavbarContext';
const useStyles = makeStyles({
loading: {
width: '100vw',
'& div': {
margin: '50px auto',
display: 'block',
},
},
});
export default function About() {
const { setTitle, setAction } = useContext(NavbarContext);
const classes = useStyles();
const [about, setAbout] = useState<IAbout>();
useEffect(() => { setTitle('About'); setAction(<></>); }, []);
useEffect(() => {
client.get('/api/v1/about')
.then((response) => response.data)
.then((data:IAbout) => {
setAbout(data);
});
}, []);
if (about === undefined) {
return (
<div className={classes.loading}>
<CircularProgress thickness={5} />
</div>
);
}
const version = () => {
if (about.buildType === 'Stable') return `${about.version}`;
return `${about.version}-${about.revision}`;
};
const buildTime = () => new Date(about.buildTime * 1000).toUTCString();
return (
<List>
<ListItem>
<ListItemText primary="Server" secondary={`${about.name} ${about.buildType}`} />
</ListItem>
<ListItem>
<ListItemText primary="Server version" secondary={version()} />
</ListItem>
<ListItem>
<ListItemText primary="Build time" secondary={buildTime()} />
</ListItem>
<ListItemLink href={about.github}>
<ListItemText primary="Github" secondary={about.github} />
</ListItemLink>
<ListItemLink href={about.discord}>
<ListItemText primary="Discord" secondary={about.discord} />
</ListItemLink>
</List>
);
}

View File

@ -119,3 +119,13 @@ interface IReaderProps {
nextChapter: () => void nextChapter: () => void
prevChapter: () => void prevChapter: () => void
} }
interface IAbout {
name: string
version: string
revision: string
buildType: 'Stable' | 'Preview'
buildTime: number
github: string
discord: string
}