diff --git a/src/modules/diet/food/application/usecases/foodCrud.ts b/src/modules/diet/food/application/usecases/foodCrud.ts index 7e33a8026..a7aa7a862 100644 --- a/src/modules/diet/food/application/usecases/foodCrud.ts +++ b/src/modules/diet/food/application/usecases/foodCrud.ts @@ -5,7 +5,7 @@ import { importFoodsFromApiByName, } from '~/modules/diet/food/infrastructure/api/application/apiFood' import { createSupabaseFoodRepository } from '~/modules/diet/food/infrastructure/api/infrastructure/supabase/supabaseFoodRepository' -import { isSearchCached } from '~/modules/search/application/usecases/cachedSearchCrud' +import { searchUseCases } from '~/modules/search/application/usecases/searchUseCases' import { showPromise } from '~/modules/toast/application/toastManager' import { setBackendOutage } from '~/shared/error/backendOutageSignal' import { formatError } from '~/shared/formatError' @@ -42,7 +42,7 @@ export async function fetchFoodsByName( params: FoodSearchParams = {}, ): Promise { try { - const isCached = await isSearchCached(name) + const isCached = await searchUseCases.isSearchCached(name) if (!isCached) { await showPromise( diff --git a/src/modules/diet/food/infrastructure/api/application/apiFood.ts b/src/modules/diet/food/infrastructure/api/application/apiFood.ts index 9643bb02d..4d60d3285 100644 --- a/src/modules/diet/food/infrastructure/api/application/apiFood.ts +++ b/src/modules/diet/food/infrastructure/api/application/apiFood.ts @@ -3,7 +3,7 @@ import axios from 'axios' import { type Food } from '~/modules/diet/food/domain/food' import { type ApiFood } from '~/modules/diet/food/infrastructure/api/domain/apiFoodSchema' import { createSupabaseFoodRepository } from '~/modules/diet/food/infrastructure/api/infrastructure/supabase/supabaseFoodRepository' -import { markSearchAsCached } from '~/modules/search/application/usecases/cachedSearchCrud' +import { searchUseCases } from '~/modules/search/application/usecases/searchUseCases' import { showError } from '~/modules/toast/application/toastManager' import { convertApi2Food } from '~/shared/utils/convertApi2Food' import { ORIGINAL_ERROR_SYMBOL } from '~/shared/utils/errorUtils' @@ -99,11 +99,11 @@ export async function importFoodsFromApiByName(name: string): Promise { ) } else { logging.debug('No RELEVANT failed upsertions, marking search as cached') - await markSearchAsCached(name) + await searchUseCases.markSearchAsCached(name) } } else { logging.debug('No failed upsertions, marking search as cached') - await markSearchAsCached(name) + await searchUseCases.markSearchAsCached(name) } const upsertedFoods: ReadonlyArray = upsertionResults diff --git a/src/modules/recent-food/application/store/recentFoodStore.ts b/src/modules/recent-food/application/store/recentFoodStore.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/modules/search/application/store/cachedSearchCacheStore.ts b/src/modules/search/application/store/cachedSearchCacheStore.ts new file mode 100644 index 000000000..7d296700b --- /dev/null +++ b/src/modules/search/application/store/cachedSearchCacheStore.ts @@ -0,0 +1,52 @@ +import { createSignal } from 'solid-js' + +import { type CachedSearch } from '~/modules/search/domain/cachedSearch' +import { logging } from '~/shared/utils/logging' + +export function createCachedSearchCacheStore() { + const [cachedSearches, setCachedSearches] = createSignal< + readonly CachedSearch[] + >([]) + + return { + // Upsert to cache (from realtime events) + upsertToCache: (cachedSearch: CachedSearch) => { + const current = cachedSearches() + const existingIndex = current.findIndex( + (search) => search.search === cachedSearch.search, + ) + + if (existingIndex >= 0) { + // Update existing + const updated = [...current] + updated[existingIndex] = cachedSearch + setCachedSearches(updated) + logging.debug('Updated cached search in cache:', { cachedSearch }) + } else { + // Add new + setCachedSearches([cachedSearch, ...current]) + logging.debug('Added new cached search to cache:', { cachedSearch }) + } + }, + + // Remove from cache (from realtime events) + removeFromCache: (selector: { + by: 'search' + value: CachedSearch['search'] + }) => { + const current = cachedSearches() + const searchToRemove = current.find( + (search) => search.search === selector.value, + ) + + if (searchToRemove) { + const updated = current.filter( + (search) => search.search !== selector.value, + ) + setCachedSearches(updated) + + logging.debug('Removed cached search from cache:', { searchToRemove }) + } + }, + } +} diff --git a/src/modules/template-search/application/usecases/templateSearchState.ts b/src/modules/search/application/store/templateSearchState.ts similarity index 88% rename from src/modules/template-search/application/usecases/templateSearchState.ts rename to src/modules/search/application/store/templateSearchState.ts index bd8e098b4..f8670badb 100644 --- a/src/modules/template-search/application/usecases/templateSearchState.ts +++ b/src/modules/search/application/store/templateSearchState.ts @@ -9,9 +9,9 @@ import { fetchUserRecipes, } from '~/modules/diet/recipe/application/usecases/recipeCrud' import { fetchUserRecentFoods } from '~/modules/recent-food/application/usecases/recentFoodCrud' -import { fetchTemplatesByTabLogic } from '~/modules/template-search/application/templateSearchLogic' +import { fetchTemplatesByTabLogic } from '~/modules/search/application/usecases/templateSearchLogic' +import { type TemplateSearchTab } from '~/modules/search/ui/TemplateSearchTabs' import { currentUser, currentUserId } from '~/modules/user/application/user' -import { type TemplateSearchTab } from '~/sections/search/components/TemplateSearchTabs' import { createDebouncedSignal } from '~/shared/utils/createDebouncedSignal' export const [templateSearch, setTemplateSearch] = createSignal('') diff --git a/src/modules/search/application/usecases/cachedSearchCrud.ts b/src/modules/search/application/usecases/cachedSearchCrud.ts index bef0ae9d1..64c3ede97 100644 --- a/src/modules/search/application/usecases/cachedSearchCrud.ts +++ b/src/modules/search/application/usecases/cachedSearchCrud.ts @@ -1,15 +1,19 @@ -import { createCachedSearchRepository } from '~/modules/search/infrastructure/cachedSearchRepository' +import { type CachedSearchRepository } from '~/modules/search/domain/searchRepository' -const cachedSearchRepository = createCachedSearchRepository() +export function createCachedSearchCrudUseCases( + cachedSearchRepository: CachedSearchRepository, +) { + return { + async isSearchCached(query: string): Promise { + return await cachedSearchRepository.isSearchCached(query) + }, -export async function isSearchCached(query: string): Promise { - return await cachedSearchRepository.isSearchCached(query) -} - -export async function markSearchAsCached(query: string): Promise { - await cachedSearchRepository.markSearchAsCached(query) -} + async markSearchAsCached(query: string): Promise { + await cachedSearchRepository.markSearchAsCached(query) + }, -export async function unmarkSearchAsCached(query: string): Promise { - await cachedSearchRepository.unmarkSearchAsCached(query) + async unmarkSearchAsCached(query: string): Promise { + await cachedSearchRepository.unmarkSearchAsCached(query) + }, + } } diff --git a/src/modules/search/application/usecases/searchUseCases.ts b/src/modules/search/application/usecases/searchUseCases.ts new file mode 100644 index 000000000..453c539d0 --- /dev/null +++ b/src/modules/search/application/usecases/searchUseCases.ts @@ -0,0 +1,65 @@ +import { createRoot } from 'solid-js' + +import { createCachedSearchCacheStore } from '~/modules/search/application/store/cachedSearchCacheStore' +import { createCachedSearchCrudUseCases } from '~/modules/search/application/usecases/cachedSearchCrud' +import { cachedSearchSchema } from '~/modules/search/domain/cachedSearch' +import { createCachedSearchRepository } from '~/modules/search/infrastructure/cachedSearchRepository' +import { initializeCachedSearchRealtime } from '~/modules/search/infrastructure/supabase/realtime' +import { parseWithStack } from '~/shared/utils/parseWithStack' + +const { cachedSearchCacheStore, cachedSearchCrudUseCases } = createRoot(() => { + const cachedSearchCacheStore = createCachedSearchCacheStore() + const cachedSearchRepository = createCachedSearchRepository() + const cachedSearchCrudUseCases = createCachedSearchCrudUseCases( + cachedSearchRepository, + ) + + initializeCachedSearchRealtime({ + onInsert: (newRecord) => { + cachedSearchCacheStore.upsertToCache(newRecord) + }, + onUpdate: (newRecord) => { + cachedSearchCacheStore.upsertToCache(newRecord) + }, + onDelete: (oldRecord) => { + cachedSearchCacheStore.removeFromCache({ + by: 'search', + value: oldRecord.search, + }) + }, + }) + + return { cachedSearchCacheStore, cachedSearchCrudUseCases } +}) + +export const searchUseCases = { + isSearchCached: async (query: string): Promise => { + const result = await cachedSearchCrudUseCases.isSearchCached(query) + if (result) { + cachedSearchCacheStore.upsertToCache( + parseWithStack(cachedSearchSchema, { search: query }), + ) + } else { + cachedSearchCacheStore.removeFromCache({ + by: 'search', + value: query, + }) + } + return result + }, + markSearchAsCached: async (query: string): Promise => { + await cachedSearchCrudUseCases.markSearchAsCached(query) + cachedSearchCacheStore.upsertToCache( + parseWithStack(cachedSearchSchema, { + search: query, + }), + ) + }, + unmarkSearchAsCached: async (query: string): Promise => { + await cachedSearchCrudUseCases.unmarkSearchAsCached(query) + cachedSearchCacheStore.removeFromCache({ + by: 'search', + value: query, + }) + }, +} diff --git a/src/modules/template-search/application/templateSearchLogic.ts b/src/modules/search/application/usecases/templateSearchLogic.ts similarity index 97% rename from src/modules/template-search/application/templateSearchLogic.ts rename to src/modules/search/application/usecases/templateSearchLogic.ts index 63eedd523..144f07194 100644 --- a/src/modules/template-search/application/templateSearchLogic.ts +++ b/src/modules/search/application/usecases/templateSearchLogic.ts @@ -5,8 +5,8 @@ import type { Food } from '~/modules/diet/food/domain/food' import type { FoodSearchParams } from '~/modules/diet/food/domain/foodRepository' import type { Recipe } from '~/modules/diet/recipe/domain/recipe' import type { Template } from '~/modules/diet/template/domain/template' +import { availableTabs } from '~/modules/search/ui/TemplateSearchTabs' import { type User } from '~/modules/user/domain/user' -import { availableTabs } from '~/sections/search/components/TemplateSearchTabs' /** * Dependencies for fetchTemplatesByTabLogic diff --git a/src/modules/template-search/application/tests/templateSearchLogic.test.ts b/src/modules/search/application/usecases/tests/templateSearchLogic.test.ts similarity index 97% rename from src/modules/template-search/application/tests/templateSearchLogic.test.ts rename to src/modules/search/application/usecases/tests/templateSearchLogic.test.ts index 3e6f6a7a3..73fd44749 100644 --- a/src/modules/template-search/application/tests/templateSearchLogic.test.ts +++ b/src/modules/search/application/usecases/tests/templateSearchLogic.test.ts @@ -12,8 +12,8 @@ import { import { fetchTemplatesByTabLogic, type FetchTemplatesDeps, -} from '~/modules/template-search/application/templateSearchLogic' -import { availableTabs } from '~/sections/search/components/TemplateSearchTabs' +} from '~/modules/search/application/usecases/templateSearchLogic' +import { availableTabs } from '~/modules/search/ui/TemplateSearchTabs' describe('fetchTemplatesByTabLogic', () => { const mockFood = promoteNewFoodToFood( diff --git a/src/modules/search/infrastructure/cachedSearchRepository.ts b/src/modules/search/infrastructure/cachedSearchRepository.ts index 41248d141..10b6867e8 100644 --- a/src/modules/search/infrastructure/cachedSearchRepository.ts +++ b/src/modules/search/infrastructure/cachedSearchRepository.ts @@ -1,41 +1,15 @@ -import { cachedSearchSchema } from '~/modules/search/domain/cachedSearch' import { type CachedSearchRepository } from '~/modules/search/domain/searchRepository' -import { cachedSearchCacheStore } from '~/modules/search/infrastructure/signals/cachedSearchCacheStore' import { createSupabaseCachedSearchGateway } from '~/modules/search/infrastructure/supabase/supabaseCachedSearchGateway' -import { parseWithStack } from '~/shared/utils/parseWithStack' export function createCachedSearchRepository(): CachedSearchRepository { const gateway = createSupabaseCachedSearchGateway() return { - isSearchCached: async (searchQuery) => { - const result = await gateway.isSearchCached(searchQuery) - if (result) { - cachedSearchCacheStore.upsertToCache( - parseWithStack(cachedSearchSchema, { search: searchQuery }), - ) - } else { - cachedSearchCacheStore.removeFromCache({ - by: 'search', - value: searchQuery, - }) - } - return result - }, - markSearchAsCached: async (searchQuery) => { - await gateway.markSearchAsCached(searchQuery) - cachedSearchCacheStore.upsertToCache( - parseWithStack(cachedSearchSchema, { - search: searchQuery, - }), - ) - }, - unmarkSearchAsCached: async (searchQuery) => { - await gateway.unmarkSearchAsCached(searchQuery) - cachedSearchCacheStore.removeFromCache({ - by: 'search', - value: searchQuery, - }) - }, + isSearchCached: async (searchQuery) => + await gateway.isSearchCached(searchQuery), + markSearchAsCached: async (searchQuery) => + await gateway.markSearchAsCached(searchQuery), + unmarkSearchAsCached: async (searchQuery) => + await gateway.unmarkSearchAsCached(searchQuery), } } diff --git a/src/modules/search/infrastructure/signals/cachedSearchCacheStore.ts b/src/modules/search/infrastructure/signals/cachedSearchCacheStore.ts deleted file mode 100644 index cb6ee6862..000000000 --- a/src/modules/search/infrastructure/signals/cachedSearchCacheStore.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { createSignal } from 'solid-js' - -import { type CachedSearch } from '~/modules/search/domain/cachedSearch' -import { logging } from '~/shared/utils/logging' - -const [cachedSearches, setCachedSearches] = createSignal< - readonly CachedSearch[] ->([]) - -export const cachedSearchCacheStore = { - // Upsert to cache (from realtime events) - upsertToCache: (cachedSearch: CachedSearch) => { - const current = cachedSearches() - const existingIndex = current.findIndex( - (search) => search.search === cachedSearch.search, - ) - - if (existingIndex >= 0) { - // Update existing - const updated = [...current] - updated[existingIndex] = cachedSearch - setCachedSearches(updated) - logging.debug('Updated cached search in cache:', { cachedSearch }) - } else { - // Add new - setCachedSearches([cachedSearch, ...current]) - logging.debug('Added new cached search to cache:', { cachedSearch }) - } - }, - - // Remove from cache (from realtime events) - removeFromCache: (selector: { - by: 'search' - value: CachedSearch['search'] - }) => { - const current = cachedSearches() - const searchToRemove = current.find( - (search) => search.search === selector.value, - ) - - if (searchToRemove) { - const updated = current.filter( - (search) => search.search !== selector.value, - ) - setCachedSearches(updated) - - logging.debug('Removed cached search from cache:', { searchToRemove }) - } - }, -} diff --git a/src/modules/search/infrastructure/signals/cachedSearchEffects.ts b/src/modules/search/infrastructure/signals/cachedSearchEffects.ts deleted file mode 100644 index cf20b8e3a..000000000 --- a/src/modules/search/infrastructure/signals/cachedSearchEffects.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { onCleanup } from 'solid-js' - -import { initializeCachedSearchRealtime } from '~/modules/search/infrastructure/supabase/realtime' -import { logging } from '~/shared/utils/logging' - -let effectsInitialized = false - -export function initializeCachedSearchEffects() { - if (effectsInitialized) { - logging.debug('Cached search effects already initialized') - return - } - - logging.debug('Initializing cached search effects') - effectsInitialized = true - - // Initialize realtime subscription - initializeCachedSearchRealtime() - - onCleanup(() => { - logging.debug('Cleaning up cached search effects') - effectsInitialized = false - }) -} diff --git a/src/modules/search/infrastructure/supabase/realtime.ts b/src/modules/search/infrastructure/supabase/realtime.ts index 3c32e0620..c7502fc1b 100644 --- a/src/modules/search/infrastructure/supabase/realtime.ts +++ b/src/modules/search/infrastructure/supabase/realtime.ts @@ -2,30 +2,17 @@ import { type CachedSearch, cachedSearchSchema, } from '~/modules/search/domain/cachedSearch' -import { cachedSearchCacheStore } from '~/modules/search/infrastructure/signals/cachedSearchCacheStore' import { SUPABASE_TABLE_CACHED_SEARCHES } from '~/modules/search/infrastructure/supabase/constants' import { registerSubapabaseRealtimeCallback } from '~/shared/supabase/supabase' import { logging } from '~/shared/utils/logging' let initialized = false -export type CachedSearchRealtimeEvent = { - eventType: 'INSERT' | 'UPDATE' | 'DELETE' - new?: CachedSearch - old?: CachedSearch -} - -export function setupCachedSearchRealtimeSubscription( - onEvent: (event: CachedSearchRealtimeEvent) => void, -): void { - registerSubapabaseRealtimeCallback( - SUPABASE_TABLE_CACHED_SEARCHES, - cachedSearchSchema, - onEvent, - ) -} - -export function initializeCachedSearchRealtime(): void { +export function initializeCachedSearchRealtime(callbacks: { + onInsert: (newRecord: CachedSearch) => void + onUpdate: (newRecord: CachedSearch) => void + onDelete: (oldRecord: CachedSearch) => void +}): void { if (initialized) { return } @@ -40,24 +27,21 @@ export function initializeCachedSearchRealtime(): void { switch (event.eventType) { case 'INSERT': { if (event.new !== undefined) { - cachedSearchCacheStore.upsertToCache(event.new) + callbacks.onInsert(event.new) } break } case 'UPDATE': { if (event.new) { - cachedSearchCacheStore.upsertToCache(event.new) + callbacks.onUpdate(event.new) } break } case 'DELETE': { if (event.old) { - cachedSearchCacheStore.removeFromCache({ - by: 'search', - value: event.old.search, - }) + callbacks.onDelete(event.old) } break } diff --git a/src/modules/template-search/infrastructure/templateSearchTabPreference.ts b/src/modules/search/infrastructure/templateSearchTabPreference.ts similarity index 96% rename from src/modules/template-search/infrastructure/templateSearchTabPreference.ts rename to src/modules/search/infrastructure/templateSearchTabPreference.ts index c50665c19..db91be0ed 100644 --- a/src/modules/template-search/infrastructure/templateSearchTabPreference.ts +++ b/src/modules/search/infrastructure/templateSearchTabPreference.ts @@ -8,7 +8,7 @@ import { availableTabs, type TemplateSearchTab, -} from '~/sections/search/components/TemplateSearchTabs' +} from '~/modules/search/ui/TemplateSearchTabs' const STORAGE_KEY = 'macroflows:template-search-tab' diff --git a/src/modules/template-search/infrastructure/tests/templateSearchTabPreference.test.ts b/src/modules/search/infrastructure/tests/templateSearchTabPreference.test.ts similarity index 76% rename from src/modules/template-search/infrastructure/tests/templateSearchTabPreference.test.ts rename to src/modules/search/infrastructure/tests/templateSearchTabPreference.test.ts index 4b3455564..24b642f10 100644 --- a/src/modules/template-search/infrastructure/tests/templateSearchTabPreference.test.ts +++ b/src/modules/search/infrastructure/tests/templateSearchTabPreference.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { availableTabs } from '~/sections/search/components/TemplateSearchTabs' +import { availableTabs } from '~/modules/search/ui/TemplateSearchTabs' let localStorageMock: Record = {} @@ -32,7 +32,7 @@ describe('templateSearchTabPreference', () => { describe('loadTabPreference', () => { it('returns default tab when localStorage is empty', async () => { const { loadTabPreference, DEFAULT_TAB } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') expect(loadTabPreference()).toBe(DEFAULT_TAB) }) @@ -42,7 +42,7 @@ describe('templateSearchTabPreference', () => { vi.resetModules() const { loadTabPreference } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') expect(loadTabPreference()).toBe(availableTabs.Favoritos.id) }) @@ -52,7 +52,7 @@ describe('templateSearchTabPreference', () => { vi.resetModules() const { loadTabPreference } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') expect(loadTabPreference()).toBe(availableTabs.Recentes.id) }) @@ -62,7 +62,7 @@ describe('templateSearchTabPreference', () => { vi.resetModules() const { loadTabPreference } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') expect(loadTabPreference()).toBe(availableTabs.Receitas.id) }) @@ -72,7 +72,7 @@ describe('templateSearchTabPreference', () => { vi.resetModules() const { loadTabPreference, DEFAULT_TAB } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') expect(loadTabPreference()).toBe(DEFAULT_TAB) }) }) @@ -80,7 +80,7 @@ describe('templateSearchTabPreference', () => { describe('saveTabPreference', () => { it('saves tab preference to localStorage', async () => { const { saveTabPreference } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') saveTabPreference(availableTabs.Favoritos.id) @@ -89,7 +89,7 @@ describe('templateSearchTabPreference', () => { it('does not persist hidden tab state', async () => { const { saveTabPreference } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') saveTabPreference('hidden') @@ -102,7 +102,7 @@ describe('templateSearchTabPreference', () => { vi.resetModules() const { saveTabPreference } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') saveTabPreference(availableTabs.Recentes.id) @@ -113,7 +113,7 @@ describe('templateSearchTabPreference', () => { describe('round-trip persistence', () => { it('can save and load tab preference', async () => { const { saveTabPreference } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') // Save a preference saveTabPreference(availableTabs.Receitas.id) @@ -121,7 +121,7 @@ describe('templateSearchTabPreference', () => { // Re-import to get fresh module state vi.resetModules() const freshModule = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') // Load should return the saved preference expect(freshModule.loadTabPreference()).toBe(availableTabs.Receitas.id) @@ -131,7 +131,7 @@ describe('templateSearchTabPreference', () => { describe('DEFAULT_TAB', () => { it('is the Todos tab', async () => { const { DEFAULT_TAB } = - await import('~/modules/template-search/infrastructure/templateSearchTabPreference') + await import('~/modules/search/infrastructure/templateSearchTabPreference') expect(DEFAULT_TAB).toBe(availableTabs.Todos.id) }) }) diff --git a/src/sections/search/components/SearchLoadingIndicator.tsx b/src/modules/search/ui/SearchLoadingIndicator.tsx similarity index 100% rename from src/sections/search/components/SearchLoadingIndicator.tsx rename to src/modules/search/ui/SearchLoadingIndicator.tsx diff --git a/src/sections/search/components/TemplateSearchBar.tsx b/src/modules/search/ui/TemplateSearchBar.tsx similarity index 95% rename from src/sections/search/components/TemplateSearchBar.tsx rename to src/modules/search/ui/TemplateSearchBar.tsx index d6fe78fcb..e54616266 100644 --- a/src/sections/search/components/TemplateSearchBar.tsx +++ b/src/modules/search/ui/TemplateSearchBar.tsx @@ -4,7 +4,7 @@ import { setTemplateSearch, templates, templateSearch, -} from '~/modules/template-search/application/usecases/templateSearchState' +} from '~/modules/search/application/store/templateSearchState' import { LoadingRing } from '~/sections/common/components/LoadingRing' export function TemplateSearchBar(props: { isDesktop: boolean }) { diff --git a/src/sections/search/components/TemplateSearchModal.tsx b/src/modules/search/ui/TemplateSearchModal.tsx similarity index 96% rename from src/sections/search/components/TemplateSearchModal.tsx rename to src/modules/search/ui/TemplateSearchModal.tsx index c00f4aec3..2102dca2d 100644 --- a/src/sections/search/components/TemplateSearchModal.tsx +++ b/src/modules/search/ui/TemplateSearchModal.tsx @@ -24,11 +24,17 @@ import { setTemplateSearchTab, templates, templateSearchTab, -} from '~/modules/template-search/application/usecases/templateSearchState' +} from '~/modules/search/application/store/templateSearchState' import { loadTabPreference, saveTabPreference, -} from '~/modules/template-search/infrastructure/templateSearchTabPreference' +} from '~/modules/search/infrastructure/templateSearchTabPreference' +import { TemplateSearchBar } from '~/modules/search/ui/TemplateSearchBar' +import { TemplateSearchResults } from '~/modules/search/ui/TemplateSearchResults' +import { + type TemplateSearchTab, + TemplateSearchTabs, +} from '~/modules/search/ui/TemplateSearchTabs' import { showSuccess } from '~/modules/toast/application/toastManager' import { showError } from '~/modules/toast/application/toastManager' import { currentUserId } from '~/modules/user/application/user' @@ -36,12 +42,6 @@ import { EANButton } from '~/sections/common/components/EANButton' import { PageLoading } from '~/sections/common/components/PageLoading' import { EANInsertModal } from '~/sections/ean/components/EANInsertModal' import { openItemEditModal } from '~/sections/item/ui/openItemEditModal' -import { TemplateSearchBar } from '~/sections/search/components/TemplateSearchBar' -import { TemplateSearchResults } from '~/sections/search/components/TemplateSearchResults' -import { - type TemplateSearchTab, - TemplateSearchTabs, -} from '~/sections/search/components/TemplateSearchTabs' import { formatError } from '~/shared/formatError' import { closeModal, diff --git a/src/sections/search/components/TemplateSearchResultItem.tsx b/src/modules/search/ui/TemplateSearchResultItem.tsx similarity index 100% rename from src/sections/search/components/TemplateSearchResultItem.tsx rename to src/modules/search/ui/TemplateSearchResultItem.tsx diff --git a/src/sections/search/components/TemplateSearchResults.tsx b/src/modules/search/ui/TemplateSearchResults.tsx similarity index 87% rename from src/sections/search/components/TemplateSearchResults.tsx rename to src/modules/search/ui/TemplateSearchResults.tsx index 3974c3722..b59f515bb 100644 --- a/src/sections/search/components/TemplateSearchResults.tsx +++ b/src/modules/search/ui/TemplateSearchResults.tsx @@ -4,10 +4,10 @@ import { type Template } from '~/modules/diet/template/domain/template' import { debouncedTab, templates, -} from '~/modules/template-search/application/usecases/templateSearchState' +} from '~/modules/search/application/store/templateSearchState' +import { SearchLoadingIndicator } from '~/modules/search/ui/SearchLoadingIndicator' +import { TemplateSearchResultItem } from '~/modules/search/ui/TemplateSearchResultItem' import { Alert } from '~/sections/common/components/Alert' -import { SearchLoadingIndicator } from '~/sections/search/components/SearchLoadingIndicator' -import { TemplateSearchResultItem } from '~/sections/search/components/TemplateSearchResultItem' export function TemplateSearchResults(props: { search: string diff --git a/src/sections/search/components/TemplateSearchTabs.tsx b/src/modules/search/ui/TemplateSearchTabs.tsx similarity index 100% rename from src/sections/search/components/TemplateSearchTabs.tsx rename to src/modules/search/ui/TemplateSearchTabs.tsx diff --git a/src/sections/search/ui/openTemplateSearchModal.tsx b/src/modules/search/ui/openTemplateSearchModal.tsx similarity index 94% rename from src/sections/search/ui/openTemplateSearchModal.tsx rename to src/modules/search/ui/openTemplateSearchModal.tsx index 5031716e1..570e9e490 100644 --- a/src/sections/search/ui/openTemplateSearchModal.tsx +++ b/src/modules/search/ui/openTemplateSearchModal.tsx @@ -6,7 +6,7 @@ import { TemplateSearchModal, type TemplateSearchModalProps, -} from '~/sections/search/components/TemplateSearchModal' +} from '~/modules/search/ui/TemplateSearchModal' import { closeModal, openContentModal, diff --git a/src/routes/test-app.tsx b/src/routes/test-app.tsx index 7777baeb2..758e5eb39 100644 --- a/src/routes/test-app.tsx +++ b/src/routes/test-app.tsx @@ -14,6 +14,7 @@ import { type Meal, promoteMeal, } from '~/modules/diet/meal/domain/meal' +import { openTemplateSearchModal } from '~/modules/search/ui/openTemplateSearchModal' import { showSuccess } from '~/modules/toast/application/toastManager' import { TestChart } from '~/sections/common/components/charts/TestChart' import { FloatInput } from '~/sections/common/components/FloatInput' @@ -27,11 +28,7 @@ import { Datepicker } from '~/sections/datepicker/components/Datepicker' import { type DateValueType } from '~/sections/datepicker/types' import DayMacros from '~/sections/day-diet/components/DayMacros' import { ItemView } from '~/sections/item/components/ItemView' -import { TemplateSearchModal } from '~/sections/search/components/TemplateSearchModal' -import { - openConfirmModal, - openContentModal, -} from '~/shared/modal/helpers/modalHelpers' +import { openConfirmModal } from '~/shared/modal/helpers/modalHelpers' import { openEditModal } from '~/shared/modal/helpers/modalHelpers' import { generateId } from '~/shared/utils/idUtils' import { logging } from '~/shared/utils/logging' @@ -197,21 +194,14 @@ export default function TestApp() {