UNPKG

@razorpay/blade

Version:

The Design System that powers Razorpay

118 lines (106 loc) 5.5 kB
import { useMemo } from 'react'; import { isSamePreset } from './utils.js'; var usePresetState = function usePresetState(_ref) { var presets = _ref.presets, selectedPreset = _ref.selectedPreset, currentDate = _ref.currentDate, _ref$displayFormat = _ref.displayFormat, displayFormat = _ref$displayFormat === void 0 ? 'default' : _ref$displayFormat; return useMemo(function () { // No presets provided → return empty state if (!presets) { return { presetStates: [], selectedPresetIndex: null, selectedPresetLabel: null, isCustomSelected: false, effectiveSelectionType: null, // Default when no presets displayFormat: 'default' }; } // STEP 1: Calculate each preset's value and type // Example: "Last 7 days" → [2024-01-01, 2024-01-08], isCustomType: false // Example: "Custom" → [null, null], isCustomType: true var presetStates = presets.map(function (preset) { var _presetValue, _presetValue2; var presetValue = null; var isCustomType = false; presetValue = preset.value(currentDate); // Call function: "Last 7 days" → [startDate, endDate] // Check if preset returns valid dates (defined) or null (custom) isCustomType = !(((_presetValue = presetValue) === null || _presetValue === void 0 ? void 0 : _presetValue[0]) instanceof Date && ((_presetValue2 = presetValue) === null || _presetValue2 === void 0 ? void 0 : _presetValue2[1]) instanceof Date); return { preset: preset, // Original preset object { label: "Last 7 days", value: fn } value: presetValue, // Calculated dates [2024-01-01, 2024-01-08] or [null, null] isSelected: false, // ⏳ Will calculate this next isCustomType: isCustomType // true = Custom preset, false = Defined preset }; }); // STEP 2: Figure out which preset is currently selected // Example: User selected [2024-01-01, 2024-01-08] → matches "Last 7 days" preset var selectedPresetIndex = null; var isCustomSelected = false; if (!selectedPreset) { // No dates selected → find and select "Custom" preset by default selectedPresetIndex = presetStates.findIndex(function (state) { return state.isCustomType; }); isCustomSelected = selectedPresetIndex !== -1; } else { // User has selected dates → see if they match any defined preset // Example: selectedPreset = [2024-01-01, 2024-01-08], check if matches "Last 7 days" selectedPresetIndex = presetStates.findIndex(function (state) { return !state.isCustomType && isSamePreset(selectedPreset, state.value); }); if (selectedPresetIndex === -1) { // No match found → user made custom selection → select "Custom" preset selectedPresetIndex = presetStates.findIndex(function (state) { return state.isCustomType; }); isCustomSelected = true; } } // STEP 3: Mark the selected preset as selected if (selectedPresetIndex !== -1) { presetStates[selectedPresetIndex].isSelected = true; } // STEP 4: Get the label for display // Example: selectedPresetIndex = 0 → presetStates[0].preset.label = "Last 7 days" var selectedPresetLabel = selectedPresetIndex !== -1 ? presetStates[selectedPresetIndex].preset.label : null; // STEP 5: Calculate effective selection type based on selected preset // If preset returns same-day range (like "Today"), display as single date var effectiveSelectionType = 'range'; // Default to range if (selectedPresetIndex !== -1) { var _selectedPresetState$, _selectedPresetState$2; var selectedPresetState = presetStates[selectedPresetIndex]; // Check if selected preset represents same day (like "Today" preset) if ((_selectedPresetState$ = selectedPresetState.value) !== null && _selectedPresetState$ !== void 0 && _selectedPresetState$[0] && (_selectedPresetState$2 = selectedPresetState.value) !== null && _selectedPresetState$2 !== void 0 && _selectedPresetState$2[1] && selectedPresetState.value[0].toDateString() === selectedPresetState.value[1].toDateString()) { effectiveSelectionType = 'single'; // Same day = display as single } else { effectiveSelectionType = 'range'; // Different days = display as range } } // Based on the displayFormat prop // When displayFormat is 'compact', show only the preset label instead of dates var effectiveDisplayFormat = selectedPresetIndex !== -1 && displayFormat === 'compact' ? 'compact' : 'default'; // Return final calculated state - this gets shared with all components return { presetStates: presetStates, // Array: [{ preset, value, isSelected, isCustomType }, ...] selectedPresetIndex: selectedPresetIndex, // Number: 0, 1, 2... or null selectedPresetLabel: selectedPresetLabel, // String: "Last 7 days" or "Custom" or null isCustomSelected: isCustomSelected, // Boolean: true if custom dates selected effectiveSelectionType: effectiveSelectionType, // 'single' | 'range' based on preset analysis displayFormat: effectiveDisplayFormat // 'compact' | 'default' based on preset analysis }; }, [presets, selectedPreset, currentDate, displayFormat]); // Recalculate when any of these change }; export { usePresetState }; //# sourceMappingURL=usePresetState.js.map