import React, { useState } from 'react' import { ChevronDown, ChevronRight } from 'lucide-react' import { getScopesByGroup } from '../../api/oauthScopes' import { useTranslation } from '../../i18n' interface Props { selected: string[] onChange: (scopes: string[]) => void } export default function ScopeGroupPicker({ selected, onChange }: Props): React.ReactElement { const { t } = useTranslation() const [open, setOpen] = useState>({}) const scopesByGroup = getScopesByGroup(t) const allScopeKeys = Object.values(scopesByGroup).flat().map(s => s.scope) const allSelected = allScopeKeys.every(s => selected.includes(s)) return (
{Object.entries(scopesByGroup).map(([group, groupScopes]) => { const groupScopeKeys = groupScopes.map(s => s.scope) const allGroupSelected = groupScopeKeys.every(s => selected.includes(s)) const someGroupSelected = groupScopeKeys.some(s => selected.includes(s)) return (
{ if (el) el.indeterminate = someGroupSelected && !allGroupSelected }} onChange={e => onChange( e.target.checked ? [...new Set([...selected, ...groupScopeKeys])] : selected.filter(s => !groupScopeKeys.includes(s)) )} className="rounded" title={allGroupSelected ? `Deselect all ${group}` : `Select all ${group}`} />
{open[group] && (
{groupScopes.map(({ scope, label, description }) => ( ))}
)}
) })}
) }