import { useQueryClient } from "@tanstack/react-query"; import { platform } from "@tauri-apps/plugin-os"; import { Volume2Icon, VolumeXIcon } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { commands as analyticsCommands } from "@hypr/plugin-analytics"; import { commands as sfxCommands } from "@hypr/plugin-sfx"; import { LoginSection } from "./account"; import { CalendarSection } from "./calendar"; import { getInitialStep, getNextStep, getPrevStep, getStepStatus, } from "./config"; import { FinalSection, finishOnboarding } from "./final"; import { FolderLocationSection } from "./folder-location"; import { PermissionsSection } from "./permissions"; import { OnboardingSection } from "./shared"; import { usePermissions } from "~/shared/hooks/usePermissions"; import { StandardTabWrapper } from "~/shared/main"; import { type TabItem, TabItemBase } from "~/shared/tabs"; import { type Tab, useTabs } from "~/store/zustand/tabs"; export const TabItemOnboarding: TabItem< Extract > = ({ tab, tabIndex, handleCloseThis, handleSelectThis, handleCloseOthers, handleCloseAll, handlePinThis, handleUnpinThis, }) => { return ( 👋 } title="Welcome" selected={tab.active} allowPin={false} allowClose={false} tabIndex={tabIndex} handleCloseThis={() => handleCloseThis(tab)} handleSelectThis={() => handleSelectThis(tab)} handleCloseOthers={handleCloseOthers} handleCloseAll={handleCloseAll} handlePinThis={() => handlePinThis(tab)} handleUnpinThis={() => handleUnpinThis(tab)} /> ); }; export function TabContentOnboarding({ tab: _tab, }: { tab: Extract; }) { const queryClient = useQueryClient(); const close = useTabs((state) => state.close); const currentTab = useTabs((state) => state.currentTab); const [isMuted, setIsMuted] = useState(false); const [currentStep, setCurrentStep] = useState(getInitialStep); const { micPermissionStatus, systemAudioPermissionStatus } = usePermissions(); const allPermissionsGranted = micPermissionStatus.data === "authorized" && systemAudioPermissionStatus.data === "authorized"; useEffect(() => { if (currentStep === "permissions" && allPermissionsGranted) { setCurrentStep("login"); } }, [currentStep, allPermissionsGranted]); const goNext = useCallback(() => { const next = getNextStep(currentStep); if (next) setCurrentStep(next); }, [currentStep]); const goBack = useCallback(() => { const prev = getPrevStep(currentStep); if (prev) setCurrentStep(prev); }, [currentStep]); useEffect(() => { void analyticsCommands.event({ event: "onboarding_step_viewed", step: currentStep, platform: platform(), }); }, [currentStep]); useEffect(() => { sfxCommands .play("BGM") .then(() => sfxCommands.setVolume("BGM", 0.2)) .catch(console.error); return () => { sfxCommands.stop("BGM").catch(console.error); }; }, []); useEffect(() => { sfxCommands.setVolume("BGM", isMuted ? 0 : 0.2).catch(console.error); }, [isMuted]); const handleFinish = useCallback(() => { void queryClient.invalidateQueries({ queryKey: ["onboarding-needed"] }); if (currentTab) { close(currentTab); } }, [close, currentTab, queryClient]); return (

Welcome to Char

void finishOnboarding(handleFinish)} >
); }