From 47166fc4abbe3311feb119be0c7eaf6ce1cb9a14 Mon Sep 17 00:00:00 2001 From: Uwayss Date: Sat, 11 Apr 2026 14:55:19 +0300 Subject: [PATCH] feat: add goal property to suggested deeds and hydrate goals in app state --- src/core/data/mock.ts | 18 ++++++++++++++++++ src/core/store/appStore.ts | 12 ++++++++++-- src/screens/HomeScreen.tsx | 3 ++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/core/data/mock.ts b/src/core/data/mock.ts index 3659e83..75f40e6 100644 --- a/src/core/data/mock.ts +++ b/src/core/data/mock.ts @@ -81,6 +81,7 @@ export const SUGGESTED_DEEDS: Deed[] = [ icon: 'book-open-page-variant', category: 'QURAN', statuses: GENERIC_STATUSES, + goal: { value: 1, unit: 'page' }, isCore: false, }, { @@ -89,6 +90,7 @@ export const SUGGESTED_DEEDS: Deed[] = [ icon: 'brain', category: 'QURAN', statuses: GENERIC_STATUSES, + goal: { value: 1, unit: 'ayah' }, isCore: false, }, // LEARNING @@ -98,6 +100,7 @@ export const SUGGESTED_DEEDS: Deed[] = [ icon: 'book-education', category: 'LEARNING', statuses: GENERIC_STATUSES, + goal: { value: 1, unit: 'page' }, isCore: false, }, // SOCIAL @@ -119,6 +122,21 @@ export const SUGGESTED_DEEDS: Deed[] = [ }, ]; +const suggestedDeedById = new Map(SUGGESTED_DEEDS.map((deed) => [deed.id, deed])); + +export const hydrateSuggestedDeed = (deed: Deed): Deed => { + const suggestedDeed = suggestedDeedById.get(deed.id); + + if (!suggestedDeed?.goal || deed.goal) { + return deed; + } + + return { + ...deed, + goal: suggestedDeed.goal, + }; +}; + export const MOCK_LOGS: DeedLog[] = [ // Today's logs { diff --git a/src/core/store/appStore.ts b/src/core/store/appStore.ts index 9903c22..c37c80a 100644 --- a/src/core/store/appStore.ts +++ b/src/core/store/appStore.ts @@ -1,7 +1,13 @@ // src/core/store/appStore.ts import { create } from 'zustand'; import { Deed, DeedLog, DeedStatus } from '../data/models'; -import { GENERIC_STATUSES, MOCK_DEEDS, MOCK_LOGS, SUGGESTED_DEEDS } from '../data/mock'; +import { + GENERIC_STATUSES, + MOCK_DEEDS, + MOCK_LOGS, + SUGGESTED_DEEDS, + hydrateSuggestedDeed, +} from '../data/mock'; import { loadData, saveData } from '../storage/storageService'; import { formatISO } from 'date-fns'; import { Alert, Appearance, I18nManager } from 'react-native'; @@ -66,6 +72,8 @@ const defaultSettings: AppSettings = { reminderTime: '20:00', }; +const hydrateBuiltInDeedGoals = (deeds: Deed[]) => deeds.map(hydrateSuggestedDeed); + const persistState = (state: AppState) => { const dataToSave: AppData = { // Only save the user's actual deeds and logs, not the demo ones @@ -103,7 +111,7 @@ const useAppStore = create((set, get) => ({ if (loadedData) { settings = { ...defaultSettings, ...loadedData.settings }; - initialDeeds = loadedData.deeds; + initialDeeds = hydrateBuiltInDeedGoals(loadedData.deeds); initialLogs = loadedData.logs; } diff --git a/src/screens/HomeScreen.tsx b/src/screens/HomeScreen.tsx index 4fb361e..e245c4a 100644 --- a/src/screens/HomeScreen.tsx +++ b/src/screens/HomeScreen.tsx @@ -4,6 +4,7 @@ import { Screen } from '@/components/Screen'; import { ThemedText } from '@/components/base/ThemedText'; import { FAB } from '@/components/FAB'; import { AppTheme } from '@/constants/theme'; +import { hydrateSuggestedDeed } from '@/core/data/mock'; import { Deed, DeedLog, DeedStatus } from '@/core/data/models'; import i18n, { dateLocales } from '@/core/i18n'; import useAppStore from '@/core/store/appStore'; @@ -77,7 +78,7 @@ const HomeScreen = () => { }); const sections: { title: string; data: Deed[] }[] = []; - const deedsByCategory = visibleDeeds.reduce( + const deedsByCategory = visibleDeeds.map(hydrateSuggestedDeed).reduce( (acc, deed) => { (acc[deed.category] = acc[deed.category] || []).push(deed); return acc;