import { Meta, Story } from '@storybook/react';
import React, { CSSProperties, ReactElement, useState } from 'react';
import styled from 'styled-components';
import {
EditorMode,
IAnnotation,
OvalSelector,
PointSelector,
RectangleSelector,
RenderSelectedAnnotationIconsProps,
WrappedShapeProps,
} from './../../../index';
import Annotation, { AnnotationPropsOptional } from './../../Annotation';
import Oval from './../../Shapes/Oval';
import Point from './../../Shapes/Point';
import Rectangle from './../../Shapes/Rectangle';
import {
argTypes,
ovalAnnotations,
pointAnnotations,
rectangularAnnotations,
} from './../Common/AnnotationStoryTemplate';
import CheckSvg from './icons/check.svg';
import CheckWhite from './icons/check_white.svg';
import CloseSvg from './icons/close.svg';
const meta: Meta = {
title: 'Toolbar/AnnotationToolBarButtons',
component: Annotation,
argTypes,
parameters: {
controls: { expanded: true },
},
};
export default meta;
const StyledIcon = styled.a`
border-right: 1px solid #ccc;
width: 40px;
height: 40px;
background-repeat: no-repeat;
background-position: center;
cursor: pointer;
background-color: ${({ isSelected }: { isSelected: boolean }) =>
isSelected ? '#ccc' : '#efefef'};
svg {
background-color: white;
color: white;
}
`;
const CorrectDiv = styled.div`
align-items: center;
background-color: rgb(51, 88, 233);
border-radius: 50%;
color: white;
display: flex;
flex-shrink: 0;
font-size: 1em;
height: 36px;
justify-content: center;
padding: 0px 0px;
position: relative;
user-select: none;
width: 36px;
background-image: url(${CheckWhite});
background-repeat: no-repeat;
background-position: center;
`;
const CheckIcon = styled(StyledIcon)`
background-image: url(${CheckSvg});
`;
const CloseIcon = styled(StyledIcon)`
background-image: url(${CloseSvg});
`;
const renderShape = (props: WrappedShapeProps): ReactElement | null => {
const { annotation } = props;
const styles: CSSProperties = {};
if (annotation.data.isCorrectChoice) {
styles.display = 'flex';
styles.alignItems = 'center';
styles.justifyContent = 'center';
styles.backgroundColor = 'rgba(0, 0, 120, 0.2)';
}
switch (annotation.geometry.type) {
case RectangleSelector.TYPE:
return (
: null}
/>
);
case PointSelector.TYPE:
return (
: null}
/>
);
case OvalSelector.TYPE:
return (
: null}
/>
);
default:
return null;
}
};
function extracted(initData: IAnnotation[]) {
const annotationsWithChoices: IAnnotation[] = [...initData];
const poppedElement = annotationsWithChoices.pop()!;
const correctChoice = {
...poppedElement,
data: {
...poppedElement.data,
isCorrectChoice: true,
},
};
const AnnotationStory: Story = (args) => {
const [annotations, setAnnotations] = useState([
...annotationsWithChoices,
correctChoice,
]);
const updateSelectedAnnotation = (
selectedAnnotation: IAnnotation,
isCorrectChoice: boolean
) => {
const updated = annotations.map((annotation: IAnnotation) => ({
...annotation,
data: {
...annotation.data,
isCorrectChoice:
annotation.data.id === selectedAnnotation.data.id
? isCorrectChoice
: !!annotation.data.isCorrectChoice,
},
}));
setAnnotations(updated);
};
const renderSelectedAnnotationIcons = ({
annotation: selectedAnnotation,
}: RenderSelectedAnnotationIconsProps) => {
const markAsCorrectChoice = () =>
updateSelectedAnnotation(selectedAnnotation, true);
const markAsWrongChoice = () =>
updateSelectedAnnotation(selectedAnnotation, false);
return (
<>
markAsCorrectChoice()} />
markAsWrongChoice()} />
>
);
};
return (
);
};
return AnnotationStory;
}
export const OvalAnnotation = extracted(ovalAnnotations);
OvalAnnotation.args = {
editorMode: EditorMode.AnnotateOnly,
renderShape: renderShape,
};
export const RectangleAnnotation = extracted(rectangularAnnotations);
RectangleAnnotation.args = {
editorMode: EditorMode.AnnotateOnly,
renderShape: renderShape,
};
export const PointAnnotation = extracted(pointAnnotations);
PointAnnotation.args = {
editorMode: EditorMode.AnnotateOnly,
renderShape: renderShape,
};