import { type TFunction } from 'i18next' import { type StatusBadgeProps } from '@/components/status-badge' // ============================================================================ // Redemption Status Configuration // ============================================================================ export const REDEMPTION_STATUS = { ENABLED: 1, DISABLED: 2, USED: 3, } as const export const REDEMPTION_STATUS_VALUES = Object.values(REDEMPTION_STATUS).map( (value) => String(value) ) as `${number}`[] // labelKey values are i18n keys; use t(config.labelKey) in components export const REDEMPTION_STATUSES: Record< number, Pick & { labelKey: string value: number } > = { [REDEMPTION_STATUS.ENABLED]: { labelKey: 'Unused', variant: 'success', value: REDEMPTION_STATUS.ENABLED, showDot: true, }, [REDEMPTION_STATUS.DISABLED]: { labelKey: 'Disabled', variant: 'neutral', value: REDEMPTION_STATUS.DISABLED, showDot: true, }, [REDEMPTION_STATUS.USED]: { labelKey: 'Used', variant: 'neutral', value: REDEMPTION_STATUS.USED, showDot: true, }, } as const // Virtual status filter value for expired redemption codes // Note: "Expired" is not a real DB status, it's computed from expired_time export const REDEMPTION_FILTER_EXPIRED = 'expired' export function getRedemptionStatusOptions(t: TFunction) { return [ ...Object.values(REDEMPTION_STATUSES).map((config) => ({ label: t(config.labelKey), value: String(config.value), })), { label: t('Expired'), value: REDEMPTION_FILTER_EXPIRED, }, ] } // ============================================================================ // Validation Constants // ============================================================================ export const REDEMPTION_VALIDATION = { NAME_MIN_LENGTH: 1, NAME_MAX_LENGTH: 20, COUNT_MIN: 1, COUNT_MAX: 100, } as const // ============================================================================ // Error Messages // ============================================================================ // i18n keys; use t(ERROR_MESSAGES.xxx) when displaying. For form schema with interpolation use getRedemptionFormErrorMessages(t). export const ERROR_MESSAGES = { UNEXPECTED: 'An unexpected error occurred', LOAD_FAILED: 'Failed to load redemption codes', SEARCH_FAILED: 'Failed to search redemption codes', CREATE_FAILED: 'Failed to create redemption code', UPDATE_FAILED: 'Failed to update redemption code', DELETE_FAILED: 'Failed to delete redemption code', DELETE_INVALID_FAILED: 'Failed to delete invalid redemption codes', STATUS_UPDATE_FAILED: 'Failed to update redemption code status', NAME_LENGTH_INVALID: 'Name must be between {{min}} and {{max}} characters', COUNT_INVALID: 'Count must be between {{min}} and {{max}}', EXPIRED_TIME_INVALID: 'Expired time cannot be earlier than current time', } as const /** For form schema only: returns translated messages with interpolation. */ export function getRedemptionFormErrorMessages(t: TFunction) { return { NAME_LENGTH_INVALID: t(ERROR_MESSAGES.NAME_LENGTH_INVALID, { min: REDEMPTION_VALIDATION.NAME_MIN_LENGTH, max: REDEMPTION_VALIDATION.NAME_MAX_LENGTH, }), COUNT_INVALID: t(ERROR_MESSAGES.COUNT_INVALID, { min: REDEMPTION_VALIDATION.COUNT_MIN, max: REDEMPTION_VALIDATION.COUNT_MAX, }), EXPIRED_TIME_INVALID: t(ERROR_MESSAGES.EXPIRED_TIME_INVALID), } as const } // ============================================================================ // Success Messages (i18n keys; use t(SUCCESS_MESSAGES.xxx) when displaying) // ============================================================================ export const SUCCESS_MESSAGES = { REDEMPTION_CREATED: 'Redemption code(s) created successfully', REDEMPTION_UPDATED: 'Redemption code updated successfully', REDEMPTION_DELETED: 'Redemption code deleted successfully', REDEMPTION_ENABLED: 'Redemption code enabled successfully', REDEMPTION_DISABLED: 'Redemption code disabled successfully', COPY_SUCCESS: 'Copied to clipboard', } as const