From 36754973c66922783ad8c8739531cbe3a12a162a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20LAGACHE?= Date: Tue, 23 Jun 2026 16:06:26 +0200 Subject: [PATCH] refactor(settings): reorganize into actions/components/schemas/hooks --- .../dashboard/(admin)/admin/settings/page.tsx | 2 +- src/features/onboarding/steps/step-defaults.tsx | 10 +++++----- src/features/settings/{ => actions}/avatar.action.ts | 0 .../settings/{ => actions}/email-form.action.ts | 2 +- .../settings/{ => actions}/notification.action.ts | 2 +- .../settings/{ => actions}/storage-s3.action.ts | 2 +- src/features/settings/{ => actions}/storage.action.ts | 2 +- .../settings/{ => components}/avatar-mode-selector.tsx | 0 .../settings/{ => components}/avatar-section.tsx | 6 +++--- .../{ => components}/dicebear-style-picker.tsx | 2 +- src/features/settings/{ => components}/email-form.tsx | 4 ++-- .../settings/{ => components}/email-section.tsx | 4 ++-- .../settings/{ => components}/notification-section.tsx | 4 ++-- .../settings/{ => components}/settings-tabs.tsx | 8 ++++---- .../settings/{ => components}/storage-s3-form.tsx | 4 ++-- .../settings/{ => components}/storage-section.tsx | 4 ++-- .../settings/{ => hooks}/use-dicebear-styles.ts | 0 .../settings/{ => schemas}/email-form.schema.ts | 0 .../settings/{ => schemas}/notification.schema.ts | 0 .../settings/{ => schemas}/storage-s3.schema.ts | 0 src/features/settings/{ => schemas}/storage.schema.ts | 0 21 files changed, 28 insertions(+), 28 deletions(-) rename src/features/settings/{ => actions}/avatar.action.ts (100%) rename src/features/settings/{ => actions}/email-form.action.ts (90%) rename src/features/settings/{ => actions}/notification.action.ts (94%) rename src/features/settings/{ => actions}/storage-s3.action.ts (97%) rename src/features/settings/{ => actions}/storage.action.ts (95%) rename src/features/settings/{ => components}/avatar-mode-selector.tsx (100%) rename src/features/settings/{ => components}/avatar-section.tsx (88%) rename src/features/settings/{ => components}/dicebear-style-picker.tsx (97%) rename src/features/settings/{ => components}/email-form.tsx (98%) rename src/features/settings/{ => components}/email-section.tsx (74%) rename src/features/settings/{ => components}/notification-section.tsx (98%) rename src/features/settings/{ => components}/settings-tabs.tsx (90%) rename src/features/settings/{ => components}/storage-s3-form.tsx (96%) rename src/features/settings/{ => components}/storage-section.tsx (98%) rename src/features/settings/{ => hooks}/use-dicebear-styles.ts (100%) rename src/features/settings/{ => schemas}/email-form.schema.ts (100%) rename src/features/settings/{ => schemas}/notification.schema.ts (100%) rename src/features/settings/{ => schemas}/storage-s3.schema.ts (100%) rename src/features/settings/{ => schemas}/storage.schema.ts (100%) diff --git a/app/(customer)/dashboard/(admin)/admin/settings/page.tsx b/app/(customer)/dashboard/(admin)/admin/settings/page.tsx index d048466f..cd0085ec 100644 --- a/app/(customer)/dashboard/(admin)/admin/settings/page.tsx +++ b/app/(customer)/dashboard/(admin)/admin/settings/page.tsx @@ -3,7 +3,7 @@ import {Page, PageContent, PageHeader, PageTitle} from "@/features/layout/compon import {db} from "@/db"; import {logger} from "@/lib/logger"; import {notFound} from "next/navigation"; -import {SettingsTabs} from "@/features/settings/settings-tabs"; +import {SettingsTabs} from "@/features/settings/components/settings-tabs"; import {desc, isNull} from "drizzle-orm"; import * as drizzleDb from "@/db"; import {StorageChannelWith} from "@/db/schema/12_storage-channel"; diff --git a/src/features/onboarding/steps/step-defaults.tsx b/src/features/onboarding/steps/step-defaults.tsx index 225ab59a..19d3a1ea 100644 --- a/src/features/onboarding/steps/step-defaults.tsx +++ b/src/features/onboarding/steps/step-defaults.tsx @@ -18,11 +18,11 @@ import type { OnboardingDefaultsData, } from "@/features/onboarding/types"; import { getChannelIcon } from "@/features/channel/components/channels-helpers"; -import { updateNotificationSettingsAction } from "@/features/settings/notification.action"; -import { updateStorageSettingsAction } from "@/features/settings/storage.action"; -import { updateAvatarModeAction } from "@/features/settings/avatar.action"; -import { AvatarModeSelector } from "@/features/settings/avatar-mode-selector"; -import { DicebearStylePicker } from "@/features/settings/dicebear-style-picker"; +import { updateNotificationSettingsAction } from "@/features/settings/actions/notification.action"; +import { updateStorageSettingsAction } from "@/features/settings/actions/storage.action"; +import { updateAvatarModeAction } from "@/features/settings/actions/avatar.action"; +import { AvatarModeSelector } from "@/features/settings/components/avatar-mode-selector"; +import { DicebearStylePicker } from "@/features/settings/components/dicebear-style-picker"; export const StepDefaults = () => { const { next, updateContext, state } = useOnboarding(); diff --git a/src/features/settings/avatar.action.ts b/src/features/settings/actions/avatar.action.ts similarity index 100% rename from src/features/settings/avatar.action.ts rename to src/features/settings/actions/avatar.action.ts diff --git a/src/features/settings/email-form.action.ts b/src/features/settings/actions/email-form.action.ts similarity index 90% rename from src/features/settings/email-form.action.ts rename to src/features/settings/actions/email-form.action.ts index 2fdf65ce..a0983e28 100644 --- a/src/features/settings/email-form.action.ts +++ b/src/features/settings/actions/email-form.action.ts @@ -1,6 +1,6 @@ "use server"; import { z } from "zod"; -import { EmailFormSchema } from "@/features/settings/email-form.schema"; +import { EmailFormSchema } from "@/features/settings/schemas/email-form.schema"; import { eq } from "drizzle-orm"; import { db } from "@/db"; import * as drizzleDb from "@/db"; diff --git a/src/features/settings/notification.action.ts b/src/features/settings/actions/notification.action.ts similarity index 94% rename from src/features/settings/notification.action.ts rename to src/features/settings/actions/notification.action.ts index 2ec3b427..2a1f0a6d 100644 --- a/src/features/settings/notification.action.ts +++ b/src/features/settings/actions/notification.action.ts @@ -7,7 +7,7 @@ import {eq} from "drizzle-orm"; import {ServerActionResult} from "@/types/action-type"; import {Setting} from "@/db/schema/01_setting"; import {z} from "zod"; -import {DefaultNotificationSchema} from "@/features/settings/notification.schema"; +import {DefaultNotificationSchema} from "@/features/settings/schemas/notification.schema"; import {withUpdatedAt} from "@/db/utils"; export const updateNotificationSettingsAction = userAction diff --git a/src/features/settings/storage-s3.action.ts b/src/features/settings/actions/storage-s3.action.ts similarity index 97% rename from src/features/settings/storage-s3.action.ts rename to src/features/settings/actions/storage-s3.action.ts index fde17585..fb1dae98 100644 --- a/src/features/settings/storage-s3.action.ts +++ b/src/features/settings/actions/storage-s3.action.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { db } from "@/db"; -import { S3FormSchema, StorageSwitchSchema } from "@/features/settings/storage-s3.schema"; +import { S3FormSchema, StorageSwitchSchema } from "@/features/settings/schemas/storage-s3.schema"; import { eq } from "drizzle-orm"; import * as drizzleDb from "@/db"; import {userAction} from "@/lib/safe-actions/actions"; diff --git a/src/features/settings/storage.action.ts b/src/features/settings/actions/storage.action.ts similarity index 95% rename from src/features/settings/storage.action.ts rename to src/features/settings/actions/storage.action.ts index d9e44c91..721b0a94 100644 --- a/src/features/settings/storage.action.ts +++ b/src/features/settings/actions/storage.action.ts @@ -7,7 +7,7 @@ import {eq} from "drizzle-orm"; import {ServerActionResult} from "@/types/action-type"; import {Setting} from "@/db/schema/01_setting"; import {z} from "zod"; -import {DefaultStorageSchema} from "@/features/settings/storage.schema"; +import {DefaultStorageSchema} from "@/features/settings/schemas/storage.schema"; import {withUpdatedAt} from "@/db/utils"; export const updateStorageSettingsAction = userAction diff --git a/src/features/settings/avatar-mode-selector.tsx b/src/features/settings/components/avatar-mode-selector.tsx similarity index 100% rename from src/features/settings/avatar-mode-selector.tsx rename to src/features/settings/components/avatar-mode-selector.tsx diff --git a/src/features/settings/avatar-section.tsx b/src/features/settings/components/avatar-section.tsx similarity index 88% rename from src/features/settings/avatar-section.tsx rename to src/features/settings/components/avatar-section.tsx index 7e74c940..b12c0593 100644 --- a/src/features/settings/avatar-section.tsx +++ b/src/features/settings/components/avatar-section.tsx @@ -5,9 +5,9 @@ import { useMutation } from "@tanstack/react-query"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import { Setting } from "@/db/schema/01_setting"; -import { updateAvatarModeAction } from "@/features/settings/avatar.action"; -import { AvatarModeSelector } from "@/features/settings/avatar-mode-selector"; -import { DicebearStylePicker } from "@/features/settings/dicebear-style-picker"; +import { updateAvatarModeAction } from "@/features/settings/actions/avatar.action"; +import { AvatarModeSelector } from "@/features/settings/components/avatar-mode-selector"; +import { DicebearStylePicker } from "@/features/settings/components/dicebear-style-picker"; import type { AvatarMode } from "@/features/onboarding/types"; type Props = { settings: Setting }; diff --git a/src/features/settings/dicebear-style-picker.tsx b/src/features/settings/components/dicebear-style-picker.tsx similarity index 97% rename from src/features/settings/dicebear-style-picker.tsx rename to src/features/settings/components/dicebear-style-picker.tsx index 78d7ec88..8fbd8538 100644 --- a/src/features/settings/dicebear-style-picker.tsx +++ b/src/features/settings/components/dicebear-style-picker.tsx @@ -2,7 +2,7 @@ import { AlertCircle, Loader2 } from "lucide-react"; import { cn } from "@/lib/utils"; -import { useDiceBearStyles } from "@/features/settings/use-dicebear-styles"; +import { useDiceBearStyles } from "@/features/settings/hooks/use-dicebear-styles"; const DEMO_SEED = "portabase"; diff --git a/src/features/settings/email-form.tsx b/src/features/settings/components/email-form.tsx similarity index 98% rename from src/features/settings/email-form.tsx rename to src/features/settings/components/email-form.tsx index 36071de0..b91c2380 100644 --- a/src/features/settings/email-form.tsx +++ b/src/features/settings/components/email-form.tsx @@ -18,11 +18,11 @@ import {Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "@/compon import { EmailFormSchema, EmailFormType -} from "@/features/settings/email-form.schema"; +} from "@/features/settings/schemas/email-form.schema"; import {PasswordInput} from "@/components/ui/password-input"; import { updateEmailSettingsAction -} from "@/features/settings/email-form.action"; +} from "@/features/settings/actions/email-form.action"; import {toast} from "sonner"; import {useRouter} from "next/navigation"; import {sendEmail} from "@/lib/email"; diff --git a/src/features/settings/email-section.tsx b/src/features/settings/components/email-section.tsx similarity index 74% rename from src/features/settings/email-section.tsx rename to src/features/settings/components/email-section.tsx index 05ddfcf3..650ed4a5 100644 --- a/src/features/settings/email-section.tsx +++ b/src/features/settings/components/email-section.tsx @@ -1,7 +1,7 @@ "use client" -import {EmailForm} from "@/features/settings/email-form"; +import {EmailForm} from "@/features/settings/components/email-form"; import {Setting} from "@/db/schema/01_setting"; -import {EmailFormType} from "@/features/settings/email-form.schema"; +import {EmailFormType} from "@/features/settings/schemas/email-form.schema"; export type SettingsEmailSectionProps = { diff --git a/src/features/settings/notification-section.tsx b/src/features/settings/components/notification-section.tsx similarity index 98% rename from src/features/settings/notification-section.tsx rename to src/features/settings/components/notification-section.tsx index 8dd37474..06505110 100644 --- a/src/features/settings/notification-section.tsx +++ b/src/features/settings/components/notification-section.tsx @@ -17,10 +17,10 @@ import {getChannelIcon} from "@/features/channel/components/channels-helpers"; import {NotificationChannelWith} from "@/db/schema/09_notification-channel"; import { DefaultNotificationSchema, DefaultNotificationType -} from "@/features/settings/notification.schema"; +} from "@/features/settings/schemas/notification.schema"; import { updateNotificationSettingsAction -} from "@/features/settings/notification.action"; +} from "@/features/settings/actions/notification.action"; import {toast} from "sonner"; import {Badge} from "@/components/ui/badge"; diff --git a/src/features/settings/settings-tabs.tsx b/src/features/settings/components/settings-tabs.tsx similarity index 90% rename from src/features/settings/settings-tabs.tsx rename to src/features/settings/components/settings-tabs.tsx index 8eba81b1..17e184d5 100644 --- a/src/features/settings/settings-tabs.tsx +++ b/src/features/settings/components/settings-tabs.tsx @@ -4,13 +4,13 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useEffect, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { Setting } from "@/db/schema/01_setting"; -import { SettingsEmailSection } from "@/features/settings/email-section"; -import { SettingsStorageSection } from "@/features/settings/storage-section"; +import { SettingsEmailSection } from "@/features/settings/components/email-section"; +import { SettingsStorageSection } from "@/features/settings/components/storage-section"; import { StorageChannelWith } from "@/db/schema/12_storage-channel"; import { AlarmClock, MailboxIcon, Save, UserCircle } from "lucide-react"; -import { SettingsNotificationSection } from "@/features/settings/notification-section"; +import { SettingsNotificationSection } from "@/features/settings/components/notification-section"; import { NotificationChannelWith } from "@/db/schema/09_notification-channel"; -import { SettingsAvatarSection } from "@/features/settings/avatar-section"; +import { SettingsAvatarSection } from "@/features/settings/components/avatar-section"; export type SettingsTabsProps = { settings: Setting; diff --git a/src/features/settings/storage-s3-form.tsx b/src/features/settings/components/storage-s3-form.tsx similarity index 96% rename from src/features/settings/storage-s3-form.tsx rename to src/features/settings/components/storage-s3-form.tsx index bb24dea3..0e3ed1fa 100644 --- a/src/features/settings/storage-s3-form.tsx +++ b/src/features/settings/components/storage-s3-form.tsx @@ -8,10 +8,10 @@ import { Button } from "@/components/ui/button"; import { useMutation } from "@tanstack/react-query"; import { TooltipProvider } from "@/components/ui/tooltip"; -import { S3FormSchema, S3FormType } from "@/features/settings/storage-s3.schema"; +import { S3FormSchema, S3FormType } from "@/features/settings/schemas/storage-s3.schema"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; -import { updateS3SettingsAction } from "@/features/settings/storage-s3.action"; +import { updateS3SettingsAction } from "@/features/settings/actions/storage-s3.action"; import {PasswordInput} from "@/components/ui/password-input"; export type S3FormProps = { diff --git a/src/features/settings/storage-section.tsx b/src/features/settings/components/storage-section.tsx similarity index 98% rename from src/features/settings/storage-section.tsx rename to src/features/settings/components/storage-section.tsx index 32f8fc24..b7c2c0a0 100644 --- a/src/features/settings/storage-section.tsx +++ b/src/features/settings/components/storage-section.tsx @@ -19,11 +19,11 @@ import {useMutation} from "@tanstack/react-query"; import { DefaultStorageSchema, DefaultStorageType -} from "@/features/settings/storage.schema"; +} from "@/features/settings/schemas/storage.schema"; import {getChannelIcon} from "@/features/channel/components/channels-helpers"; import { updateStorageSettingsAction -} from "@/features/settings/storage.action"; +} from "@/features/settings/actions/storage.action"; import {toast} from "sonner"; import {Switch} from "@/components/ui/switch"; import {downloadMasterKeyAction} from "@/features/agents/actions/keys.action"; diff --git a/src/features/settings/use-dicebear-styles.ts b/src/features/settings/hooks/use-dicebear-styles.ts similarity index 100% rename from src/features/settings/use-dicebear-styles.ts rename to src/features/settings/hooks/use-dicebear-styles.ts diff --git a/src/features/settings/email-form.schema.ts b/src/features/settings/schemas/email-form.schema.ts similarity index 100% rename from src/features/settings/email-form.schema.ts rename to src/features/settings/schemas/email-form.schema.ts diff --git a/src/features/settings/notification.schema.ts b/src/features/settings/schemas/notification.schema.ts similarity index 100% rename from src/features/settings/notification.schema.ts rename to src/features/settings/schemas/notification.schema.ts diff --git a/src/features/settings/storage-s3.schema.ts b/src/features/settings/schemas/storage-s3.schema.ts similarity index 100% rename from src/features/settings/storage-s3.schema.ts rename to src/features/settings/schemas/storage-s3.schema.ts diff --git a/src/features/settings/storage.schema.ts b/src/features/settings/schemas/storage.schema.ts similarity index 100% rename from src/features/settings/storage.schema.ts rename to src/features/settings/schemas/storage.schema.ts