@@ -30,7 +30,6 @@ import {
3030} from '@/components/ui/better-tooltip' ;
3131import statementsCategories from '@/data/statementsCategories.json' ;
3232import { formatCategoryName } from '@/lib/utils' ;
33- import { EntriesContext } from '../context/EntriesContext' ;
3433
3534export interface StatementItemProps {
3635 statement : Entry ;
@@ -58,6 +57,7 @@ export interface StatementItemProps {
5857 onReset ?: ( statementId : string ) => void ;
5958 onToggleResolved ?: ( statementId : string ) => void ;
6059 onToggleActionResolved ?: ( actionId : string ) => void ;
60+ originalCategory ?: string ; // Add prop for original category from parent
6161}
6262
6363// Helper function to normalize category ID for comparison
@@ -109,6 +109,7 @@ const StatementItem: React.FC<StatementItemProps> = ({
109109 onReset,
110110 onToggleResolved = ( ) => { } ,
111111 onToggleActionResolved = ( ) => { } ,
112+ originalCategory : externalOriginalCategory , // Get original category from parent
112113} ) => {
113114 const [ isActionsExpanded , setIsActionsExpanded ] = React . useState ( false ) ;
114115
@@ -126,151 +127,48 @@ const StatementItem: React.FC<StatementItemProps> = ({
126127 // Local state to track if we are currently saving the draft
127128 const [ isSaving , setIsSaving ] = React . useState ( false ) ;
128129
129- // DEBUG LOGGER - Create a unique ID for this component instance
130- const componentId = React . useRef ( `StatementItem_${ statement . id } _${ Date . now ( ) } ` ) . current ;
131-
132- // DEBUG LOGGER - Track all calls to setOriginalCategory
133- const debugSetOriginalCategory = ( value : string | null , source : string ) => {
134- console . log ( `[CATEGORY TRACKER] SET ORIGINAL CATEGORY from ${ source } :` , {
135- componentId,
136- statementId : statement . id ,
137- from : originalCategory ,
138- to : value ,
139- statement : statement . category ,
140- callStack : new Error ( ) . stack ?. split ( '\n' ) . slice ( 2 , 5 ) . join ( '\n' )
141- } ) ;
142- setOriginalCategory ( value ) ;
143- } ;
144-
145- // LOG EACH RENDER
146- console . log ( `[RENDER] StatementItem ${ componentId } :` , {
147- statementId : statement . id ,
148- isEditing,
149- category : statement . category ,
150- originalCategory
151- } ) ;
152-
153- // Track statement changes via ref
154- const prevStatementRef = React . useRef ( statement ) ;
155-
156- // Log statement changes between renders
157- if ( prevStatementRef . current !== statement ) {
158- console . log ( `[STATEMENT CHANGED] ${ componentId } :` , {
159- prevCategory : prevStatementRef . current . category ,
160- newCategory : statement . category ,
161- originalCategory,
162- statementObjectChanged : prevStatementRef . current !== statement
163- } ) ;
164- prevStatementRef . current = statement ;
165- }
166-
167- // Import the EntriesContext to access the global original categories store
168- const entriesContext = React . useContext ( EntriesContext ) ;
169-
170130 // Effect for edit mode changes - only runs when isEditing changes
171131 useEffect ( ( ) => {
172- console . log ( `[EDIT MODE EFFECT] ${ componentId } :` , {
173- isEditing,
174- id : statement . id ,
175- category : statement . category ,
176- originalCategory,
177- globalOriginalCategory : entriesContext ?. data . originalCategories [ statement . id ]
178- } ) ;
179-
180132 if ( isEditing ) {
181133 // Entering edit mode - capture original values if not already set
182134 if ( originalCategory === null ) {
183- console . log ( `[CAPTURE ORIGINAL VALUES] ${ componentId } ` ) ;
184-
185- // Check if we already have an original category stored in the global context
186- const globalOriginalCategory = entriesContext ?. data . originalCategories [ statement . id ] ;
187-
188- // Use the stored original category if available, otherwise use the current category
189- const originalCategoryValue = globalOriginalCategory || ( statement . category ? String ( statement . category ) : '' ) ;
190-
191- console . log ( `[FREEZING ORIGINAL CATEGORY] ${ componentId } :` , {
192- originalCategoryValue,
193- statementCategory : statement . category ,
194- fromGlobalStore : ! ! globalOriginalCategory
195- } ) ;
196-
197- // If the original category isn't already in the global store, save it there
198- if ( ! globalOriginalCategory && entriesContext ) {
199- entriesContext . setData ( {
200- type : 'SET_ORIGINAL_CATEGORY' ,
201- payload : {
202- statementId : statement . id ,
203- category : originalCategoryValue
204- }
205- } ) ;
206- }
207-
208- // Also set it in the local state for immediate use in comparison
209- debugSetOriginalCategory ( originalCategoryValue , 'EDIT_MODE_START' ) ;
135+ // Use the external original category from parent if available, otherwise use the current category
136+ const originalCategoryValue =
137+ externalOriginalCategory ||
138+ ( statement . category ? String ( statement . category ) : "" ) ;
139+
140+ // Set it in the local state for immediate use in comparison
141+ setOriginalCategory ( originalCategoryValue ) ;
210142 setOriginalSubject ( statement . atoms . subject ) ;
211143 setOriginalVerb ( statement . atoms . verb ) ;
212144 setOriginalObject ( statement . atoms . object ) ;
213145 setOriginalPrivacy ( statement . isPublic ) ;
214- } else {
215- console . log ( `[EDIT CONTINUING - NOT CAPTURING] ${ componentId } ` , {
216- statementCategory : statement . category ,
217- originalCategory,
218- globalOriginalCategory : entriesContext ?. data . originalCategories [ statement . id ]
219- } ) ;
220146 }
221147
222148 // Always keep draft updated with latest statement value
223149 setDraft ( JSON . parse ( JSON . stringify ( statement ) ) ) ;
224150 } else {
225151 // Exiting edit mode - reset everything
226- console . log ( `[EXIT EDIT MODE] ${ componentId } - clearing original values` ) ;
227-
228- // Clear the original category from the global store
229- if ( entriesContext ) {
230- entriesContext . setData ( {
231- type : 'CLEAR_ORIGINAL_CATEGORY' ,
232- payload : statement . id
233- } ) ;
234- }
235-
236- // Clear local state
237- debugSetOriginalCategory ( null , 'EDIT_MODE_EXIT' ) ;
152+ setOriginalCategory ( null ) ;
238153 setOriginalSubject ( null ) ;
239154 setOriginalVerb ( null ) ;
240155 setOriginalObject ( null ) ;
241156 setOriginalPrivacy ( null ) ;
242-
157+
243158 setDraft ( JSON . parse ( JSON . stringify ( statement ) ) ) ;
244159 }
245- // Only depend on isEditing to prevent loops when the entriesContext changes
246- // eslint-disable-next-line react-hooks/exhaustive-deps
160+ // Only depend on isEditing to prevent loops
161+ // eslint-disable-next-line react-hooks/exhaustive-deps
247162 } , [ isEditing ] ) ;
248-
249- // Log every time originalCategory changes
250- useEffect ( ( ) => {
251- console . log ( `[ORIGINAL CATEGORY CHANGED] ${ componentId } :` , {
252- originalCategory,
253- statementCategory : statement . category
254- } ) ;
255- } , [ originalCategory , componentId , statement . category ] ) ;
256-
163+
257164 // Separate effect to keep draft updated when statement changes
258165 useEffect ( ( ) => {
259166 if ( isEditing ) {
260167 // Keep draft updated with latest changes from the statement
261- console . log ( `[STATEMENT UPDATE EFFECT] ${ componentId } :` , {
262- currentCategory : statement . category ,
263- originalCategory : originalCategory ,
264- globalOriginalCategory : entriesContext ?. data . originalCategories [ statement . id ] ,
265- different : statement . category !== originalCategory ,
266- editingStatementId : statement . id
267- } ) ;
268-
269168 setDraft ( JSON . parse ( JSON . stringify ( statement ) ) ) ;
270169 }
271- // We need statement in the deps array, but we'll exclude entriesContext to avoid loops
272- // eslint-disable-next-line react-hooks/exhaustive-deps
273- } , [ statement , isEditing , componentId ] ) ;
170+ // eslint-disable-next-line react-hooks/exhaustive-deps
171+ } , [ statement , isEditing ] ) ;
274172
275173 // Helper function to normalize category values for comparison
276174 const normalizeCategoryForComparison = (
@@ -288,7 +186,7 @@ const StatementItem: React.FC<StatementItemProps> = ({
288186 return categoryStr ;
289187 } ;
290188
291- // Calculate changes based on primitive values and global store
189+ // Calculate changes based on primitive values
292190 // If we're not in edit mode or don't have original values, no changes to detect
293191 let hasSubjectChanged = false ;
294192 let hasVerbChanged = false ;
@@ -298,11 +196,11 @@ const StatementItem: React.FC<StatementItemProps> = ({
298196 let hasChanged = false ;
299197
300198 if ( isEditing ) {
301- // Use the global store's original category if available, otherwise use the local state
302- // This ensures we always compare against the true original, even after remounting
303- const effectiveOriginalCategory = entriesContext ?. data . originalCategories [ statement . id ] || originalCategory ;
199+ // Use the external original category if available, otherwise use local state
200+ // This ensures consistent comparison even after component remounts
201+ const effectiveOriginalCategory = externalOriginalCategory || originalCategory ;
304202
305- if ( effectiveOriginalCategory !== null ) {
203+ if ( effectiveOriginalCategory !== null || originalCategory !== null ) {
306204 // Compare current draft with original primitive values
307205 hasSubjectChanged = draft . atoms . subject !== originalSubject ;
308206 hasVerbChanged = draft . atoms . verb !== originalVerb ;
@@ -316,89 +214,16 @@ const StatementItem: React.FC<StatementItemProps> = ({
316214 // Compare normalized categories
317215 hasCategoryChanged = draftCategory !== originalCategoryNormalized ;
318216
319- // Log changes for debugging
320- console . log ( '[CHANGE DETECTION]' , {
321- subject : {
322- draft : draft . atoms . subject ,
323- original : originalSubject ,
324- changed : hasSubjectChanged ,
325- } ,
326- verb : {
327- draft : draft . atoms . verb ,
328- original : originalVerb ,
329- changed : hasVerbChanged ,
330- } ,
331- object : {
332- draft : draft . atoms . object ,
333- original : originalObject ,
334- changed : hasObjectChanged ,
335- } ,
336- privacy : {
337- draft : draft . isPublic ,
338- original : originalPrivacy ,
339- changed : hasPrivacyChanged ,
340- } ,
341- category : {
342- draft : draft . category ,
343- local : originalCategory ,
344- global : entriesContext ?. data . originalCategories [ statement . id ] ,
345- effective : effectiveOriginalCategory ,
346- draftNormalized : draftCategory ,
347- originalNormalized : originalCategoryNormalized ,
348- changed : hasCategoryChanged ,
349- } ,
350- } ) ;
351-
352217 // Calculate overall change status
353218 hasChanged =
354219 hasSubjectChanged ||
355220 hasVerbChanged ||
356221 hasObjectChanged ||
357222 hasPrivacyChanged ||
358223 hasCategoryChanged ;
359-
360- console . log ( '[OVERALL CHANGE STATUS]' , {
361- hasChanged,
362- hasSubjectChanged,
363- hasVerbChanged,
364- hasObjectChanged,
365- hasPrivacyChanged,
366- hasCategoryChanged
367- } ) ;
368224 }
369225 }
370226
371- // Uncomment for debugging if needed
372- // console.log('StatementItem change detection:', {
373- // subject: {
374- // draft: draft.atoms.subject,
375- // initial: initialDraft.atoms.subject,
376- // changed: hasSubjectChanged
377- // },
378- // verb: {
379- // draft: draft.atoms.verb,
380- // initial: initialDraft.atoms.verb,
381- // changed: hasVerbChanged
382- // },
383- // object: {
384- // draft: draft.atoms.object,
385- // initial: initialDraft.atoms.object,
386- // changed: hasObjectChanged
387- // },
388- // privacy: {
389- // draft: draft.isPublic,
390- // initial: initialDraft.isPublic,
391- // changed: hasPrivacyChanged
392- // },
393- // category: {
394- // draft: draft.category,
395- // initial: initialDraft.category,
396- // changed: hasCategoryChanged
397- // }
398- // });
399-
400- // Enable save button when any part of the statement has been changed
401-
402227 if ( isEditing ) {
403228 return (
404229 < div className = 'bg-gray-100 p-3 rounded-lg shadow' >
@@ -475,10 +300,6 @@ const StatementItem: React.FC<StatementItemProps> = ({
475300 draft . atoms . subject
476301 } ${ getVerbName ( draft . atoms . verb ) } ${ draft . atoms . object } `;
477302
478- console . log (
479- 'SAVE BUTTON CLICKED - submitting draft:' ,
480- updatedDraft
481- ) ;
482303 await onLocalSave ( updatedDraft ) ;
483304 setIsSaving ( false ) ;
484305 } }
@@ -649,10 +470,6 @@ const StatementItem: React.FC<StatementItemProps> = ({
649470 draft . atoms . verb
650471 ) } ${ draft . atoms . object } `;
651472
652- console . log (
653- 'SAVE BUTTON CLICKED (tablet) - submitting draft:' ,
654- updatedDraft
655- ) ;
656473 await onLocalSave ( updatedDraft ) ;
657474 setIsSaving ( false ) ;
658475 } }
@@ -778,10 +595,6 @@ const StatementItem: React.FC<StatementItemProps> = ({
778595 draft . atoms . verb
779596 ) } ${ draft . atoms . object } `;
780597
781- console . log (
782- 'SAVE BUTTON CLICKED (mobile) - submitting draft:' ,
783- updatedDraft
784- ) ;
785598 await onLocalSave ( updatedDraft ) ;
786599 setIsSaving ( false ) ;
787600 } }
@@ -937,4 +750,4 @@ const StatementItem: React.FC<StatementItemProps> = ({
937750 ) ;
938751} ;
939752
940- export default StatementItem ;
753+ export default StatementItem ;
0 commit comments