RSS Git Download  Clone
Raw Blame History 6kB 121 lines
import { useMemo } from 'react'
import { List, ListItem, Divider, Box } from '@mui/material'
import P3xrAccordion from '../../components/P3xrAccordion'
import { useI18nStore } from '../../stores/i18n.store'
import { useRedisStateStore } from '../../stores/redis-state.store'
import { isShortcutsEnabled, getShortcutsWithDescriptions } from '../../stores/shortcuts'

const pairRowSx = { display: 'flex', width: '100%', gap: 2, alignItems: 'center' }
const labelSx = { flex: '1 1 auto', minWidth: 0, fontWeight: 700 }
const valueSx = { flex: '0 1 60%', minWidth: 0, textAlign: 'right' }

const Row = ({ label, value }: { label: React.ReactNode, value: React.ReactNode }) => (
    <>
        <ListItem>
            <Box sx={pairRowSx}>
                <Box sx={labelSx}>{label}</Box>
                <Box sx={valueSx}>{value}</Box>
            </Box>
        </ListItem>
        <Divider />
    </>
)

export default function InfoPage() {
    const strings = useI18nStore(s => s.strings)
    const version = useRedisStateStore(s => s.version)
    const connection = useRedisStateStore(s => s.connection)
    const info = useRedisStateStore(s => s.info)
    const modules = useRedisStateStore(s => s.modules)

    const isElectron = isShortcutsEnabled()
    const shortcutsList = useMemo(() => getShortcutsWithDescriptions(), [strings])

    const isConnected = !!connection
    const redisVersion = info?.server?.redis_version || '-'
    const moduleNames = (modules || []).map((m: any) => m.name)

    const languageList = useMemo(() => {
        const langObj = strings?.language || {}
        return Object.keys(langObj).sort().map(code => ({ code, name: langObj[code] }))
    }, [strings])

    return (
        <Box sx={{ pb: 1 }}>
            {/* Keyboard Shortcuts (Electron only) */}
            {isElectron && (
                <>
                    <P3xrAccordion title={strings?.label?.keyboardShortcuts} accordionKey="info-shortcuts">
                        <List disablePadding>
                            {shortcutsList.map(s => (
                                <Box key={s.key}>
                                    <ListItem>
                                        <Box sx={pairRowSx}>
                                            <Box sx={labelSx}>
                                                <Box component="kbd" sx={{
                                                    fontFamily: "'Roboto Mono', monospace", fontSize: 12,
                                                    border: 1, borderColor: 'divider', borderRadius: '4px',
                                                    px: 1, py: 0.25, minWidth: 70, textAlign: 'center',
                                                    bgcolor: 'action.hover', display: 'inline-block',
                                                }}>
                                                    {s.key}
                                                </Box>
                                            </Box>
                                            <Box sx={valueSx}>{s.description}</Box>
                                        </Box>
                                    </ListItem>
                                    <Divider />
                                </Box>
                            ))}
                        </List>
                    </P3xrAccordion>
                    <br />
                        </>
            )}

            {/* About */}
            <P3xrAccordion title={strings?.label?.about} accordionKey="info-about">
                <List disablePadding>
                    <Row label={strings?.label?.version} value={version} />
                    {isConnected && <Row label={strings?.label?.redisVersion} value={redisVersion} />}
                    {isConnected && moduleNames.length > 0 && (
                        <Row label={strings?.label?.modules} value={moduleNames.join(', ')} />
                    )}
                    <Row label="GitHub"
                        value={<a href="https://github.com/patrikx3/redis-ui" target="_blank" rel="noreferrer" style={{ color: 'inherit' }}>patrikx3/redis-ui</a>} />
                    <Row label={strings?.title?.donate}
                        value={<a href="https://www.paypal.me/patrikx3" target="_blank" rel="noreferrer" style={{ color: 'inherit' }}>PayPal</a>} />
                    <Row label={strings?.intention?.githubChangelog}
                        value={<a href="https://github.com/patrikx3/redis-ui/blob/master/change-log.md#change-log" target="_blank" rel="noreferrer" style={{ color: 'inherit' }}>change-log.md</a>} />
                </List>
            </P3xrAccordion>
            <br />
            {/* Supported Languages */}
            <P3xrAccordion title={`${strings?.label?.supportedLanguages} (${languageList.length})`} accordionKey="info-languages">
                <List disablePadding>
                    {languageList.map(lang => (
                        <Box key={lang.code}>
                            <ListItem>
                                <Box sx={pairRowSx}>
                                    <Box sx={labelSx}>
                                        <Box component="kbd" sx={{
                                            fontFamily: "'Roboto Mono', monospace", fontSize: 11,
                                            border: 1, borderColor: 'divider', borderRadius: '4px',
                                            px: 1, py: 0.25, minWidth: 50, textAlign: 'center',
                                            bgcolor: 'action.hover', display: 'inline-block',
                                        }}>
                                            {lang.code}
                                        </Box>
                                    </Box>
                                    <Box sx={valueSx}>{lang.name}</Box>
                                </Box>
                            </ListItem>
                            <Divider />
                        </Box>
                    ))}
                </List>
            </P3xrAccordion>
        </Box>
    )
}