import clsx from "clsx"; import { useState, useEffect } from "react"; import { Link } from "react-router-dom"; import { invoke } from "@tauri-apps/api/core"; import { Button } from "@/components/ui/button"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { InstalledPrograms } from "@/types"; import { compareVersions, extractVersion, isInstalled, registerMacFiles } from "@/lib/utils"; import { CircleCheck, TriangleAlert, CircleAlert, Settings, RefreshCcw, Loader2, PackagePlus } from "lucide-react"; import { getPlatformInfo } from "@/lib/platform-utils"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useToast } from "@/hooks/use-toast"; export default function HomePage() { const { toast } = useToast(); const [isLoading, setIsLoading] = useState(true); const [isWindows, setIsWindows] = useState(false) const [windowsVersion, setWindowsVersion] = useState(null) const [isMacOs, setIsMacOs] = useState(false) const [macOsVersion, setMacOsVersion] = useState(null) const [distroId, setDistroId] = useState(null) const [distroPkgMngr, setDistroPkgMngr] = useState(null) const [installedPrograms, setInstalledPrograms] = useState({ winget: { installed: false, version: null, }, apt: { installed: false, version: null, }, dnf: { installed: false, version: null, }, brew: { installed: false, version: null, }, python: { installed: false, version: null, }, pip: { installed: false, version: null, }, python3: { installed: false, version: null, }, pip3: { installed: false, version: null, }, ffmpeg: { installed: false, version: null, }, nodejs: { installed: false, version: null, }, pytubepp: { installed: false, version: null, }, }); function checkAllPrograms() { return Promise.all([ isInstalled('winget', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, winget: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('apt', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, apt: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('dnf', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, dnf: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('homebrew', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, brew: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('python', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, python: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('pip', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, pip: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('python3', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, python3: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('pip3', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, pip3: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('ffmpeg', '-version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, ffmpeg: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('nodejs', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, nodejs: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }), isInstalled('pytubepp', '--version').then((result) => { setInstalledPrograms((prevState) => ({ ...prevState, pytubepp: { installed: result.installed, version: result.output ? extractVersion(result.output) : null, } })); }) ]); } const fetchPlatformInfo = async () => { const info = await getPlatformInfo(); setIsWindows(info.isWindows); setWindowsVersion(info.windowsVersion); setIsMacOs(info.isMacOs); setMacOsVersion(info.macOsVersion); setDistroId(info.distroId); setDistroPkgMngr(info.distroPkgMngr); }; useEffect(() => { const init = async () => { try { setIsLoading(true); await Promise.all([ checkAllPrograms(), fetchPlatformInfo() ]); } catch (error) { console.error(error); } finally { setIsLoading(false); } }; init(); }, []); return (

PytubePP Helper

settings

{ isMacOs && macOsVersion && compareVersions(macOsVersion, '10.13') > 0 ?

register to mac

: null }

refresh

{ isLoading ?

checking...

: distroId && distroPkgMngr && distroPkgMngr === 'apt' ? /* Section for Debian */

Python: {installedPrograms.python3.installed ? 'installed' : 'not installed'} {installedPrograms.python3.version ? `(${installedPrograms.python3.version})` : ''}

{installedPrograms.python3.installed ? installedPrograms.python3.version ? compareVersions(installedPrograms.python3.version, '3.8') < 0 ? : : installedPrograms.apt.installed ? : : null}

FFmpeg: {installedPrograms.ffmpeg.installed ? 'installed' : 'not installed'} {installedPrograms.ffmpeg.version ? `(${installedPrograms.ffmpeg.version})` : ''}

{installedPrograms.ffmpeg.installed ? : installedPrograms.apt.installed ? : null}

Node.js: {installedPrograms.nodejs.installed ? 'installed' : 'not installed'} {installedPrograms.nodejs.version ? `(${installedPrograms.nodejs.version})` : ''}

{installedPrograms.nodejs.installed ? : installedPrograms.apt.installed ? : null}

PytubePP: {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}

{installedPrograms.pytubepp.installed ? : installedPrograms.pip3.installed ? : null}
{(!installedPrograms.apt.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed)) ? APT Not Found APT is required to install necessary debian packages. Please install it manually for your distro. : null} {(!installedPrograms.pip3.installed && !installedPrograms.pytubepp.installed) ? PIP Not Found PIP is required to install necessary python packages. Please install it now to continue: : null} {(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.pytubepp.installed) ? Ready Everything looks ok! You can close this window now. Make sure it's always running in the background. : null}
: distroId && distroPkgMngr && distroPkgMngr === 'dnf' ? /* Section for RHEL */

Python: {installedPrograms.python3.installed ? 'installed' : 'not installed'} {installedPrograms.python3.version ? `(${installedPrograms.python3.version})` : ''}

{installedPrograms.python3.installed ? installedPrograms.python3.version ? compareVersions(installedPrograms.python3.version, '3.8') < 0 ? : : installedPrograms.dnf.installed ? : : null}

FFmpeg: {installedPrograms.ffmpeg.installed ? 'installed' : 'not installed'} {installedPrograms.ffmpeg.version ? `(${installedPrograms.ffmpeg.version})` : ''}

{installedPrograms.ffmpeg.installed ? : installedPrograms.dnf.installed ? : null}

Node.js: {installedPrograms.nodejs.installed ? 'installed' : 'not installed'} {installedPrograms.nodejs.version ? `(${installedPrograms.nodejs.version})` : ''}

{installedPrograms.nodejs.installed ? : installedPrograms.dnf.installed ? : null}

PytubePP: {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}

{installedPrograms.pytubepp.installed ? : installedPrograms.pip3.installed ? : null}
{(!installedPrograms.dnf.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed)) ? DNF Not Found DNF is required to install necessary rpm packages. Please install it manually for your distro. : null} {(!installedPrograms.pip3.installed && !installedPrograms.pytubepp.installed) ? PIP Not Found PIP is required to install necessary python packages. Please install it now to continue: : null} {(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.pytubepp.installed) ? Ready Everything looks ok! You can close this window now. Make sure it's always running in the background. : null}
: isWindows && windowsVersion && parseInt(windowsVersion) >= 17134 ? /* Section for Windows */

Python: {installedPrograms.python.installed ? 'installed' : 'not installed'} {installedPrograms.python.version ? `(${installedPrograms.python.version})` : ''}

{installedPrograms.python.installed ? installedPrograms.python.version ? compareVersions(installedPrograms.python.version, '3.8') < 0 ? : : installedPrograms.winget.installed ? : : null}

FFmpeg: {installedPrograms.ffmpeg.installed ? 'installed' : 'not installed'} {installedPrograms.ffmpeg.version ? `(${installedPrograms.ffmpeg.version})` : ''}

{installedPrograms.ffmpeg.installed ? : installedPrograms.winget.installed ? : null}

Node.js: {installedPrograms.nodejs.installed ? 'installed' : 'not installed'} {installedPrograms.nodejs.version ? `(${installedPrograms.nodejs.version})` : ''}

{installedPrograms.nodejs.installed ? : installedPrograms.winget.installed ? : null}

PytubePP: {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}

{installedPrograms.pytubepp.installed ? : installedPrograms.pip.installed ? : null}
{(!installedPrograms.winget.installed && (!installedPrograms.python.installed || !installedPrograms.ffmpeg.installed)) ? WinGet Not Found WinGet is required to install necessary packages. Please install it manually from here. : null} {(installedPrograms.python.installed && installedPrograms.ffmpeg.installed && installedPrograms.pytubepp.installed) ? Ready Everything looks ok! You can close this window now. Make sure it's always running in the background. : null}
: isMacOs && macOsVersion && compareVersions(macOsVersion, '10.13') > 0 ? /* Section for macOS */

Python: {installedPrograms.python3.installed ? 'installed' : 'not installed'} {installedPrograms.python3.version ? `(${installedPrograms.python3.version})` : ''}

{installedPrograms.python3.installed ? installedPrograms.python3.version ? compareVersions(installedPrograms.python3.version, '3.8') < 0 ? : : installedPrograms.brew.installed ? : : null}

FFmpeg: {installedPrograms.ffmpeg.installed ? 'installed' : 'not installed'} {installedPrograms.ffmpeg.version ? `(${installedPrograms.ffmpeg.version})` : ''}

{installedPrograms.ffmpeg.installed ? : installedPrograms.brew.installed ? : null}

Node.js: {installedPrograms.nodejs.installed ? 'installed' : 'not installed'} {installedPrograms.nodejs.version ? `(${installedPrograms.nodejs.version})` : ''}

{installedPrograms.nodejs.installed ? : installedPrograms.brew.installed ? : null}

PytubePP: {installedPrograms.pytubepp.installed ? 'installed' : 'not installed'} {installedPrograms.pytubepp.version ? `(${installedPrograms.pytubepp.version})` : ''}

{installedPrograms.pytubepp.installed ? : installedPrograms.pip3.installed ? : null}
{(!installedPrograms.brew.installed && (!installedPrograms.python3.installed || !installedPrograms.ffmpeg.installed)) ? Homebrew Not Found Homebrew is required to install necessary unix packages. Please install it manually for your mac. : null} {(!installedPrograms.pip3.installed && !installedPrograms.pytubepp.installed) ? PIP Not Found PIP is required to install necessary python packages. Please install it now to continue: : null} {(installedPrograms.python3.installed && installedPrograms.ffmpeg.installed && installedPrograms.nodejs.installed && installedPrograms.pytubepp.installed) ? Ready Everything looks ok! You can close this window now. Make sure it's always running in the background. : null}
:
Unsupported OS Sorry, your os/distro is currently not supported. If you think this is just a mistake or you want to request us to add support for your os/distro you can create a github issue here.
}
); }