'use client' import { useBoolean } from 'ahooks' import Link from 'next/link' import { useSelectedLayoutSegments } from 'next/navigation' import * as React from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import Confirm from '@/app/components/base/confirm' import Divider from '@/app/components/base/divider' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { useGetInstalledApps, useUninstallApp, useUpdateAppPinStatus } from '@/service/use-explore' import { cn } from '@/utils/classnames' import Toast from '../../base/toast' import Item from './app-nav-item' import NoApps from './no-apps' const SideBar = () => { const { t } = useTranslation() const segments = useSelectedLayoutSegments() const lastSegment = segments.slice(-1)[0] const isDiscoverySelected = lastSegment === 'apps' const { data, isPending } = useGetInstalledApps() const installedApps = data?.installed_apps ?? [] const { mutateAsync: uninstallApp } = useUninstallApp() const { mutateAsync: updatePinStatus } = useUpdateAppPinStatus() const media = useBreakpoints() const isMobile = media === MediaType.mobile const [isFold, { toggle: toggleIsFold, }] = useBoolean(false) const [showConfirm, setShowConfirm] = useState(false) const [currId, setCurrId] = useState('') const handleDelete = async () => { const id = currId await uninstallApp(id) setShowConfirm(false) Toast.notify({ type: 'success', message: t('api.remove', { ns: 'common' }), }) } const handleUpdatePinStatus = async (id: string, isPinned: boolean) => { await updatePinStatus({ appId: id, isPinned }) Toast.notify({ type: 'success', message: t('api.success', { ns: 'common' }), }) } const pinnedAppsCount = installedApps.filter(({ is_pinned }) => is_pinned).length return (
{t('sidebar.webApps', { ns: 'explore' })}
}