import { toast, ToastOptions } from 'react-toastify';
import { Button } from './components/ui/button';
import { Tooltip, TooltipContent, TooltipTrigger } from './components/ui/Tooltip';
import Copy from './components/icons/Copy';
import { startNewSession } from './sessions';
import { useNavigation } from './hooks/useNavigation';
import {
GroupedExtensionLoadingToast,
ExtensionLoadingStatus,
} from './components/GroupedExtensionLoadingToast';
import { getInitialWorkingDir } from './utils/workingDir';
export interface ToastServiceOptions {
silent?: boolean;
shouldThrow?: boolean;
}
class ToastService {
private silent: boolean = false;
private shouldThrow: boolean = false;
// Create a singleton instance
private static instance: ToastService;
public static getInstance(): ToastService {
if (!ToastService.instance) {
ToastService.instance = new ToastService();
}
return ToastService.instance;
}
configure(options: ToastServiceOptions = {}): void {
if (options.silent !== undefined) {
this.silent = options.silent;
}
if (options.shouldThrow !== undefined) {
this.shouldThrow = options.shouldThrow;
}
}
error(props: ToastErrorProps): void {
if (!this.silent) {
toastError(props);
}
if (this.shouldThrow) {
throw new Error(props.msg);
}
}
loading({ title, msg }: { title: string; msg: string }): string | number | undefined {
if (this.silent) {
return undefined;
}
const toastId = toastLoading({ title, msg });
return toastId;
}
success({ title, msg }: { title: string; msg: string }): void {
if (this.silent) {
return;
}
toastSuccess({ title, msg });
}
dismiss(toastId?: string | number): void {
if (toastId) toast.dismiss(toastId);
}
/**
* Create a grouped extension loading toast that can be updated as extensions load
*/
extensionLoading(
extensions: ExtensionLoadingStatus[],
totalCount: number,
isComplete: boolean = false
): string | number {
if (this.silent) {
return 'silent';
}
const toastId = 'extension-loading';
const hasErrors = extensions.some((ext) => ext.status === 'error');
const autoClose = isComplete && !hasErrors ? 5000 : false;
// Check if toast already exists
if (toast.isActive(toastId)) {
// Update existing toast
toast.update(toastId, {
render: (