diff --git a/src/components/About/AboutModal.tsx b/src/components/About/AboutModal.tsx index 68e12db13..f7c9b0e08 100644 --- a/src/components/About/AboutModal.tsx +++ b/src/components/About/AboutModal.tsx @@ -1,9 +1,11 @@ import { ActionIcon, + Anchor, Badge, Button, createStyles, Group, + HoverCard, Modal, Table, Text, @@ -17,6 +19,7 @@ import { IconVocabulary, IconWorldWww, } from '@tabler/icons'; +import { motion } from 'framer-motion'; import { InitOptions } from 'i18next'; import { i18n } from 'next-i18next'; import Image from 'next/image'; @@ -27,12 +30,13 @@ import { usePrimaryGradient } from '../layout/useGradient'; interface AboutModalProps { opened: boolean; closeModal: () => void; + newVersionAvailable?: string; } -export const AboutModal = ({ opened, closeModal }: AboutModalProps) => { +export const AboutModal = ({ opened, closeModal, newVersionAvailable }: AboutModalProps) => { const { classes } = useStyles(); const colorGradiant = usePrimaryGradient(); - const informations = useInformationTableItems(); + const informations = useInformationTableItems(newVersionAvailable); return ( { +const useInformationTableItems = (newVersionAvailable?: string): InformationTableItem[] => { + // TODO: Fix this to not request. Pass it as a prop. const colorGradiant = usePrimaryGradient(); let items: InformationTableItem[] = []; @@ -161,9 +166,41 @@ const useInformationTableItems = (): InformationTableItem[] => { icon: , label: 'Homarr version', content: ( - - {CURRENT_VERSION} - + + + {CURRENT_VERSION} + + {newVersionAvailable && ( + + + + + new: {newVersionAvailable} + + + + + Version{' '} + + + {newVersionAvailable} + + {' '} + is available ! Current version: {CURRENT_VERSION} + + + )} + ), }, ]; diff --git a/src/components/Settings/SettingsDrawer.tsx b/src/components/Settings/SettingsDrawer.tsx index 8e1d3b51e..f951ae585 100644 --- a/src/components/Settings/SettingsDrawer.tsx +++ b/src/components/Settings/SettingsDrawer.tsx @@ -5,7 +5,7 @@ import CustomizationSettings from './Customization/CustomizationSettings'; import CommonSettings from './Common/CommonSettings'; import Credits from './Common/Credits'; -function SettingsMenu() { +function SettingsMenu({ newVersionAvailable }: { newVersionAvailable: string }) { const { t } = useTranslation('settings/common'); return ( @@ -33,7 +33,11 @@ interface SettingsDrawerProps { closeDrawer: () => void; } -export function SettingsDrawer({ opened, closeDrawer }: SettingsDrawerProps) { +export function SettingsDrawer({ + opened, + closeDrawer, + newVersionAvailable, +}: SettingsDrawerProps & { newVersionAvailable: string }) { const { t } = useTranslation('settings/common'); return ( @@ -45,7 +49,7 @@ export function SettingsDrawer({ opened, closeDrawer }: SettingsDrawerProps) { opened={opened} onClose={closeDrawer} > - + ); diff --git a/src/components/layout/header/Header.tsx b/src/components/layout/header/Header.tsx index 3d8ae9828..1b06d4e45 100644 --- a/src/components/layout/header/Header.tsx +++ b/src/components/layout/header/Header.tsx @@ -1,4 +1,6 @@ -import { Box, createStyles, Group, Header as MantineHeader } from '@mantine/core'; +import { Box, createStyles, Group, Header as MantineHeader, Indicator } from '@mantine/core'; +import { useState, useEffect } from 'react'; +import { REPO_URL, CURRENT_VERSION } from '../../../../data/constants'; import { useConfigContext } from '../../../config/provider'; import { Logo } from '../Logo'; import { useCardStyles } from '../useCardStyles'; @@ -15,6 +17,18 @@ export function Header(props: any) { const { config } = useConfigContext(); + const [newVersionAvailable, setNewVersionAvailable] = useState(''); + useEffect(() => { + // Fetch Data here when component first mounted + fetch(`https://api.github.com/repos/${REPO_URL}/releases/latest`).then((res) => { + res.json().then((data) => { + if (data.tag_name > CURRENT_VERSION) { + setNewVersionAvailable(data.tag_name); + } + }); + }); + }, [CURRENT_VERSION]); + return ( @@ -25,7 +39,9 @@ export function Header(props: any) { - + + + diff --git a/src/components/layout/header/SettingsMenu.tsx b/src/components/layout/header/SettingsMenu.tsx index 674913024..0fe586faa 100644 --- a/src/components/layout/header/SettingsMenu.tsx +++ b/src/components/layout/header/SettingsMenu.tsx @@ -1,4 +1,4 @@ -import { ActionIcon, Menu, Tooltip } from '@mantine/core'; +import { ActionIcon, Badge, Menu, Tooltip } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconInfoCircle, IconMenu2, IconSettings } from '@tabler/icons'; import { useTranslation } from 'next-i18next'; @@ -6,7 +6,7 @@ import { AboutModal } from '../../About/AboutModal'; import { SettingsDrawer } from '../../Settings/SettingsDrawer'; import { ColorSchemeSwitch } from './SettingsMenu/ColorSchemeSwitch'; -export const SettingsMenu = () => { +export function SettingsMenu({ newVersionAvailable }: { newVersionAvailable: string }) { const [drawerOpened, drawer] = useDisclosure(false); const { t } = useTranslation('common'); const [aboutModalOpened, aboutModal] = useDisclosure(false); @@ -28,15 +28,30 @@ export const SettingsMenu = () => { } - onClick={aboutModal.open} + rightSection={ + newVersionAvailable && ( + + New + + ) + } + onClick={() => aboutModal.open()} > About - - + + ); -}; +}