@yogiswara/honcho-editor-ui 2.7.13 → 2.7.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/package.json +1 -1
  2. package/dist/color.d.ts +0 -9
  3. package/dist/color.js +0 -9
  4. package/dist/components/editor/GalleryAlbum/AlbumImageGallery.d.ts +0 -8
  5. package/dist/components/editor/GalleryAlbum/AlbumImageGallery.js +0 -28
  6. package/dist/components/editor/GalleryAlbum/ImageItem.d.ts +0 -10
  7. package/dist/components/editor/GalleryAlbum/ImageItem.js +0 -81
  8. package/dist/components/editor/HAccordionAspectRatio.d.ts +0 -14
  9. package/dist/components/editor/HAccordionAspectRatio.js +0 -102
  10. package/dist/components/editor/HAccordionColor.d.ts +0 -16
  11. package/dist/components/editor/HAccordionColor.js +0 -282
  12. package/dist/components/editor/HAccordionColorAdjustment.d.ts +0 -35
  13. package/dist/components/editor/HAccordionColorAdjustment.js +0 -31
  14. package/dist/components/editor/HAccordionDetails.d.ts +0 -12
  15. package/dist/components/editor/HAccordionDetails.js +0 -157
  16. package/dist/components/editor/HAccordionLight.d.ts +0 -20
  17. package/dist/components/editor/HAccordionLight.js +0 -414
  18. package/dist/components/editor/HAccordionPreset.d.ts +0 -23
  19. package/dist/components/editor/HAccordionPreset.js +0 -50
  20. package/dist/components/editor/HAlertBox.d.ts +0 -8
  21. package/dist/components/editor/HAlertBox.js +0 -55
  22. package/dist/components/editor/HAspectRatioMobile.d.ts +0 -0
  23. package/dist/components/editor/HAspectRatioMobile.js +0 -1
  24. package/dist/components/editor/HBulkAccordionColorAdjustment.d.ts +0 -55
  25. package/dist/components/editor/HBulkAccordionColorAdjustment.js +0 -31
  26. package/dist/components/editor/HBulkAccordionColorAdjustmentColors.d.ts +0 -20
  27. package/dist/components/editor/HBulkAccordionColorAdjustmentColors.js +0 -121
  28. package/dist/components/editor/HBulkAccordionColorAdjustmentDetails.d.ts +0 -12
  29. package/dist/components/editor/HBulkAccordionColorAdjustmentDetails.js +0 -65
  30. package/dist/components/editor/HBulkAccordionColorAdjustmentLight.d.ts +0 -28
  31. package/dist/components/editor/HBulkAccordionColorAdjustmentLight.js +0 -177
  32. package/dist/components/editor/HBulkColorAdjustmentMobile.d.ts +0 -53
  33. package/dist/components/editor/HBulkColorAdjustmentMobile.js +0 -16
  34. package/dist/components/editor/HBulkColorMobile.d.ts +0 -20
  35. package/dist/components/editor/HBulkColorMobile.js +0 -121
  36. package/dist/components/editor/HBulkDetailsMobile.d.ts +0 -12
  37. package/dist/components/editor/HBulkDetailsMobile.js +0 -65
  38. package/dist/components/editor/HBulkLightMobile.d.ts +0 -28
  39. package/dist/components/editor/HBulkLightMobile.js +0 -192
  40. package/dist/components/editor/HBulkPreset.d.ts +0 -24
  41. package/dist/components/editor/HBulkPreset.js +0 -43
  42. package/dist/components/editor/HBulkPresetMobile.d.ts +0 -15
  43. package/dist/components/editor/HBulkPresetMobile.js +0 -26
  44. package/dist/components/editor/HDialogBox.d.ts +0 -18
  45. package/dist/components/editor/HDialogBox.js +0 -51
  46. package/dist/components/editor/HDialogCopy.d.ts +0 -40
  47. package/dist/components/editor/HDialogCopy.js +0 -80
  48. package/dist/components/editor/HFooter.d.ts +0 -12
  49. package/dist/components/editor/HFooter.js +0 -24
  50. package/dist/components/editor/HHeaderEditor.d.ts +0 -17
  51. package/dist/components/editor/HHeaderEditor.js +0 -36
  52. package/dist/components/editor/HImageEditorBulkDekstop.d.ts +0 -15
  53. package/dist/components/editor/HImageEditorBulkDekstop.js +0 -29
  54. package/dist/components/editor/HImageEditorBulkMobile.d.ts +0 -72
  55. package/dist/components/editor/HImageEditorBulkMobile.js +0 -81
  56. package/dist/components/editor/HImageEditorDekstop.d.ts +0 -15
  57. package/dist/components/editor/HImageEditorDekstop.js +0 -29
  58. package/dist/components/editor/HImageEditorMobile.d.ts +0 -51
  59. package/dist/components/editor/HImageEditorMobile.js +0 -92
  60. package/dist/components/editor/HImageEditorMobileLayout.d.ts +0 -14
  61. package/dist/components/editor/HImageEditorMobileLayout.js +0 -58
  62. package/dist/components/editor/HModalEditorDekstop.d.ts +0 -13
  63. package/dist/components/editor/HModalEditorDekstop.js +0 -22
  64. package/dist/components/editor/HModalMobile.d.ts +0 -13
  65. package/dist/components/editor/HModalMobile.js +0 -7
  66. package/dist/components/editor/HPresetDelete.d.ts +0 -7
  67. package/dist/components/editor/HPresetDelete.js +0 -7
  68. package/dist/components/editor/HPresetOptionMenu.d.ts +0 -9
  69. package/dist/components/editor/HPresetOptionMenu.js +0 -20
  70. package/dist/components/editor/HSliderColorMobile.d.ts +0 -16
  71. package/dist/components/editor/HSliderColorMobile.js +0 -270
  72. package/dist/components/editor/HSliderDetailsMobile.d.ts +0 -12
  73. package/dist/components/editor/HSliderDetailsMobile.js +0 -154
  74. package/dist/components/editor/HSliderLightMobile.d.ts +0 -20
  75. package/dist/components/editor/HSliderLightMobile.js +0 -420
  76. package/dist/components/editor/HTabAspectRatioMobile.d.ts +0 -0
  77. package/dist/components/editor/HTabAspectRatioMobile.js +0 -1
  78. package/dist/components/editor/HTabColorAdjustmentMobile.d.ts +0 -33
  79. package/dist/components/editor/HTabColorAdjustmentMobile.js +0 -16
  80. package/dist/components/editor/HTabPresetMobile.d.ts +0 -14
  81. package/dist/components/editor/HTabPresetMobile.js +0 -10
  82. package/dist/components/editor/HTextField.d.ts +0 -14
  83. package/dist/components/editor/HTextField.js +0 -51
  84. package/dist/components/editor/HWatermarkView.d.ts +0 -6
  85. package/dist/components/editor/HWatermarkView.js +0 -16
  86. package/dist/components/editor/svg/Tick.d.ts +0 -2
  87. package/dist/components/editor/svg/Tick.js +0 -6
  88. package/dist/components/modal/HModalDialog.d.ts +0 -12
  89. package/dist/components/modal/HModalDialog.js +0 -18
  90. package/dist/components/modal/HModalRename.d.ts +0 -14
  91. package/dist/components/modal/HModalRename.js +0 -35
  92. package/dist/hooks/demo/HonchoEditorBulkDemo.d.ts +0 -3
  93. package/dist/hooks/demo/HonchoEditorBulkDemo.js +0 -410
  94. package/dist/hooks/demo/HonchoEditorSingleCleanDemo.d.ts +0 -3
  95. package/dist/hooks/demo/HonchoEditorSingleCleanDemo.js +0 -354
  96. package/dist/hooks/demo/index.d.ts +0 -2
  97. package/dist/hooks/demo/index.js +0 -2
  98. package/dist/hooks/editor/type.d.ts +0 -174
  99. package/dist/hooks/editor/type.js +0 -1
  100. package/dist/hooks/editor/useHonchoEditorBulk.d.ts +0 -96
  101. package/dist/hooks/editor/useHonchoEditorBulk.js +0 -427
  102. package/dist/hooks/editor/useHonchoEditorSingle.d.ts +0 -44
  103. package/dist/hooks/editor/useHonchoEditorSingle.js +0 -162
  104. package/dist/hooks/useAdjustmentHistory.d.ts +0 -97
  105. package/dist/hooks/useAdjustmentHistory.js +0 -493
  106. package/dist/hooks/useAdjustmentHistoryBatch.d.ts +0 -177
  107. package/dist/hooks/useAdjustmentHistoryBatch.js +0 -1189
  108. package/dist/hooks/useGallerySwipe.d.ts +0 -36
  109. package/dist/hooks/useGallerySwipe.js +0 -344
  110. package/dist/hooks/usePaging.d.ts +0 -89
  111. package/dist/hooks/usePaging.js +0 -211
  112. package/dist/hooks/usePreset.d.ts +0 -82
  113. package/dist/hooks/usePreset.js +0 -344
  114. package/dist/index.d.ts +0 -41
  115. package/dist/index.js +0 -44
  116. package/dist/lib/context/EditorContext.d.ts +0 -28
  117. package/dist/lib/context/EditorContext.js +0 -60
  118. package/dist/lib/context/EditorProcessingService.d.ts +0 -36
  119. package/dist/lib/context/EditorProcessingService.js +0 -249
  120. package/dist/lib/editor/honcho-editor.d.ts +0 -324
  121. package/dist/lib/editor/honcho-editor.js +0 -825
  122. package/dist/lib/hooks/useEditor.d.ts +0 -22
  123. package/dist/lib/hooks/useEditor.js +0 -35
  124. package/dist/lib/hooks/useEditorHeadless.d.ts +0 -34
  125. package/dist/lib/hooks/useEditorHeadless.js +0 -207
  126. package/dist/lib/hooks/useImageProcessor.d.ts +0 -18
  127. package/dist/lib/hooks/useImageProcessor.js +0 -113
  128. package/dist/setupTests.d.ts +0 -1
  129. package/dist/setupTests.js +0 -1
  130. package/dist/themes/colors.d.ts +0 -12
  131. package/dist/themes/colors.js +0 -12
  132. package/dist/themes/honchoTheme.d.ts +0 -25
  133. package/dist/themes/honchoTheme.js +0 -94
  134. package/dist/utils/adjustment.d.ts +0 -6
  135. package/dist/utils/adjustment.js +0 -48
  136. package/dist/utils/imageLoader.d.ts +0 -11
  137. package/dist/utils/imageLoader.js +0 -48
  138. package/dist/utils/isMobile.d.ts +0 -1
  139. package/dist/utils/isMobile.js +0 -5
@@ -1,427 +0,0 @@
1
- 'use client';
2
- import { useState, useCallback, useEffect, useMemo, useRef } from 'react';
3
- import { useAdjustmentHistoryBatch } from '../useAdjustmentHistoryBatch';
4
- import { usePaging } from "../usePaging";
5
- import { usePreset } from "../usePreset";
6
- import { mapAdjustmentStateToAdjustmentEditor } from "../../utils/adjustment";
7
- // Helper function to map the API response to the format our UI component needs
8
- const mapGalleryToPhotoData = (gallery, selectedIds) => {
9
- return {
10
- key: gallery.id,
11
- src: gallery.raw_thumbnail?.path ? gallery.raw_thumbnail.path : gallery.thumbnail?.path,
12
- original: gallery.download?.path || gallery.thumbnail?.path,
13
- width: gallery.thumbnail?.width,
14
- height: gallery.thumbnail?.height,
15
- alt: gallery.id || 'gallery image',
16
- isSelected: selectedIds.includes(gallery.id),
17
- adjustments: gallery.editor_config?.color_adjustment,
18
- };
19
- };
20
- const mapToImageAdjustmentConfig = (gallery) => {
21
- return {
22
- imageId: gallery.id,
23
- adjustment: mapColorAdjustmentToAdjustmentState(gallery.editor_config?.color_adjustment),
24
- };
25
- };
26
- function mapColorAdjustmentToAdjustmentState(adj) {
27
- if (!adj)
28
- return undefined;
29
- return {
30
- tempScore: adj.temperature || 0,
31
- tintScore: adj.tint || 0,
32
- vibranceScore: adj.vibrance || 0,
33
- saturationScore: adj.saturation || 0,
34
- exposureScore: adj.exposure || 0,
35
- highlightsScore: adj.highlights || 0,
36
- shadowsScore: adj.shadows || 0,
37
- whitesScore: adj.whites || 0,
38
- blacksScore: adj.blacks || 0,
39
- contrastScore: adj.contrast || 0,
40
- clarityScore: adj.clarity || 0,
41
- sharpnessScore: adj.sharpness || 0,
42
- };
43
- }
44
- // Helper function to convert Preset to AdjustmentState
45
- const presetToAdjustmentState = (preset) => {
46
- return {
47
- tempScore: preset.temperature || 0,
48
- tintScore: preset.tint || 0,
49
- vibranceScore: preset.vibrance || 0,
50
- saturationScore: preset.saturation || 0,
51
- exposureScore: preset.exposure || 0,
52
- highlightsScore: preset.highlights || 0,
53
- shadowsScore: preset.shadows || 0,
54
- whitesScore: preset.whites || 0,
55
- blacksScore: preset.blacks || 0,
56
- contrastScore: preset.contrast || 0,
57
- clarityScore: preset.clarity || 0,
58
- sharpnessScore: preset.sharpness || 0,
59
- };
60
- };
61
- // Helper function to compare adjustment states
62
- const adjustmentsMatch = (a, b) => {
63
- const keys = [
64
- 'tempScore', 'tintScore', 'vibranceScore', 'saturationScore',
65
- 'exposureScore', 'highlightsScore', 'shadowsScore', 'whitesScore',
66
- 'blacksScore', 'contrastScore', 'clarityScore', 'sharpnessScore'
67
- ];
68
- return keys.every(key => (a[key] || 0) === (b[key] || 0));
69
- };
70
- /**
71
- * Hook for bulk photo editing with multi-image backend synchronization.
72
- *
73
- * **Multi-Image Backend Sync:**
74
- * - Each selected image maintains its own history and backend state
75
- * - History operations (undo/redo) trigger separate controller.setHistoryIndex() calls for each selected image
76
- * - Preset application triggers separate controller.createEditorConfig() calls for each selected image
77
- * - Adjustment changes trigger separate controller.createEditorConfig() calls for each selected image
78
- *
79
- * **Key Features:**
80
- * - Individual history tracking per image with backend persistence
81
- * - Bulk operations that respect per-image differences
82
- * - Automatic backend synchronization for all state changes
83
- * - Comprehensive logging of multi-image operations
84
- */
85
- export function useHonchoEditorBulk(controller, eventID, firebaseUid) {
86
- console.log('[useHonchoEditorBulk] 🏭 Initializing with controller for multi-image backend sync');
87
- const { currentBatch, selectedIds, actions: batchActions, historyInfo } = useAdjustmentHistoryBatch({
88
- controller,
89
- firebaseUid,
90
- eventId: eventID,
91
- devWarnings: true
92
- });
93
- const { images, info, actions } = usePaging(controller, firebaseUid, eventID, {
94
- autoLoad: true,
95
- autoReset: false // Prevent auto-reset to avoid loops
96
- });
97
- // Preset management
98
- const { presets, actions: presetActions } = usePreset(controller, firebaseUid, {
99
- autoLoad: true,
100
- devWarnings: true
101
- });
102
- // Track which images have been synced to prevent loops
103
- const lastSyncedImageIds = useRef(new Set());
104
- // State for Bulk Editing
105
- const [selectedBulkPreset, setSelectedBulkPreset] = useState('');
106
- // Calculate active preset based on selected images' adjustments
107
- const activePreset = useMemo(() => {
108
- if (selectedIds.length === 0) {
109
- return null;
110
- }
111
- // Get adjustments for all selected images
112
- const selectedAdjustments = selectedIds.map(imageId => {
113
- return currentBatch.allImages[imageId] || {
114
- tempScore: 0, tintScore: 0, vibranceScore: 0, saturationScore: 0,
115
- exposureScore: 0, highlightsScore: 0, shadowsScore: 0, whitesScore: 0,
116
- blacksScore: 0, contrastScore: 0, clarityScore: 0, sharpnessScore: 0,
117
- };
118
- });
119
- // Check if all selected images have the same adjustments
120
- const firstAdjustment = selectedAdjustments[0];
121
- const allSameAdjustments = selectedAdjustments.every(adj => adjustmentsMatch(adj, firstAdjustment));
122
- if (!allSameAdjustments) {
123
- // Selected images have different adjustments
124
- return null;
125
- }
126
- // Find preset that matches the common adjustment state
127
- const matchingPreset = presets.find(preset => {
128
- const presetAdjustments = presetToAdjustmentState(preset);
129
- return adjustmentsMatch(presetAdjustments, firstAdjustment);
130
- });
131
- return matchingPreset || null;
132
- }, [selectedIds, currentBatch.allImages, presets]);
133
- // Update selectedBulkPreset when activePreset changes
134
- useEffect(() => {
135
- setSelectedBulkPreset(activePreset?.id || '');
136
- }, [activePreset]);
137
- // Use loading states from usePaging instead of local state
138
- const isLoading = info.isLoading;
139
- const error = info.error;
140
- const hasMore = info.hasMore;
141
- const imageData = useMemo(() => {
142
- // console.debug("imageData recalculating with:", {
143
- // imagesLength: images.length,
144
- // selectedIds,
145
- // currentBatch_allImages: currentBatch.allImages,
146
- // currentBatch_allImages_keys: Object.keys(currentBatch.allImages)
147
- // });
148
- const res = images.map(item => {
149
- const basePhoto = mapGalleryToPhotoData(item, selectedIds);
150
- const batchAdjustment = currentBatch.allImages[item.id];
151
- if (batchAdjustment) {
152
- const adjustmentsValues = mapAdjustmentStateToAdjustmentEditor(batchAdjustment);
153
- basePhoto.adjustments = adjustmentsValues;
154
- }
155
- // Merge batch adjustments over backend adjustments
156
- return batchAdjustment ? { ...basePhoto } : basePhoto;
157
- });
158
- return res;
159
- }, [images, selectedIds, currentBatch.allImages]);
160
- // Store the latest batchActions.syncAdjustment in a ref to avoid dependency issues
161
- const syncAdjustmentRef = useRef(batchActions.syncAdjustment);
162
- syncAdjustmentRef.current = batchActions.syncAdjustment;
163
- // Safe sync: Only sync new images to prevent infinite loops
164
- useEffect(() => {
165
- console.log('[useHonchoEditorBulk] 🔄 Sync effect triggered:', {
166
- imagesLength: images.length,
167
- imageIds: images.map(img => img.id),
168
- lastSyncedImageIds: Array.from(lastSyncedImageIds.current),
169
- lastSyncedCount: lastSyncedImageIds.current.size
170
- });
171
- if (images.length === 0)
172
- return;
173
- // Check if we have new images that haven't been synced
174
- const currentImageIds = new Set(images.map(img => img.id));
175
- const hasNewImages = images.some(img => !lastSyncedImageIds.current.has(img.id));
176
- console.log('[useHonchoEditorBulk] 🔍 New images check:', {
177
- currentImageIds: Array.from(currentImageIds),
178
- hasNewImages,
179
- newImages: images.filter(img => !lastSyncedImageIds.current.has(img.id)).map(img => img.id)
180
- });
181
- if (hasNewImages) {
182
- console.log('[useHonchoEditorBulk] ⚠️ SYNC TRIGGER: Syncing new images to batch (THIS RESETS HISTORY!):', images.length);
183
- syncAdjustmentRef.current(images.map(mapToImageAdjustmentConfig));
184
- lastSyncedImageIds.current = currentImageIds;
185
- }
186
- else {
187
- console.log('[useHonchoEditorBulk] ✅ No new images, skipping sync (history preserved)');
188
- }
189
- }, [images]); // Only depend on images, not batchActions
190
- const handleBackCallbackBulk = useCallback(() => {
191
- const lastSelectedId = selectedIds.length > 0 ? selectedIds[selectedIds.length - 1] : "";
192
- controller.handleBack(firebaseUid, lastSelectedId);
193
- }, [controller, firebaseUid, selectedIds]);
194
- const handleSelectBulkPreset = useCallback((event) => {
195
- const presetId = event.target.value;
196
- setSelectedBulkPreset(presetId);
197
- console.log('[useHonchoEditorBulk] 🎨 Preset selection attempt:', {
198
- presetId,
199
- selectedImages: selectedIds,
200
- imageCount: selectedIds.length,
201
- hasController: !!controller,
202
- hasFirebaseUid: !!firebaseUid
203
- });
204
- if (!presetId) {
205
- console.log('[useHonchoEditorBulk] ❌ No preset ID provided, skipping backend call');
206
- return;
207
- }
208
- if (selectedIds.length === 0) {
209
- console.log('[useHonchoEditorBulk] ❌ No images selected, skipping backend call');
210
- return;
211
- }
212
- console.log('[useHonchoEditorBulk] 🎨 Applying preset to multiple images:', {
213
- presetId,
214
- selectedImages: selectedIds,
215
- imageCount: selectedIds.length
216
- });
217
- // Find the preset
218
- const preset = presets.find(p => p.id === presetId);
219
- if (!preset) {
220
- console.log('[useHonchoEditorBulk] ❌ Preset not found in presets list:', presetId);
221
- return;
222
- }
223
- // Convert preset to adjustment state
224
- const presetAdjustments = presetToAdjustmentState(preset);
225
- console.log('[useHonchoEditorBulk] 📤 Sending preset adjustments to controller for each image:', presetAdjustments);
226
- console.log('[useHonchoEditorBulk] 🔄 About to call batchActions.adjustSelectedWithPreset');
227
- // Apply preset directly to all selected images using the clean action
228
- // This will trigger backend calls for each selected image via adjustSelectedWithPreset
229
- batchActions.adjustSelectedWithPreset(presetAdjustments);
230
- console.log('[useHonchoEditorBulk] ✅ Called batchActions.adjustSelectedWithPreset, backend calls should be triggered');
231
- }, [presets, selectedIds, batchActions, controller, firebaseUid]);
232
- // This factory creates functions that adjust a value for all selected images
233
- const createRelativeAdjuster = useCallback((key, amount) => () => {
234
- console.debug(`[useHonchoEditorBulk] 🎛️ Bulk ${key} adjustment:`, {
235
- key,
236
- amount,
237
- selectedImages: selectedIds,
238
- imageCount: selectedIds.length
239
- });
240
- console.debug('[useHonchoEditorBulk] 📤 Sending bulk adjustment to controller for each selected image');
241
- console.debug("currentBatch.allImages before:", currentBatch.allImages);
242
- batchActions.adjustSelected({ [key]: amount });
243
- // Debug after a short delay to see if the state changed
244
- setTimeout(() => {
245
- console.debug("currentBatch.allImages after:", currentBatch.allImages);
246
- }, 100);
247
- }, [batchActions, selectedIds, currentBatch.allImages]);
248
- const handleBulkTempDecreaseMax = createRelativeAdjuster('tempScore', -20);
249
- const handleBulkTempDecrease = createRelativeAdjuster('tempScore', -5);
250
- const handleBulkTempIncrease = createRelativeAdjuster('tempScore', 5);
251
- const handleBulkTempIncreaseMax = createRelativeAdjuster('tempScore', 20);
252
- const handleBulkTintDecreaseMax = createRelativeAdjuster('tintScore', -20);
253
- const handleBulkTintDecrease = createRelativeAdjuster('tintScore', -5);
254
- const handleBulkTintIncrease = createRelativeAdjuster('tintScore', 5);
255
- const handleBulkTintIncreaseMax = createRelativeAdjuster('tintScore', 20);
256
- const handleBulkVibranceDecreaseMax = createRelativeAdjuster('vibranceScore', -20);
257
- const handleBulkVibranceDecrease = createRelativeAdjuster('vibranceScore', -5);
258
- const handleBulkVibranceIncrease = createRelativeAdjuster('vibranceScore', 5);
259
- const handleBulkVibranceIncreaseMax = createRelativeAdjuster('vibranceScore', 20);
260
- const handleBulkSaturationDecreaseMax = createRelativeAdjuster('saturationScore', -20);
261
- const handleBulkSaturationDecrease = createRelativeAdjuster('saturationScore', -5);
262
- const handleBulkSaturationIncrease = createRelativeAdjuster('saturationScore', 5);
263
- const handleBulkSaturationIncreaseMax = createRelativeAdjuster('saturationScore', 20);
264
- const handleBulkExposureDecreaseMax = createRelativeAdjuster('exposureScore', -20);
265
- const handleBulkExposureDecrease = createRelativeAdjuster('exposureScore', -5);
266
- const handleBulkExposureIncrease = createRelativeAdjuster('exposureScore', 5);
267
- const handleBulkExposureIncreaseMax = createRelativeAdjuster('exposureScore', 20);
268
- const handleBulkContrastDecreaseMax = createRelativeAdjuster('contrastScore', -20);
269
- const handleBulkContrastDecrease = createRelativeAdjuster('contrastScore', -5);
270
- const handleBulkContrastIncrease = createRelativeAdjuster('contrastScore', 5);
271
- const handleBulkContrastIncreaseMax = createRelativeAdjuster('contrastScore', 20);
272
- const handleBulkHighlightsDecreaseMax = createRelativeAdjuster('highlightsScore', -20);
273
- const handleBulkHighlightsDecrease = createRelativeAdjuster('highlightsScore', -5);
274
- const handleBulkHighlightsIncrease = createRelativeAdjuster('highlightsScore', 5);
275
- const handleBulkHighlightsIncreaseMax = createRelativeAdjuster('highlightsScore', 20);
276
- const handleBulkShadowsDecreaseMax = createRelativeAdjuster('shadowsScore', -20);
277
- const handleBulkShadowsDecrease = createRelativeAdjuster('shadowsScore', -5);
278
- const handleBulkShadowsIncrease = createRelativeAdjuster('shadowsScore', 5);
279
- const handleBulkShadowsIncreaseMax = createRelativeAdjuster('shadowsScore', 20);
280
- const handleBulkWhitesDecreaseMax = createRelativeAdjuster('whitesScore', -20);
281
- const handleBulkWhitesDecrease = createRelativeAdjuster('whitesScore', -5);
282
- const handleBulkWhitesIncrease = createRelativeAdjuster('whitesScore', 5);
283
- const handleBulkWhitesIncreaseMax = createRelativeAdjuster('whitesScore', 20);
284
- const handleBulkBlacksDecreaseMax = createRelativeAdjuster('blacksScore', -20);
285
- const handleBulkBlacksDecrease = createRelativeAdjuster('blacksScore', -5);
286
- const handleBulkBlacksIncrease = createRelativeAdjuster('blacksScore', 5);
287
- const handleBulkBlacksIncreaseMax = createRelativeAdjuster('blacksScore', 20);
288
- const handleBulkClarityDecreaseMax = createRelativeAdjuster('clarityScore', -20);
289
- const handleBulkClarityDecrease = createRelativeAdjuster('clarityScore', -5);
290
- const handleBulkClarityIncrease = createRelativeAdjuster('clarityScore', 5);
291
- const handleBulkClarityIncreaseMax = createRelativeAdjuster('clarityScore', 20);
292
- const handleBulkSharpnessDecreaseMax = createRelativeAdjuster('sharpnessScore', -20);
293
- const handleBulkSharpnessDecrease = createRelativeAdjuster('sharpnessScore', -5);
294
- const handleBulkSharpnessIncrease = createRelativeAdjuster('sharpnessScore', 5);
295
- const handleBulkSharpnessIncreaseMax = createRelativeAdjuster('sharpnessScore', 20);
296
- // const loadImages = useCallback(async (pageNum: number) => {
297
- // // Use the correct loading state
298
- // if (pageNum === 1) {
299
- // setIsLoading(true);
300
- // } else {
301
- // setIsFetchingMore(true);
302
- // }
303
- // setError(null);
304
- // try {
305
- // const response = await controller.getImageList(firebaseUid, eventID, pageNum);
306
- // // Sync adjustments for the new images with the batch history
307
- // batchActions.syncAdjustment(response.gallery.map(mapToImageAdjustmentConfig));
308
- // // Append new images for page > 1, otherwise replace
309
- // setImageCollection(prev => pageNum === 1 ? response.gallery : [...prev, ...response.gallery]);
310
- // setPage(response.current_page);
311
- // setHasMore(response.next_page > 0 && response.gallery.length > 0);
312
- // } catch (err: any) {
313
- // console.error("Failed to fetch image list:", err);
314
- // setError(err.message || "Could not load images.");
315
- // } finally {
316
- // if (pageNum === 1) {
317
- // setIsLoading(false);
318
- // } else {
319
- // setIsFetchingMore(false);
320
- // }
321
- // }
322
- // }, [controller, firebaseUid, eventID, batchActions]);
323
- // const loadMoreImages = useCallback(() => {
324
- // if (!isFetchingMore && hasMore) {
325
- // loadImages(page + 1);
326
- // }
327
- // }, [isFetchingMore, hasMore, page, loadImages]);
328
- // Note: Image loading is now handled by usePaging hook
329
- // The sync logic above handles syncing loaded images to batch state
330
- // useEffect(() => {
331
- // if (eventID && firebaseUid) {
332
- // setImageCollection([]); // reset when event changes
333
- // setPage(1);
334
- // loadImages(1);
335
- // }
336
- // }, [eventID, firebaseUid, loadImages]);
337
- return {
338
- imageData,
339
- isLoading,
340
- error,
341
- selectedIds,
342
- hasMore,
343
- // loadMoreImages,
344
- // Gallery Handlers
345
- handleBackCallbackBulk,
346
- // Preset functionality
347
- presets,
348
- selectedBulkPreset,
349
- activePreset,
350
- handleSelectBulkPreset,
351
- // Preset creation handlers
352
- presetActions, // Expose preset actions for create/rename/delete
353
- handleToggleImageSelection: batchActions.toggleSelection,
354
- handleLoadMore: actions.loadMore,
355
- handleRefresh: actions.refresh,
356
- // Adjustment
357
- handleBulkTempDecreaseMax,
358
- handleBulkTempDecrease,
359
- handleBulkTempIncrease,
360
- handleBulkTempIncreaseMax,
361
- handleBulkTintDecreaseMax,
362
- handleBulkTintDecrease,
363
- handleBulkTintIncrease,
364
- handleBulkTintIncreaseMax,
365
- handleBulkVibranceDecreaseMax,
366
- handleBulkVibranceDecrease,
367
- handleBulkVibranceIncrease,
368
- handleBulkVibranceIncreaseMax,
369
- handleBulkSaturationDecreaseMax,
370
- handleBulkSaturationDecrease,
371
- handleBulkSaturationIncrease,
372
- handleBulkSaturationIncreaseMax,
373
- // Adjustment Light
374
- handleBulkExposureDecreaseMax,
375
- handleBulkExposureDecrease,
376
- handleBulkExposureIncrease,
377
- handleBulkExposureIncreaseMax,
378
- handleBulkContrastDecreaseMax,
379
- handleBulkContrastDecrease,
380
- handleBulkContrastIncrease,
381
- handleBulkContrastIncreaseMax,
382
- handleBulkHighlightsDecreaseMax,
383
- handleBulkHighlightsDecrease,
384
- handleBulkHighlightsIncrease,
385
- handleBulkHighlightsIncreaseMax,
386
- handleBulkShadowsDecreaseMax,
387
- handleBulkShadowsDecrease,
388
- handleBulkShadowsIncrease,
389
- handleBulkShadowsIncreaseMax,
390
- handleBulkWhitesDecreaseMax,
391
- handleBulkWhitesDecrease,
392
- handleBulkWhitesIncrease,
393
- handleBulkWhitesIncreaseMax,
394
- handleBulkBlacksDecreaseMax,
395
- handleBulkBlacksDecrease,
396
- handleBulkBlacksIncrease,
397
- handleBulkBlacksIncreaseMax,
398
- // Adjustment Details
399
- handleBulkClarityDecreaseMax,
400
- handleBulkClarityDecrease,
401
- handleBulkClarityIncrease,
402
- handleBulkClarityIncreaseMax,
403
- handleBulkSharpnessDecreaseMax,
404
- handleBulkSharpnessDecrease,
405
- handleBulkSharpnessIncrease,
406
- handleBulkSharpnessIncreaseMax,
407
- // History actions
408
- handleUndo: () => {
409
- console.log('[useHonchoEditorBulk] ⏪ Undo requested for multiple images:', {
410
- selectedImages: selectedIds,
411
- imageCount: selectedIds.length
412
- });
413
- console.log('[useHonchoEditorBulk] 📤 Sending undo (setHistoryIndex) to controller for each image');
414
- return batchActions.undo();
415
- },
416
- handleRedo: () => {
417
- console.log('[useHonchoEditorBulk] ⏩ Redo requested for multiple images:', {
418
- selectedImages: selectedIds,
419
- imageCount: selectedIds.length
420
- });
421
- console.log('[useHonchoEditorBulk] 📤 Sending redo (setHistoryIndex) to controller for each image');
422
- return batchActions.redo();
423
- },
424
- handleReset: batchActions.reset,
425
- historyInfo,
426
- };
427
- }
@@ -1,44 +0,0 @@
1
- import { Controller, AdjustmentState, Preset } from './type';
2
- import { Gallery } from './type';
3
- import { AdjustmentValues } from '../../lib/editor/honcho-editor';
4
- export interface UseHonchoEditorSingleOptions {
5
- controller: Controller;
6
- initImageId: string;
7
- firebaseUid: string;
8
- }
9
- export interface UseHonchoEditorSingleState {
10
- currentImageData: Gallery | null;
11
- isGalleryLoading: boolean;
12
- galleryError: string | null;
13
- currentAdjustments: AdjustmentState;
14
- isBatchMode: boolean;
15
- canUndo: boolean;
16
- canRedo: boolean;
17
- isNextAvailable: boolean;
18
- isPrevAvailable: boolean;
19
- presets: Preset[];
20
- activePreset: Preset | null;
21
- presetsLoading: boolean;
22
- presetsError: string | null;
23
- }
24
- export interface UseHonchoEditorSingleActions {
25
- navigateNext: () => void;
26
- navigatePrev: () => void;
27
- updateAdjustment: (field: keyof AdjustmentState, value: number) => void;
28
- setBatchMode: (enabled: boolean) => void;
29
- startBatchMode: () => void;
30
- endBatchMode: () => void;
31
- undo: () => void;
32
- redo: () => void;
33
- reset: () => void;
34
- loadPresets: () => Promise<void>;
35
- applyPreset: (preset: Preset) => void;
36
- createPreset: (name: string, adjustments: AdjustmentState) => Promise<Preset | null>;
37
- renamePreset: (presetId: string, newName: string) => Promise<boolean>;
38
- deletePreset: (presetId: string) => Promise<void>;
39
- getEditorAdjustments: () => AdjustmentValues;
40
- }
41
- export declare function useHonchoEditorSingle({ controller, initImageId, firebaseUid }: UseHonchoEditorSingleOptions): {
42
- state: UseHonchoEditorSingleState;
43
- actions: UseHonchoEditorSingleActions;
44
- };
@@ -1,162 +0,0 @@
1
- 'use client';
2
- import { useCallback, useMemo } from 'react';
3
- import { useAdjustmentHistory } from '../useAdjustmentHistory';
4
- import { useGallerySwipe } from '../useGallerySwipe';
5
- import { usePreset } from '../usePreset';
6
- // Default adjustment values
7
- const initialAdjustments = {
8
- tempScore: 0, tintScore: 0, vibranceScore: 0, saturationScore: 0,
9
- exposureScore: 0, highlightsScore: 0, shadowsScore: 0, whitesScore: 0,
10
- blacksScore: 0, contrastScore: 0, clarityScore: 0, sharpnessScore: 0,
11
- };
12
- export function useHonchoEditorSingle({ controller, initImageId, firebaseUid }) {
13
- // Memoize parameters to prevent unnecessary re-renders
14
- const memoizedController = useMemo(() => controller, [controller]);
15
- const memoizedInitImageId = useMemo(() => initImageId, [initImageId]);
16
- const memoizedFirebaseUid = useMemo(() => firebaseUid, [firebaseUid]);
17
- // Initialize business logic hooks only
18
- const adjustmentHistory = useAdjustmentHistory(initialAdjustments, memoizedController, memoizedFirebaseUid, memoizedInitImageId);
19
- const gallerySwipe = useGallerySwipe(memoizedFirebaseUid, memoizedInitImageId, memoizedController);
20
- const presetHook = usePreset(memoizedController, memoizedFirebaseUid, { autoLoad: true });
21
- // Find active preset based on current adjustments
22
- const activePreset = presetHook.actions.findByAdjustments(adjustmentHistory.currentState);
23
- // Actions - pure business logic, no editor interaction - wrapped in useCallback to prevent re-renders
24
- const navigateNext = useCallback(() => {
25
- if (gallerySwipe.isNextAvailable) {
26
- gallerySwipe.onSwipeNext();
27
- }
28
- }, [gallerySwipe.isNextAvailable, gallerySwipe.onSwipeNext]);
29
- const navigatePrev = useCallback(() => {
30
- if (gallerySwipe.isPrevAvailable) {
31
- gallerySwipe.onSwipePrev();
32
- }
33
- }, [gallerySwipe.isPrevAvailable, gallerySwipe.onSwipePrev]);
34
- const updateAdjustment = useCallback((field, value) => {
35
- const newState = {
36
- ...adjustmentHistory.currentState,
37
- [field]: value
38
- };
39
- adjustmentHistory.actions.pushState(newState);
40
- }, [adjustmentHistory.currentState, adjustmentHistory.actions.pushState]);
41
- const setBatchMode = useCallback((enabled) => {
42
- adjustmentHistory.config.setBatchMode(enabled);
43
- }, [adjustmentHistory.config.setBatchMode]);
44
- const startBatchMode = useCallback(() => {
45
- adjustmentHistory.config.setBatchMode(true);
46
- }, [adjustmentHistory.config.setBatchMode]);
47
- const endBatchMode = useCallback(() => {
48
- adjustmentHistory.config.setBatchMode(false);
49
- }, [adjustmentHistory.config.setBatchMode]);
50
- const undo = useCallback(() => {
51
- adjustmentHistory.actions.undo();
52
- }, [adjustmentHistory.actions.undo]);
53
- const redo = useCallback(() => {
54
- adjustmentHistory.actions.redo();
55
- }, [adjustmentHistory.actions.redo]);
56
- const reset = useCallback(async () => {
57
- // Reset means setting all adjustments to 0 and adding it as new history entry
58
- // This allows users to undo the reset operation
59
- // Reset acts like normal adjustment - each reset creates a new history entry
60
- console.log('Resetting adjustments to 0 - adding to history and sending to backend');
61
- // First add reset to history (this creates local history entry)
62
- adjustmentHistory.actions.pushState(initialAdjustments);
63
- // Then sync to backend
64
- await adjustmentHistory.config.syncToBackend();
65
- }, [adjustmentHistory.actions.pushState, adjustmentHistory.config.syncToBackend]);
66
- const loadPresets = useCallback(async () => {
67
- await presetHook.actions.load();
68
- }, [presetHook.actions.load]);
69
- const applyPreset = useCallback(async (preset) => {
70
- console.log('Applying preset:', preset.name, '- saving to backend history');
71
- const adjustmentState = {
72
- tempScore: preset.temperature,
73
- tintScore: preset.tint,
74
- vibranceScore: preset.vibrance,
75
- saturationScore: preset.saturation,
76
- exposureScore: preset.exposure,
77
- highlightsScore: preset.highlights,
78
- shadowsScore: preset.shadows,
79
- whitesScore: preset.whites,
80
- blacksScore: preset.blacks,
81
- contrastScore: preset.contrast,
82
- clarityScore: preset.clarity,
83
- sharpnessScore: preset.sharpness,
84
- };
85
- // Apply preset directly and add to history
86
- adjustmentHistory.actions.pushState(adjustmentState);
87
- // Then sync to backend
88
- await adjustmentHistory.config.syncToBackend();
89
- }, [adjustmentHistory.actions.pushState, adjustmentHistory.config.syncToBackend]);
90
- const createPreset = useCallback(async (name, adjustments) => {
91
- return await presetHook.actions.create(name, adjustments);
92
- }, [presetHook.actions.create]);
93
- const renamePreset = useCallback(async (presetId, newName) => {
94
- return await presetHook.actions.rename(presetId, newName);
95
- }, [presetHook.actions.rename]);
96
- const deletePreset = useCallback(async (presetId) => {
97
- await presetHook.actions.delete(presetId);
98
- }, [presetHook.actions.delete]);
99
- const getEditorAdjustments = useCallback(() => {
100
- const adjustments = adjustmentHistory.currentState;
101
- return {
102
- temperature: adjustments.tempScore,
103
- tint: adjustments.tintScore,
104
- vibrance: adjustments.vibranceScore / 100,
105
- saturation: adjustments.saturationScore / 100,
106
- exposure: (adjustments.exposureScore / 100) * 3,
107
- highlights: adjustments.highlightsScore / 100,
108
- shadows: adjustments.shadowsScore / 100,
109
- whites: adjustments.whitesScore / 100,
110
- blacks: adjustments.blacksScore / 100,
111
- contrast: adjustments.contrastScore / 100,
112
- clarity: adjustments.clarityScore / 100,
113
- sharpness: adjustments.sharpnessScore / 100,
114
- };
115
- }, [adjustmentHistory.currentState]);
116
- const actions = {
117
- // Navigation
118
- navigateNext,
119
- navigatePrev,
120
- // Adjustments
121
- updateAdjustment,
122
- setBatchMode,
123
- startBatchMode,
124
- endBatchMode,
125
- // History
126
- undo,
127
- redo,
128
- reset,
129
- // Presets
130
- loadPresets,
131
- applyPreset,
132
- createPreset,
133
- renamePreset,
134
- deletePreset,
135
- // Adjustment conversion for editor
136
- getEditorAdjustments
137
- };
138
- // State - pure business state, no editor state
139
- const state = {
140
- // Image state
141
- currentImageData: gallerySwipe.currentImageData,
142
- isGalleryLoading: gallerySwipe.isLoading,
143
- galleryError: gallerySwipe.error,
144
- // Adjustment state
145
- currentAdjustments: adjustmentHistory.currentState,
146
- isBatchMode: adjustmentHistory.historyInfo.isBatchMode,
147
- canUndo: adjustmentHistory.historyInfo.canUndo,
148
- canRedo: adjustmentHistory.historyInfo.canRedo,
149
- // Navigation state
150
- isNextAvailable: gallerySwipe.isNextAvailable,
151
- isPrevAvailable: gallerySwipe.isPrevAvailable,
152
- // Preset state
153
- presets: presetHook.presets,
154
- activePreset: activePreset || null,
155
- presetsLoading: presetHook.info.isLoading,
156
- presetsError: presetHook.info.error,
157
- };
158
- return {
159
- state,
160
- actions
161
- };
162
- }