import { ActionIcon, Anchor, Badge, Button, createStyles, Divider, Group, HoverCard, Modal, Table, Text, Title, } from '@mantine/core'; import { IconBrandDiscord, IconBrandGithub, IconLanguage, IconVersions, IconVocabulary, IconWorldWww, } from '@tabler/icons'; import { motion } from 'framer-motion'; import { InitOptions } from 'i18next'; import { i18n, Trans, useTranslation } from 'next-i18next'; import Image from 'next/image'; import { ReactNode } from 'react'; import { CURRENT_VERSION } from '../../../data/constants'; import { usePrimaryGradient } from '../layout/useGradient'; interface AboutModalProps { opened: boolean; closeModal: () => void; newVersionAvailable?: string; } export const AboutModal = ({ opened, closeModal, newVersionAvailable }: AboutModalProps) => { const { classes } = useStyles(); const colorGradiant = usePrimaryGradient(); const informations = useInformationTableItems(newVersionAvailable); const { t } = useTranslation(['common', 'layout/modals/about']); return ( closeModal()} opened={opened} title={ {t('about')} Homarr } size="xl" > {informations.map((item, index) => ( ))}
{item.icon} {t(item.label)} {item.content}
{t('layout/modals/about:contact')}
); }; interface InformationTableItem { icon: ReactNode; label: string; content: ReactNode; } interface ExtendedInitOptions extends InitOptions { locales: string[]; } const useInformationTableItems = (newVersionAvailable?: string): InformationTableItem[] => { // TODO: Fix this to not request. Pass it as a prop. const colorGradiant = usePrimaryGradient(); let items: InformationTableItem[] = []; if (i18n !== null) { const usedI18nNamespaces = i18n.reportNamespaces.getUsedNamespaces(); const initOptions = i18n.options as ExtendedInitOptions; items = [ ...items, { icon: , label: 'layout/modals/about:i18n', content: ( {usedI18nNamespaces.length} ), }, { icon: , label: 'layout/modals/about:locales', content: ( {initOptions.locales.length} ), }, ]; } items = [ ...items, { icon: , label: 'version', content: ( {CURRENT_VERSION} {newVersionAvailable && ( new: {newVersionAvailable} Version{' '} {newVersionAvailable} {' '} is available ! Current version: {CURRENT_VERSION} )} ), }, ]; return items; }; const useStyles = createStyles(() => ({ informationTableColumn: { textAlign: 'right', }, informationIcon: { cursor: 'default', }, }));