oxios 1.5.2

Oxios Agent OS — Agent Operating System powered by oxi-sdk
import { X } from 'lucide-react'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'

interface Props {
  value: number[]
  onChange: (value: number[]) => void
}

export function ReminderEditor({ value, onChange }: Props) {
  const { t } = useTranslation()

  const PRESETS = [
    { label: t('calendar.reminder5min'), minutes: 5 },
    { label: t('calendar.reminder15min'), minutes: 15 },
    { label: t('calendar.reminder30min'), minutes: 30 },
    { label: t('calendar.reminder1hour'), minutes: 60 },
    { label: t('calendar.reminder1day'), minutes: 1440 },
  ]

  function formatReminder(minutes: number): string {
    if (minutes < 60) return `${minutes}${t('calendar.minutesBefore')}`
    if (minutes < 1440) return `${Math.floor(minutes / 60)}${t('calendar.hoursBefore')}`
    return `${Math.floor(minutes / 1440)}${t('calendar.daysBefore')}`
  }

  const [customMinutes, setCustomMinutes] = useState<number>(10)

  const addReminder = (minutes: number) => {
    if (!value.includes(minutes)) {
      onChange([...value, minutes].sort((a, b) => a - b))
    }
  }

  const removeReminder = (minutes: number) => {
    onChange(value.filter((m) => m !== minutes))
  }

  return (
    <div className="space-y-3">
      {/* Existing reminders */}
      {value.length > 0 && (
        <div className="flex flex-wrap gap-2">
          {value.map((minutes) => (
            <Badge key={minutes} variant="secondary" className="cursor-pointer gap-1 pr-1">
              {formatReminder(minutes)}
              <button
                type="button"
                onClick={() => removeReminder(minutes)}
                className="ml-1 rounded-full p-0.5 hover:bg-muted-foreground/20"
              >
                <X className="h-3 w-3" />
              </button>
            </Badge>
          ))}
        </div>
      )}

      {/* Preset buttons */}
      <div className="flex flex-wrap gap-2">
        {PRESETS.map(({ label, minutes }) => (
          <Button
            key={minutes}
            type="button"
            variant={value.includes(minutes) ? 'default' : 'outline'}
            size="sm"
            onClick={() =>
              value.includes(minutes) ? removeReminder(minutes) : addReminder(minutes)
            }
          >
            {label}
          </Button>
        ))}
      </div>

      {/* Custom input */}
      <div className="flex items-center gap-2">
        <Input
          type="number"
          min={1}
          max={10080}
          value={customMinutes}
          onChange={(e) => setCustomMinutes(Math.max(1, Number(e.target.value)))}
          className="w-20"
        />
        <span className="text-sm text-muted-foreground">{t('calendar.minutesBefore')}</span>
        <Button
          type="button"
          variant="outline"
          size="sm"
          onClick={() => addReminder(customMinutes)}
          disabled={value.includes(customMinutes)}
        >
          {t('calendar.add')}
        </Button>
      </div>
    </div>
  )
}