import React, { useCallback, useContext, useMemo } from 'react'; // @ts-ignore import cn from 'classnames'; import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core'; import { arrayMove, SortableContext, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy, } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import last from 'lodash/last'; import { DevTechnology } from '../technologies/technology'; import { TechnologiesPickerContext } from '../technologies_picker_context'; import { Card, Slider, Tooltip, Typography } from '../../index'; import { TrashIcon } from '../../assets/icons/trash'; import { MoveIcon } from '../../assets/icons/move'; const TechnologyRow = ({ id, item, onDelete: onRemove, onChange, itemsLength, technologyIndex, hideSlider, }: { id: string; item: DevTechnology; onDelete: (name: string) => void; onChange: (id: DevTechnology) => void; technologyIndex: number; itemsLength: number; hideSlider?: boolean; }) => { const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id }); const style = { transform: CSS.Transform.toString(transform), transition, }; const { technologies, translations } = useContext(TechnologiesPickerContext); const sliderChange = useCallback( (e: any) => { onChange({ ...item, value: Number(e.target.value) }); }, [item, onChange] ); const imgUrl = useMemo(() => { const matchingItem = technologies.find((techno) => techno.name === item.name); if (matchingItem?.handle) { return `https://process.filestackapi.com/auto_image/${matchingItem?.handle ?? '4A5N89okRPW50jRcmkuM'}`; } const handle = last(matchingItem?.url.split('/')); return `https://process.filestackapi.com/auto_image/${handle ?? '4A5N89okRPW50jRcmkuM'}`; }, [item, technologies]); let divider =
; return (
{technologyIndex + 1} {divider} {item.name}
{item.name} {!hideSlider && (
{item.value}%
)}
{divider}
); }; const SortableTechnologies = ({ items, onDelete, onItemChange, classes, className, itemsLength, onSortEnd, hideSlider, }: Props & { itemsLength: number; onSortEnd: (props: { newIndex: any; oldIndex: any }) => any; hideSlider?: boolean; }) => { const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }) ); const itemsWithId = useMemo(() => items.map((item) => ({ ...item, id: item.name })), [items]); const handleDragEnd = useCallback( (event: any) => { const { active, over } = event; if (active.id !== over.id) { const oldItem = items.find(({ name }) => name === active.id); const newItem = items.find(({ name }) => name === over.id); const oldIndex = oldItem && items.indexOf(oldItem); const newIndex = newItem && items.indexOf(newItem); return onSortEnd({ oldIndex, newIndex }); } }, [items] ); return (
{itemsWithId.map((item, index) => ( ))}
); }; interface Props { items: Array; onChange: (newArrayValue: Array) => void; onDelete: (id: string) => void; className?: string; onItemChange: (technology: DevTechnology) => void; classes?: { container?: string }; hideSlider?: boolean; } export const SelectedTechnologies: React.FC = ({ items, onChange, onDelete, className, onItemChange, classes = {}, hideSlider, }) => { const itemsLength = useMemo(() => items.length, [items]); const move = useCallback( ({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => { if (typeof onChange === 'function') { onChange(arrayMove(items, oldIndex, newIndex).map((data, index) => ({ ...data, index }))); } }, [items, onChange] ); return ( ); };