feat: Enhance CategoryTabs and Marketplace components for better responsiveness and navigation feat: Refactor AgentCard and AgentGrid components for improved layout and accessibility feat: Implement animated category transitions in AgentMarketplace and update NewChat component layout feat: Refactor UI components for improved styling and accessibility in sharing dialogs refactor: remove GenericManagePermissionsDialog and GrantAccessDialog components - Deleted GenericManagePermissionsDialog and GrantAccessDialog components to streamline sharing functionality. - Updated ManagePermissionsDialog to utilize AccessRolesPicker directly. - Introduced UnifiedPeopleSearch for improved people selection experience. - Enhanced PublicSharingToggle with InfoHoverCard for better user guidance. - Adjusted AgentPanel to change error status to warning for duplicate agent versions. - Updated translations to include new keys for search and access management. feat: Add responsive design for SelectedPrincipalsList and improve layout in GenericGrantAccessDialog feat: Enhance styling in SelectedPrincipalsList and SearchPicker components for improved UI consistency feat: Improve PublicSharingToggle component with enhanced styling and accessibility features feat: Introduce InfoHoverCard component and refactor enums for better organization feat: Implement infinite scroll for agent grids and enhance performance - Added `useInfiniteScroll` hook to manage infinite scrolling behavior in agent grids. - Integrated infinite scroll functionality into `AgentGrid` and `VirtualizedAgentGrid` components. - Updated `AgentMarketplace` to pass the scroll container to the agent grid components. - Refactored loading indicators to show a spinner instead of a "Load More" button. - Created `VirtualizedAgentGrid` component for optimized rendering of agent cards using virtualization. - Added performance tests for `VirtualizedAgentGrid` to ensure efficient handling of large datasets. - Updated translations to include new messages for end-of-results scenarios. chore: Remove unused permission-related UI localization keys ci: Update Agent model tests to handle duplicate support_contact updates - Modified tests to ensure that updating an agent with the same support_contact does not create a new version and returns successfully. - Enhanced verification for partial changes in support_contact, confirming no new version is created when content remains the same. chore: Address ESLint, clean up unused imports and improve prop definitions in various components ci: fix tests ci: update tests chore: remove unused search localization keys
129 lines
4.2 KiB
TypeScript
129 lines
4.2 KiB
TypeScript
import React from 'react';
|
|
import { Label, InfoHoverCard, ESide } from '@librechat/client';
|
|
import { TranslationKeys, useLocalize } from '~/hooks';
|
|
|
|
interface AutoRefillSettingsProps {
|
|
lastRefill: Date;
|
|
refillAmount: number;
|
|
refillIntervalUnit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months';
|
|
refillIntervalValue: number;
|
|
}
|
|
|
|
/**
|
|
* Adds a time interval to a given date.
|
|
* @param {Date} date - The starting date.
|
|
* @param {number} value - The numeric value of the interval.
|
|
* @param {'seconds'|'minutes'|'hours'|'days'|'weeks'|'months'} unit - The unit of time.
|
|
* @returns {Date} A new Date representing the starting date plus the interval.
|
|
*/
|
|
const addIntervalToDate = (
|
|
date: Date,
|
|
value: number,
|
|
unit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months',
|
|
): Date => {
|
|
const result = new Date(date);
|
|
switch (unit) {
|
|
case 'seconds':
|
|
result.setSeconds(result.getSeconds() + value);
|
|
break;
|
|
case 'minutes':
|
|
result.setMinutes(result.getMinutes() + value);
|
|
break;
|
|
case 'hours':
|
|
result.setHours(result.getHours() + value);
|
|
break;
|
|
case 'days':
|
|
result.setDate(result.getDate() + value);
|
|
break;
|
|
case 'weeks':
|
|
result.setDate(result.getDate() + value * 7);
|
|
break;
|
|
case 'months':
|
|
result.setMonth(result.getMonth() + value);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return result;
|
|
};
|
|
|
|
const AutoRefillSettings: React.FC<AutoRefillSettingsProps> = ({
|
|
lastRefill,
|
|
refillAmount,
|
|
refillIntervalUnit,
|
|
refillIntervalValue,
|
|
}) => {
|
|
const localize = useLocalize();
|
|
|
|
const lastRefillDate = lastRefill ? new Date(lastRefill) : null;
|
|
const nextRefill = lastRefillDate
|
|
? addIntervalToDate(lastRefillDate, refillIntervalValue, refillIntervalUnit)
|
|
: null;
|
|
|
|
// Return the localized unit based on singular/plural values
|
|
const getLocalizedIntervalUnit = (
|
|
value: number,
|
|
unit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months',
|
|
): string => {
|
|
let key: TranslationKeys;
|
|
switch (unit) {
|
|
case 'seconds':
|
|
key = value === 1 ? 'com_nav_balance_second' : 'com_nav_balance_seconds';
|
|
break;
|
|
case 'minutes':
|
|
key = value === 1 ? 'com_nav_balance_minute' : 'com_nav_balance_minutes';
|
|
break;
|
|
case 'hours':
|
|
key = value === 1 ? 'com_nav_balance_hour' : 'com_nav_balance_hours';
|
|
break;
|
|
case 'days':
|
|
key = value === 1 ? 'com_nav_balance_day' : 'com_nav_balance_days';
|
|
break;
|
|
case 'weeks':
|
|
key = value === 1 ? 'com_nav_balance_week' : 'com_nav_balance_weeks';
|
|
break;
|
|
case 'months':
|
|
key = value === 1 ? 'com_nav_balance_month' : 'com_nav_balance_months';
|
|
break;
|
|
default:
|
|
key = 'com_nav_balance_seconds';
|
|
}
|
|
return localize(key);
|
|
};
|
|
|
|
return (
|
|
<div className="space-y-4">
|
|
<h3 className="text-lg font-medium">{localize('com_nav_balance_auto_refill_settings')}</h3>
|
|
<div className="mb-1 flex justify-between text-sm">
|
|
<span>{localize('com_nav_balance_last_refill')}</span>
|
|
<span>{lastRefillDate ? lastRefillDate.toLocaleString() : '-'}</span>
|
|
</div>
|
|
<div className="mb-1 flex justify-between text-sm">
|
|
<span>{localize('com_nav_balance_refill_amount')}</span>
|
|
<span>{refillAmount !== undefined ? refillAmount : '-'}</span>
|
|
</div>
|
|
<div className="mb-1 flex justify-between text-sm">
|
|
<span>{localize('com_nav_balance_interval')}</span>
|
|
<span>
|
|
{localize('com_nav_balance_every')} {refillIntervalValue}{' '}
|
|
{getLocalizedIntervalUnit(refillIntervalValue, refillIntervalUnit)}
|
|
</span>
|
|
</div>
|
|
<div className="flex items-center justify-between">
|
|
{/* Left Section: Label */}
|
|
<div className="flex items-center space-x-2">
|
|
<Label className="font-light">{localize('com_nav_balance_next_refill')}</Label>
|
|
<InfoHoverCard side={ESide.Bottom} text={localize('com_nav_balance_next_refill_info')} />
|
|
</div>
|
|
|
|
{/* Right Section: tokenCredits Value */}
|
|
<span className="text-sm font-medium text-gray-800 dark:text-gray-200" role="note">
|
|
{nextRefill ? nextRefill.toLocaleString() : '-'}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default AutoRefillSettings;
|