refactor(frontend): consolidate overwrite and unsaved-changes into module folders

Group the overwrite trio (OverwriteConfirmDialog, OverwriteCtaButtons,
useOverwriteAction) into components/shared/overwrite/ — they cross-import
the OverwriteConflict type and 12 consumers always pull from the same
logical module. Same pattern for the unsaved-changes pair: move the
dialog from components/shared/ and the UI-agnostic guard hook from
hooks/ into components/shared/unsaved-changes/. Each folder ships an
index.ts so consumers reach the module through one import path.
This commit is contained in:
Sergey Kozyrenko
2026-05-15 09:50:08 +07:00
parent ef0dbcf0e2
commit 4d2e4ff5bf
20 changed files with 27 additions and 30 deletions
@@ -0,0 +1,5 @@
export { OverwriteConfirmDialog } from './overwrite-confirm-dialog';
export type { OverwriteConflict } from './overwrite-confirm-dialog';
export { OverwriteCtaButtons } from './overwrite-cta-buttons';
export { useOverwriteAction } from './use-overwrite-action';
export type { OverwriteOutcome } from './use-overwrite-action';
@@ -1,6 +1,6 @@
import { useCallback, useEffect, useRef, useState } from 'react';
import type { OverwriteConflict } from '@/components/shared/overwrite-confirm-dialog';
import type { OverwriteConflict } from './overwrite-confirm-dialog';
/**
* Discriminated outcome of a server action that supports an overwrite flag.
@@ -0,0 +1,4 @@
export { UnsavedChangesDialog } from './unsaved-changes-dialog';
export type { UnsavedChangesDialogProps } from './unsaved-changes-dialog';
export { useUnsavedChangesGuard } from './use-unsaved-changes-guard';
export type { UnsavedChangesGuard, UseUnsavedChangesGuardArgs } from './use-unsaved-changes-guard';
@@ -2,9 +2,7 @@ import { FolderInput, Search, X } from 'lucide-react';
import { useCallback, useMemo, useState } from 'react';
import { FileManager, type FileNode } from '@/components/shared/file-manager';
import { OverwriteConfirmDialog } from '@/components/shared/overwrite-confirm-dialog';
import { OverwriteCtaButtons } from '@/components/shared/overwrite-cta-buttons';
import { useOverwriteAction } from '@/components/shared/use-overwrite-action';
import { OverwriteConfirmDialog, OverwriteCtaButtons, useOverwriteAction } from '@/components/shared/overwrite';
import { Button } from '@/components/ui/button';
import {
Dialog,
@@ -1,5 +1,5 @@
import type { FileNode } from '@/components/shared/file-manager';
import type { OverwriteConflict } from '@/components/shared/overwrite-confirm-dialog';
import type { OverwriteConflict } from '@/components/shared/overwrite';
import { CONTAINER_PATH_PREFIX, RESOURCES_PATH_PREFIX } from './flow-files-constants';
@@ -4,11 +4,9 @@ import { useEffect, useMemo } from 'react';
import { useForm } from 'react-hook-form';
import type { FileNode } from '@/components/shared/file-manager';
import type { OverwriteConflict } from '@/components/shared/overwrite-confirm-dialog';
import type { OverwriteConflict } from '@/components/shared/overwrite';
import { OverwriteConfirmDialog } from '@/components/shared/overwrite-confirm-dialog';
import { OverwriteCtaButtons } from '@/components/shared/overwrite-cta-buttons';
import { useOverwriteAction } from '@/components/shared/use-overwrite-action';
import { OverwriteConfirmDialog, OverwriteCtaButtons, useOverwriteAction } from '@/components/shared/overwrite';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog';
import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
@@ -7,9 +7,7 @@ import {
type FileManagerBulkAction,
type FileNode,
} from '@/components/shared/file-manager';
import { OverwriteConfirmDialog } from '@/components/shared/overwrite-confirm-dialog';
import { OverwriteCtaButtons } from '@/components/shared/overwrite-cta-buttons';
import { useOverwriteAction } from '@/components/shared/use-overwrite-action';
import { OverwriteConfirmDialog, OverwriteCtaButtons, useOverwriteAction } from '@/components/shared/overwrite';
import {
Autocomplete,
AutocompleteContent,
@@ -1,7 +1,7 @@
import { useCallback, useState } from 'react';
import { toast } from 'sonner';
import type { OverwriteOutcome } from '@/components/shared/use-overwrite-action';
import type { OverwriteOutcome } from '@/components/shared/overwrite';
import { resourceIdsToWire } from '@/features/resources/resources-rest';
import { api, getApiErrorMessage, getApiErrorStatusCode } from '@/lib/axios';
@@ -2,7 +2,7 @@ import { useCallback, useState } from 'react';
import { toast } from 'sonner';
import { z } from 'zod';
import type { OverwriteOutcome } from '@/components/shared/use-overwrite-action';
import type { OverwriteOutcome } from '@/components/shared/overwrite';
import type { RestResourceList } from '@/features/resources/resources-rest';
import { pluralizeItems } from '@/features/resources/resources-utils';
@@ -1,7 +1,7 @@
import { useCallback, useState } from 'react';
import { toast } from 'sonner';
import type { OverwriteOutcome } from '@/components/shared/use-overwrite-action';
import type { OverwriteOutcome } from '@/components/shared/overwrite';
import { api, getApiErrorMessage, getApiErrorStatusCode } from '@/lib/axios';
@@ -12,12 +12,11 @@ import type {
} from '@/graphql/types';
import { HeaderButton } from '@/components/shared/header-button';
import { UnsavedChangesDialog } from '@/components/shared/unsaved-changes-dialog';
import { UnsavedChangesDialog, useUnsavedChangesGuard } from '@/components/shared/unsaved-changes';
import { Form } from '@/components/ui/form';
import { Spinner } from '@/components/ui/spinner';
import { KnowledgeAnswerType, KnowledgeDocType, KnowledgeGuideType } from '@/graphql/types';
import { useBreakpoint } from '@/hooks/use-breakpoint';
import { useUnsavedChangesGuard } from '@/hooks/use-unsaved-changes-guard';
import { Log } from '@/lib/log';
import { KnowledgeFormLayoutDesktop, KnowledgeFormLayoutMobile } from './knowledge-form-layout';
@@ -4,11 +4,9 @@ import { useEffect, useMemo } from 'react';
import { useForm } from 'react-hook-form';
import type { FileNode } from '@/components/shared/file-manager';
import type { OverwriteConflict } from '@/components/shared/overwrite-confirm-dialog';
import type { OverwriteConflict } from '@/components/shared/overwrite';
import { OverwriteConfirmDialog } from '@/components/shared/overwrite-confirm-dialog';
import { OverwriteCtaButtons } from '@/components/shared/overwrite-cta-buttons';
import { useOverwriteAction } from '@/components/shared/use-overwrite-action';
import { OverwriteConfirmDialog, OverwriteCtaButtons, useOverwriteAction } from '@/components/shared/overwrite';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog';
import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
@@ -4,11 +4,9 @@ import { useEffect, useMemo } from 'react';
import { useForm } from 'react-hook-form';
import type { FileNode } from '@/components/shared/file-manager';
import type { OverwriteConflict } from '@/components/shared/overwrite-confirm-dialog';
import type { OverwriteConflict } from '@/components/shared/overwrite';
import { OverwriteConfirmDialog } from '@/components/shared/overwrite-confirm-dialog';
import { OverwriteCtaButtons } from '@/components/shared/overwrite-cta-buttons';
import { useOverwriteAction } from '@/components/shared/use-overwrite-action';
import { OverwriteConfirmDialog, OverwriteCtaButtons, useOverwriteAction } from '@/components/shared/overwrite';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog';
import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
@@ -2,7 +2,7 @@ import { useCallback, useState } from 'react';
import { toast } from 'sonner';
import { z } from 'zod';
import type { OverwriteOutcome } from '@/components/shared/use-overwrite-action';
import type { OverwriteOutcome } from '@/components/shared/overwrite';
import { api, getApiErrorMessage, getApiErrorStatusCode } from '@/lib/axios';
@@ -2,7 +2,7 @@ import { useCallback, useState } from 'react';
import { toast } from 'sonner';
import { z } from 'zod';
import type { OverwriteOutcome } from '@/components/shared/use-overwrite-action';
import type { OverwriteOutcome } from '@/components/shared/overwrite';
import { api, getApiErrorMessage, getApiErrorStatusCode } from '@/lib/axios';
+2 -3
View File
@@ -2,7 +2,7 @@ import { ChevronDown, Copy, FileSymlink, Folder, FolderPlus, FolderUp, Loader2,
import { useCallback, useMemo, useState } from 'react';
import { toast } from 'sonner';
import type { OverwriteConflict } from '@/components/shared/overwrite-confirm-dialog';
import type { OverwriteConflict } from '@/components/shared/overwrite';
import ConfirmationDialog from '@/components/shared/confirmation-dialog';
import {
@@ -24,8 +24,7 @@ import {
formatModifiedRelative,
} from '@/components/shared/file-manager';
import { HeaderButton } from '@/components/shared/header-button';
import { OverwriteConfirmDialog } from '@/components/shared/overwrite-confirm-dialog';
import { useOverwriteAction } from '@/components/shared/use-overwrite-action';
import { OverwriteConfirmDialog, useOverwriteAction } from '@/components/shared/overwrite';
import { Breadcrumb, BreadcrumbItem, BreadcrumbList, BreadcrumbPage } from '@/components/ui/breadcrumb';
import { Button } from '@/components/ui/button';
import {