You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.7 KiB
84 lines
2.7 KiB
import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' |
|
import { useNostr } from '@/providers/NostrProvider' |
|
import { |
|
closestCenter, |
|
DndContext, |
|
DragEndEvent, |
|
KeyboardSensor, |
|
PointerSensor, |
|
useSensor, |
|
useSensors |
|
} from '@dnd-kit/core' |
|
import { restrictToParentElement, restrictToVerticalAxis } from '@dnd-kit/modifiers' |
|
import { |
|
arrayMove, |
|
SortableContext, |
|
sortableKeyboardCoordinates, |
|
verticalListSortingStrategy |
|
} from '@dnd-kit/sortable' |
|
import { ensureTrendingInFavoriteRelayList } from '@/lib/wisp-trending-relay' |
|
import { useMemo } from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import RelayItem from './RelayItem' |
|
|
|
export default function FavoriteRelayList() { |
|
const { t } = useTranslation() |
|
const { pubkey } = useNostr() |
|
const { favoriteRelays, blockedRelays, reorderFavoriteRelays, favoriteRelaysFromPublishedList } = |
|
useFavoriteRelays() |
|
|
|
const displayRelays = useMemo( |
|
() => ensureTrendingInFavoriteRelayList(favoriteRelays), |
|
[favoriteRelays] |
|
) |
|
|
|
const sensors = useSensors( |
|
useSensor(PointerSensor), |
|
useSensor(KeyboardSensor, { |
|
coordinateGetter: sortableKeyboardCoordinates |
|
}) |
|
) |
|
|
|
const handleDragEnd = (event: DragEndEvent) => { |
|
const { active, over } = event |
|
|
|
if (over && active.id !== over.id) { |
|
const oldIndex = favoriteRelays.findIndex((relay) => relay === active.id) |
|
const newIndex = favoriteRelays.findIndex((relay) => relay === over.id) |
|
|
|
const reorderedRelays = arrayMove(favoriteRelays, oldIndex, newIndex) |
|
reorderFavoriteRelays(reorderedRelays) |
|
} |
|
} |
|
|
|
return ( |
|
<div className="space-y-2"> |
|
<div className="text-muted-foreground font-semibold select-none">{t('Relays')}</div> |
|
{!!pubkey && !favoriteRelaysFromPublishedList && ( |
|
<p |
|
className="rounded-md border border-amber-500/35 bg-amber-500/10 px-3 py-2 text-sm text-foreground" |
|
role="status" |
|
> |
|
{t('favoriteRelaysDefaultsBanner', { |
|
defaultValue: |
|
'No favorite-relays list (kind 10012) is loaded for this account yet. The relays below are app defaults and local relay sets, not a published list from your relays.' |
|
})} |
|
</p> |
|
)} |
|
<DndContext |
|
sensors={sensors} |
|
collisionDetection={closestCenter} |
|
onDragEnd={handleDragEnd} |
|
modifiers={[restrictToVerticalAxis, restrictToParentElement]} |
|
> |
|
<SortableContext items={displayRelays} strategy={verticalListSortingStrategy}> |
|
<div className="grid min-w-0 gap-2"> |
|
{displayRelays.map((relay) => ( |
|
<RelayItem key={relay} relay={relay} isBlocked={blockedRelays.includes(relay)} /> |
|
))} |
|
</div> |
|
</SortableContext> |
|
</DndContext> |
|
</div> |
|
) |
|
}
|
|
|