{"version":3,"sources":["webpack:///./app/react/packages/flashcards/services/flashcardSets/flashcardSets.js","webpack:///./app/react/packages/flashcards/services/flashcardSets/sharedFlashcardSets.js","webpack:///./app/react/packages/flashcards/services/flashcardSets/index.js","webpack:///./app/react/packages/flashcards/UserFlashcard.js","webpack:///./app/react/packages/flashcards/UserFlashcardDragOverlay.js","webpack:///./app/react/packages/flashcards/manage/ManageFlashcards.js","webpack:///./app/react/packages/flashcards/hooks/useFlashcardSelection.js","webpack:///./app/react/packages/flashcards/StyledDialogContent.js","webpack:///./app/react/packages/flashcards/manage/ManageFlashcardsDialog.js","webpack:///./app/react/packages/flashcards/services/flashcardPrintServices.js","webpack:///./app/react/packages/flashcards/print/PrintFlashcardsDialog.js","webpack:///./app/react/packages/flashcards/display/DisplayFlashcard.js","webpack:///./app/react/packages/flashcards/display/DisplayFlashcardInstructions.js","webpack:///./app/react/packages/flashcards/display/DisplayFlashcardDemos.js","webpack:///./app/react/packages/flashcards/propTypes.js","webpack:///./app/react/packages/flashcards/services/getCurrentUser.js","webpack:///./app/react/packages/flashcards/save/SaveToSetsDialog.js","webpack:///./app/react/packages/flashcards/hooks/useFlashcardSets.js","webpack:///./app/react/packages/flashcards/services/flashcardSets/studentFlashcardSets.js"],"names":["url","getFlashcardSets","xhr","method","createFlashcardSet","name","description","data","flashcard_set","updateFlashcardSet","id","deleteFlashcardSet","duplicateFlashcardSet","createUserFlashcards","setIds","flashcards","Promise","all","map","setId","user_flashcards","fc","image_title","userTitle","title","flashcard_id","getSharedFlashcardSets","createSharedFlashcardSet","flashcard_set_id","flashcardSetId","flashcard_category_id","flashcardCategoryId","teacher_id","teacherId","yumi_class_id","classId","studentIds","student_ids","note","deleteSharedFlashcardSet","sharedSetId","flashcardSets","sharedFlashcardSets","CircularButton","styled","button","props","theme","radii","circular","colors","gray150","black","blue500","white","Checkbox","disabled","as","cursor","display","UserFlashcard","mode","onRemove","onRename","thumbnail","selectable","selected","onSelectionChange","useSortable","attributes","isDragging","listeners","setNodeRef","transform","transition","dragStyle","touchAction","CSS","Transform","toString","audioNode","useRef","ttsData","useTextToSpeech","useState","canPlayThrough","setCanPlayThrough","isWaiting","setIsWaiting","useEffect","checkIfIOS","workingTitle","setWorkingTitle","removalPending","setRemovalPending","ref","style","bg","borderRadius","p","position","opacity","top","right","small","checked","onChange","value","weight","icon","pr","height","width","mx","src","alt","flexDirection","alignItems","py","textAlign","fontWeight","onCanPlayThrough","onPlaying","onWaiting","preload","audio_url","onClick","current","play","fontSize","left","rows","placeholder","maxLength","e","target","onBlur","color","length","justifyContent","propTypes","PropTypes","number","isRequired","modePropType","func","string","bool","UserFlashcardDragOverlay","forwardRef","boxShadow","zIndex","ManageFlashcards","deleteAllAction","onReorder","onCopy","setMode","activeId","setActiveId","activeFlashcard","selection","setSelection","checkSelection","state","Boolean","refreshSelectionWith","useCallback","prev","reduce","acc","toggleSelection","useFlashcardSelection","sensors","useSensors","useSensor","KeyboardSensor","coordinateGetter","sortableKeyboardCoordinates","MouseSensor","activationConstraint","distance","TouchSensor","delay","tolerance","doneReorderingRef","focus","selectionSize","useMemo","Object","values","count","v","useFlashcardSelectionSize","copyEnabled","px","FlashcardsDigital","my","mb","measure","href","secondary","mt","ml","pl","result","filter","flashcard","userFlashcard","flashcardId","collisionDetection","closestCenter","onDragStart","dragEvent","active","onDragCancel","onDragEnd","over","oldIndex","newIndex","items","strategy","rectSortingStrategy","gridAutoRows","gridTemplateColumns","gridGap","WebkitUserSelect","createPortal","document","body","defaultProps","node","flashcardsPropType","StyledDialogContent","Dialog","Content","gray100","media","md","lg","xl","ManageFlashcardsDialog","onClose","onOpenChange","onPrimaryAction","onPrint","open","primaryActionLabel","Root","Portal","Overlay","pb","Close","pt","getFlashcardPdf","response","Error","PrintOptionsGrid","Box","attrs","space","PrintOption","Text","PrintOptionImage","backgroundColor","border","size","img","layouts","fonts","PrintFlashcardsDialog","layout","setLayout","font","setFont","setColor","perPage","setPerPage","pdfId","setPdfId","pdfUrl","setPdfUrl","printMutation","useMutation","image","imageGrayscale","per_page","postFlashcardPdf","onSuccess","pdfIsGenerating","useQuery","enabled","retry","retryDelay","isLoading","window","type","ImageOnly","ImageAndText","BackToBack","TextOnly","OpenSans","Quicksand","Color","BlackAndWhite","TwoPerPage","FourPerPage","EightPerPage","SixteenPerPage","mutate","asChild","onEscapeKeyDown","preventDefault","onInteractOutside","onPointerDownOutside","bottom","maxWidth","arrayOf","object","variants","hide","scale","show","stiffness","damping","mass","MotionHeading","motion","Heading","flashcardSizes","Flashcard","initialState","presentationMode","useMachine","Machine","initial","states","on","imageClicked","imageAndTitle","titleClicked","send","textSize","matches","AnimatePresence","animate","exit","role","maxHeight","backgroundImage","backgroundRepeat","backgroundSize","oneOf","FlashcardInstructions","FlashcardUsage","DemoBox","borderColor","DemoImage","DemoImageText","DemoText","DemoOpenSans","DemoQuicksand","shape","sharedFlashcardSetPropType","flashcardSet","flashcardCount","flashcardCategory","teacher","firstName","lastName","teacherName","avatarUrl","yumiClass","getCurrentUser","getWithXHR","SAVE_MODES","copy","save","paste","translations","past","progressive","SaveToSetsDialog","onSaved","exclude","translation","addToast","useToast","useFlashcardSets","flashcardSetsLoading","refetchFlashcardSets","refetch","newSets","setNewSets","namingNewSet","setNamingNewSet","newSetInput","createSetMutation","services","newSet","newFlashcardSet","sets","renameSetMutation","renamedSet","setsSelection","setSetsSelection","toggleSetSelection","includes","savePending","setSavePending","saveErrored","setSaveErrored","handleSaveFlashcards","capitalCase","content","timeout","action","mr","StyledContent","StyledTitle","overflow","set","flexShrink","adaptive","defaultValue","autoComplete","onFocus","select","onKeyDown","keyCode","trunclipse","FourFlashcards","flex","responseWithoutExcludedSets","excludedIds","then","getStudentFlashcardSets","markSharedFlashcardSetOpened"],"mappings":"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","file":"package-flashcards.df3597b442223679959b.chunk.js","sourcesContent":["import xhr from 'Common/utils/xhr'\n\nconst url = `/api/v1/flashcard_sets`\n\nfunction getFlashcardSets() {\n return xhr({\n url,\n method: 'GET',\n })\n}\n\n/**\n * Create a new flashcard set\n * @param {object} config\n * @param {string} [config.name = null] - The name of the new set; endpoint returns 'Untitled Flashcard Set' by default\n * @param {string} [config.description = null] - The set description; endpoint returns null by default\n */\nfunction createFlashcardSet({ name = null, description = null } = {}) {\n return xhr({\n url,\n method: 'POST',\n data: {\n flashcard_set: {\n name,\n description,\n },\n },\n })\n}\n\nfunction updateFlashcardSet({ name, description, id } = {}) {\n return xhr({\n url: `${url}/${id}`,\n method: 'PUT',\n data: {\n flashcard_set: {\n name,\n description,\n },\n },\n })\n}\n\nfunction deleteFlashcardSet({ id }) {\n return xhr({\n url: `${url}/${id}`,\n method: 'DELETE',\n })\n}\n\nfunction duplicateFlashcardSet({ id } = {}) {\n return xhr({\n url: `${url}/${id}/copy`,\n method: 'POST',\n })\n}\n\n/**\n * Save a given set of flashcards to one or more flashcard sets\n * @param {object} config\n * @param {number[]} config.setIds - array of user's flashcard set IDs to save the flashcards to\n * @param {object[]} config.flashcards - array of the flashcards to save to indicated sets\n * @param {string} config.flashcards[].title - the default title of the flashcard\n * @param {string} [config.flashcards[].userTitle] - user's custom title for the flashcard\n * @param {number} config.flashcards[].id - the flashcard's id\n */\nfunction createUserFlashcards({ setIds, flashcards }) {\n return Promise.all(\n setIds.map(setId =>\n xhr({\n url: `${url}/${setId}/user_flashcards`,\n method: 'POST',\n data: {\n user_flashcards: flashcards.map(fc => ({\n image_title: fc.userTitle || fc.title,\n flashcard_id: fc.id,\n })),\n },\n })\n )\n )\n}\n\nexport default {\n getFlashcardSets,\n createFlashcardSet,\n updateFlashcardSet,\n deleteFlashcardSet,\n duplicateFlashcardSet,\n createUserFlashcards,\n}\n","/*\n * Services for working with a teacher's shared flashcard sets\n */\n\nimport xhr from 'Common/utils/xhr'\n\nconst url = `/api/v1/shared_flashcard_sets`\n\nfunction getSharedFlashcardSets() {\n return xhr({\n url,\n method: 'GET',\n })\n}\n\n/**\n *\n * @param {object} config\n * @param {number} config.flashcardSetId - ID of the flashcard set to share\n * @param {number} config.flashcardCategoryId - ID of the flashcard category to share\n * @param {number} config.teacherId - ID of the teacher the flashcard set belongs to\n * @param {number} [config.classId] - ID of the teacher's class to share to\n * @param {number[]} [config.studentIds = null] - IDs of the class students to share to, if not sharing to whole class\n * @param {string} [config.note = ''] - The note included with the share, if any\n */\nfunction createSharedFlashcardSet({\n flashcardSetId: flashcard_set_id, // eslint-disable-line camelcase\n flashcardCategoryId: flashcard_category_id, // eslint-disable-line camelcase\n teacherId: teacher_id, // eslint-disable-line camelcase\n classId: yumi_class_id, // eslint-disable-line camelcase\n studentIds: student_ids = null,\n note = '',\n} = {}) {\n return xhr({\n url,\n method: 'POST',\n data: {\n flashcard_set_id,\n flashcard_category_id,\n teacher_id,\n yumi_class_id,\n student_ids,\n note,\n },\n })\n}\n\n/**\n *\n * @param {number} sharedSetId - the ID of the *shared* flashcard set to delete\n */\nfunction deleteSharedFlashcardSet(sharedSetId) {\n return xhr({\n url: `${url}/${sharedSetId}`,\n method: 'DELETE',\n })\n}\n\nexport default {\n getSharedFlashcardSets,\n createSharedFlashcardSet,\n deleteSharedFlashcardSet,\n}\n","import flashcardSets from './flashcardSets'\nimport sharedFlashcardSets from './sharedFlashcardSets'\n\nexport default {\n ...flashcardSets,\n ...sharedFlashcardSets,\n}\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { CSS } from '@dnd-kit/utilities'\nimport { useEffect, useRef, useState } from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\n\nimport {\n Box,\n Icon,\n Image,\n LoadingSpinner,\n Text,\n Textarea,\n checkIfIOS,\n CheckboxControl,\n} from '@redriverpress/system'\n\nimport { useTextToSpeech } from 'Packages/tts'\n\nimport { modePropType } from './propTypes'\n\nconst titleMaxLength = 80\n\nconst CircularButton = styled.button`\n appearance: none;\n border: none;\n border-radius: ${props => props.theme.radii.circular};\n background: ${props => props.theme.colors.gray150};\n color: ${props => props.theme.colors.black};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 2rem;\n width: 2rem;\n padding: 0;\n\n &:hover,\n &:focus {\n background: ${props => props.theme.colors.blue500};\n color: ${props => props.theme.colors.white};\n }\n\n &:focus {\n outline: none;\n box-shadow: 0 0 0 2px ${props => props.theme.colors.white},\n 0 0 0 4px ${props => props.theme.colors.blue500};\n }\n`\n\n/** @redriverpress/system checkbox requires a label, we don't. */\nfunction Checkbox({ disabled, ...props }) {\n return (\n \n \n \n )\n}\n\nexport default function UserFlashcard({\n id,\n mode,\n onRemove,\n onRename,\n thumbnail,\n title,\n userTitle,\n selectable,\n selected,\n onSelectionChange,\n}) {\n const {\n attributes,\n isDragging,\n listeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({ id, disabled: mode !== 'reorder' })\n\n let cursor = 'auto'\n if (mode === 'reorder') cursor = isDragging ? 'grabbing' : 'grab'\n\n const dragStyle = {\n cursor,\n // https://docs.dndkit.com/api-documentation/sensors/touch#recommendations\n touchAction: isDragging ? 'manipulation' : 'auto',\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n const audioNode = useRef(null)\n const { data: ttsData } = useTextToSpeech(userTitle)\n\n // See implementation notes in SimpleAudio.js\n const [canPlayThrough, setCanPlayThrough] = useState(false)\n const [isWaiting, setIsWaiting] = useState(false)\n\n useEffect(() => {\n setCanPlayThrough(checkIfIOS())\n }, [])\n\n // The working title is a working copy of the userTitle.\n // We need this in a state hook so we don't trigger a component rerender for every keypress on the textarea.\n const [workingTitle, setWorkingTitle] = useState(userTitle)\n\n // Update the userTitle when the textarea blurs\n const handleBlur = e => {\n if (e.target.value === '') {\n // If the working title is erased, reset it (and the userTitle) to the flashcard's default title\n setWorkingTitle(title)\n onRename({ id, value: title })\n } else {\n // Otherwise, set the userTitle to whatever the working title is\n onRename({ id, value: workingTitle })\n }\n }\n\n const [removalPending, setRemovalPending] = useState(false)\n const handleRemoval = () => {\n setRemovalPending(true)\n onRemove(id)\n }\n\n return (\n \n {mode === 'edit' && selectable && (\n \n onSelectionChange(id)}\n value={id}\n />\n \n )}\n {mode === 'reorder' && (\n \n \n \n \n )}\n \n {(mode === 'default' || mode === 'reorder') && (\n \n \n {userTitle}\n \n {mode === 'default' && (\n <>\n setCanPlayThrough(true)}\n onPlaying={() => setIsWaiting(false)}\n onWaiting={() => setIsWaiting(true)}\n preload='auto'\n ref={audioNode}\n src={ttsData?.audio_url}\n />\n audioNode.current.play()}\n >\n {ttsData?.audio_url && canPlayThrough && !isWaiting ? (\n \n ) : (\n \n )}\n \n \n )}\n \n )}\n\n {mode === 'edit' && (\n <>\n setWorkingTitle(e.target.value)}\n onBlur={handleBlur}\n disabled={removalPending}\n />\n \n {workingTitle.length}/{titleMaxLength}\n \n \n \n {removalPending ? : }\n \n \n \n )}\n \n )\n}\n\nUserFlashcard.propTypes = {\n id: PropTypes.number.isRequired,\n mode: modePropType.isRequired,\n onRemove: PropTypes.func.isRequired,\n onRename: PropTypes.func.isRequired,\n thumbnail: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n userTitle: PropTypes.string.isRequired,\n selectable: PropTypes.bool.isRequired,\n selected: PropTypes.bool.isRequired,\n onSelectionChange: PropTypes.func.isRequired,\n}\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport PropTypes from 'prop-types'\nimport { forwardRef } from 'react'\n\nimport { Box, Icon, Image, Text } from '@redriverpress/system'\n\nconst UserFlashcardDragOverlay = forwardRef(({ thumbnail, userTitle }, ref) => (\n \n \n \n \n \n \n \n \n {userTitle}\n \n \n \n))\n\nUserFlashcardDragOverlay.propTypes = {\n thumbnail: PropTypes.string.isRequired,\n userTitle: PropTypes.string.isRequired,\n}\n\nexport default UserFlashcardDragOverlay\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { createPortal } from 'react-dom'\nimport {\n DndContext,\n DragOverlay,\n closestCenter,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { useEffect, useRef, useState } from 'react'\n\nimport FlashcardsDigital from 'Images/flashcards_digital.svg'\nimport {\n Box,\n Button,\n Columns,\n Col,\n Icon,\n Heading,\n Image,\n Text,\n TransparentButton,\n} from '@redriverpress/system'\n\nimport UserFlashcard from '../UserFlashcard'\nimport UserFlashcardDragOverlay from '../UserFlashcardDragOverlay'\nimport { flashcardsPropType } from '../propTypes'\nimport {\n useFlashcardSelection,\n useFlashcardSelectionSize,\n} from '../hooks/useFlashcardSelection'\n\nexport default function ManageFlashcards({\n deleteAllAction,\n flashcards,\n onRemove,\n onRename,\n onReorder,\n onCopy,\n}) {\n const [mode, setMode] = useState('default')\n\n const [activeId, setActiveId] = useState(null)\n const activeFlashcard = R.find(R.propEq('id', activeId), flashcards)\n const {\n selection,\n checkSelection,\n refreshSelectionWith,\n toggleSelection,\n } = useFlashcardSelection()\n\n const sensors = useSensors(\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n useSensor(MouseSensor, {\n activationConstraint: {\n distance: 10,\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 250,\n tolerance: 5,\n },\n })\n )\n\n const onDragStart = dragEvent => {\n setActiveId(dragEvent.active.id)\n }\n\n const onDragCancel = () => {\n setActiveId(null)\n }\n\n const onDragEnd = dragEvent => {\n const { active, over } = dragEvent\n\n if (active.id !== over.id) {\n const oldIndex = R.findIndex(R.propEq('id', active.id), flashcards)\n const newIndex = R.findIndex(R.propEq('id', over.id), flashcards)\n\n onReorder({ flashcards, oldIndex, newIndex, flashcardId: activeId })\n }\n\n setActiveId(null)\n }\n\n const doneReorderingRef = useRef()\n\n useEffect(() => {\n // Keyboard accessibility assistance\n mode === 'reorder' && doneReorderingRef.current.focus()\n }, [mode])\n\n const selectionSize = useFlashcardSelectionSize(selection)\n\n useEffect(() => {\n // Reset selection when flashcards change. For example, remove from selection deleted flashcards.\n refreshSelectionWith(flashcards)\n }, [flashcards, refreshSelectionWith])\n\n const handleCopySelection = () => {\n // Must override id with flashcardId. We must send Flashcards to the event, not UserFlashcards\n const userFlashcardToFlashcard = userFlashcard => {\n const { flashcardId, userTitle, ...rest } = userFlashcard\n\n return {\n ...rest,\n id: flashcardId,\n }\n }\n\n const result = flashcards\n .filter(flashcard => checkSelection(selection, flashcard.id))\n .map(userFlashcardToFlashcard)\n\n onCopy(result)\n }\n\n const copyEnabled = Boolean(onCopy)\n\n return flashcards.length === 0 ? (\n \n \n \n \n This flashcard set is empty!\n \n \n Browse our flashcards section and select flashcards to curate a\n custom set.\n \n \n \n Explore Flashcards\n \n \n ) : (\n \n {mode === 'default' && (\n \n \n setMode('edit')}\n >\n \n Edit\n \n \n \n setMode('reorder')}\n >\n \n Reorder\n \n \n {deleteAllAction && (\n \n {deleteAllAction}\n \n )}\n \n )}\n\n {mode === 'edit' && (\n \n \n \n \n \n\n {copyEnabled && (\n \n \n \n Copy Selection\n \n \n )}\n \n \n )}\n\n {mode === 'reorder' && (\n setMode('default')}\n ref={doneReorderingRef}\n >\n \n Done Reordering\n \n )}\n\n \n \n \n {flashcards.map(fc => (\n \n ))}\n \n \n {/*\n * DragOverlay needs to be portalled in order to sync with cursor when it\n * moves to the bounds of the scrolling parent (in this case, the Dialog).\n */}\n {createPortal(\n \n {activeId ? (\n \n ) : null}\n ,\n document.body\n )}\n \n \n )\n}\n\nManageFlashcards.defaultProps = {\n deleteAllAction: null,\n}\n\nManageFlashcards.propTypes = {\n deleteAllAction: PropTypes.node,\n flashcards: flashcardsPropType.isRequired,\n onRemove: PropTypes.func.isRequired,\n onRename: PropTypes.func.isRequired,\n onReorder: PropTypes.func.isRequired,\n onCopy: PropTypes.func.isRequired,\n}\n","import { useState, useCallback, useMemo } from 'react'\n\n/**\n * Logic around selection flashcards from a list.\n */\nexport function useFlashcardSelection() {\n const [selection, setSelection] = useState({})\n\n const refreshSelectionWith = useCallback(flashcards => {\n setSelection(prev => {\n return flashcards.reduce((acc, fc) => {\n acc[fc.id] = prev[fc.id] || false\n return acc\n }, {})\n })\n }, [])\n\n const toggleSelection = id => {\n setSelection(prev => {\n return { ...prev, [id]: !prev[id] }\n })\n }\n\n return {\n selection,\n checkSelection: (state, id) => Boolean(state[id]),\n refreshSelectionWith,\n toggleSelection,\n }\n}\n\nexport function useFlashcardSelectionSize(selection) {\n return useMemo(\n () => Object.values(selection).reduce((count, v) => count + (v ? 1 : 0), 0),\n [selection]\n )\n}\n","import styled from 'styled-components'\n\nimport { Dialog, media } from '@redriverpress/system'\n\nconst StyledDialogContent = styled(Dialog.Content)`\n background: ${props => props.theme.colors.gray100};\n position: fixed;\n inset: 0;\n overflow-y: scroll;\n -webkit-overflow-scrolling: touch;\n z-index: 6;\n\n ${media.md`\n inset: unset;\n top: 1rem;\n left: 50%;\n transform: translateX(-50%);\n width: 90vw;\n max-height: 90vh;\n `}\n\n ${media.lg`\n width: 85vw;\n max-height: 85vh;\n `}\n\n ${media.xl`\n max-width: 65rem;\n `}\n`\n\nexport default StyledDialogContent\n","import PropTypes from 'prop-types'\n\nimport {\n Box,\n Button,\n Columns,\n Col,\n Dialog,\n Icon,\n Heading,\n Text,\n} from '@redriverpress/system'\n\nimport ManageFlashcards from './ManageFlashcards'\nimport StyledDialogContent from '../StyledDialogContent'\nimport { flashcardsPropType } from '../propTypes'\n\nexport default function ManageFlashcardsDialog({\n deleteAllAction,\n flashcards,\n onRemove,\n onRename,\n onReorder,\n onClose,\n onOpenChange,\n onPrimaryAction,\n onPrint,\n open,\n primaryActionLabel,\n title,\n onCopy,\n}) {\n const handlePrimaryAction = () => {\n onClose()\n onPrimaryAction()\n }\n\n const handlePrint = () => {\n onClose()\n onPrint()\n }\n\n return (\n \n \n \n \n \n \n \n {title}\n \n \n {flashcards.length} flashcard{flashcards.length !== 1 && 's'}\n \n \n \n \n {primaryActionLabel}\n \n \n \n \n \n Print\n \n \n \n \n \n \n \n \n )\n}\n\nManageFlashcardsDialog.defaultProps = {\n deleteAllAction: null,\n onCopy: null,\n}\n\nManageFlashcardsDialog.propTypes = {\n deleteAllAction: PropTypes.node,\n flashcards: flashcardsPropType.isRequired,\n onRemove: PropTypes.func.isRequired,\n onRename: PropTypes.func.isRequired,\n onReorder: PropTypes.func.isRequired,\n onClose: PropTypes.func.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n onPrimaryAction: PropTypes.func.isRequired,\n onPrint: PropTypes.func.isRequired,\n open: PropTypes.bool.isRequired,\n primaryActionLabel: PropTypes.node.isRequired,\n title: PropTypes.string.isRequired,\n onCopy: PropTypes.func,\n}\n","import xhr from 'Common/utils/xhr'\n\nconst url = '/api/v1/flashcard_pdfs'\n\nexport const postFlashcardPdf = ({\n flashcards,\n layout,\n font,\n perPage,\n color,\n}) =>\n xhr({\n url,\n method: 'POST',\n data: {\n flashcards: flashcards.map(({ id, image, imageGrayscale, title }) => ({\n id,\n image,\n imageGrayscale,\n title,\n })),\n layout,\n font,\n per_page: perPage,\n color,\n },\n })\n\nexport const getFlashcardPdf = async id => {\n const response = await xhr({\n url: `${url}/${id}`,\n method: 'GET',\n })\n if (response.data === false) throw new Error('PDF not ready yet!')\n return response\n}\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { useEffect, useState } from 'react'\nimport { useMutation, useQuery } from 'react-query'\n\nimport {\n Box,\n Button,\n Dialog,\n Icon,\n Heading,\n HiddenInput,\n LoadingPlane,\n Text,\n} from '@redriverpress/system'\n\nimport BackToBack from 'Images/flashcards/print/flashcard-styles_back-to-back.png'\nimport ImageAndText from 'Images/flashcards/print/flashcard-styles_image-and-text.png'\nimport ImageOnly from 'Images/flashcards/print/flashcard-styles_image-only.png'\nimport TextOnly from 'Images/flashcards/print/flashcard-styles_text-only.png'\nimport OpenSans from 'Images/flashcards/print/fonts_open-sans.png'\nimport Quicksand from 'Images/flashcards/print/fonts_quicksand.png'\nimport Color from 'Images/flashcards/print/color-settings_color.png'\nimport BlackAndWhite from 'Images/flashcards/print/color-settings_black-and-white.png'\nimport TwoPerPage from 'Images/flashcards/print/images-per-page_2.png'\nimport FourPerPage from 'Images/flashcards/print/images-per-page_4.png'\nimport EightPerPage from 'Images/flashcards/print/images-per-page_8.png'\nimport SixteenPerPage from 'Images/flashcards/print/images-per-page_16.png'\n\nimport StyledDialogContent from '../StyledDialogContent'\nimport {\n postFlashcardPdf,\n getFlashcardPdf,\n} from '../services/flashcardPrintServices'\n\nconst PrintOptionsGrid = styled(Box).attrs(props => ({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, 140px)',\n gridGap: [props.theme.space[3], null, props.theme.space[4]],\n mb: 5,\n}))``\n\nconst PrintOption = styled(Text).attrs({\n as: 'label',\n display: 'block',\n fontWeight: 600,\n})`\n cursor: pointer;\n`\n\nconst PrintOptionImage = styled(Box).attrs({\n backgroundColor: 'white',\n border: 'none',\n borderRadius: 'rounded',\n size: '140px',\n mb: 2,\n})`\n background-image: url('${props => props.img}');\n background-size: contain;\n background-position: center;\n\n input:checked + & {\n box-shadow: 0 0 0 2px ${props => props.theme.colors.blue500};\n }\n\n input:focus + & {\n box-shadow: 0 0 0 4px ${props => props.theme.colors.blue500};\n }\n`\n\nconst layouts = {\n imageOnly: 'only_image',\n textOnly: 'only_text',\n backToBack: 'back_to_back',\n imageAndText: 'image_and_text',\n}\n\nconst fonts = {\n openSans: 'opensans',\n quicksand: 'quicksand',\n}\n\nexport default function PrintFlashcardsDialog({\n flashcards,\n onOpenChange,\n open,\n title,\n}) {\n const [layout, setLayout] = useState(layouts.imageOnly)\n const [font, setFont] = useState(fonts.openSans)\n const [color, setColor] = useState(true)\n const [perPage, setPerPage] = useState(1)\n\n const [pdfId, setPdfId] = useState(null)\n const [pdfUrl, setPdfUrl] = useState(null)\n\n const printMutation = useMutation(\n () =>\n postFlashcardPdf({\n flashcards: flashcards.map(\n ({ id, image, imageGrayscale, userTitle }) => ({\n id,\n image,\n imageGrayscale,\n title: userTitle,\n })\n ),\n layout,\n font,\n color,\n perPage,\n }),\n {\n onSuccess: ({ data: id }) => setPdfId(id),\n }\n )\n\n const { isLoading: pdfIsGenerating } = useQuery(\n ['flashcardPdfUrl', pdfId],\n () => getFlashcardPdf(pdfId),\n {\n enabled: pdfId !== null,\n retry: true,\n retryDelay: 1000,\n onSuccess: ({ data: url }) => {\n setPdfId(null) // clear pdfId for next print job, if any\n setPdfUrl(url)\n },\n }\n )\n\n useEffect(() => {\n pdfUrl && window.open(pdfUrl, '_blank')\n }, [pdfUrl])\n\n return (\n \n \n \n \n \n \n \n Print {title ? `“${title}”` : 'Unsaved Selection'}\n \n \n {flashcards.length} flashcard{flashcards.length !== 1 && 's'}\n \n \n\n \n \n Flashcard Styles\n \n \n \n setLayout(layouts.imageOnly)}\n />\n \n Image only\n \n \n setLayout(layouts.imageAndText)}\n />\n \n Image & text\n \n \n setLayout(layouts.backToBack)}\n />\n \n \n Image & text\n
(back-to-back)\n
\n
\n \n setLayout(layouts.textOnly)}\n />\n \n Text only\n \n
\n\n \n Fonts\n \n \n \n setFont(fonts.openSans)}\n />\n \n \n \n setFont(fonts.quicksand)}\n />\n \n \n \n\n \n Color Settings\n \n \n \n setColor(true)}\n />\n \n Color\n \n \n setColor(false)}\n />\n \n Black & white\n \n \n\n \n Images per Page\n \n \n \n setPerPage(1)}\n />\n \n 1\n \n \n setPerPage(2)}\n />\n \n 2\n \n \n setPerPage(4)}\n />\n \n 4\n \n \n setPerPage(8)}\n />\n \n 8\n \n \n setPerPage(16)}\n />\n \n 16\n \n \n\n \n \n \n Print Flashcards\n \n \n
\n \n \n \n e.preventDefault()}\n onInteractOutside={e => e.preventDefault()}\n onPointerDownOutside={e => e.preventDefault()}\n >\n \n \n \n \n Please wait while we generate your printable flashcard\n file. This may take a minute.\n \n \n Your PDF will open in a new browser tab when\n it’s ready.\n \n \n \n \n \n \n
\n
\n
\n )\n}\n\nPrintFlashcardsDialog.defaultProps = {\n title: null,\n}\n\nPrintFlashcardsDialog.propTypes = {\n flashcards: PropTypes.arrayOf(PropTypes.object).isRequired,\n onOpenChange: PropTypes.func.isRequired,\n open: PropTypes.bool.isRequired,\n title: PropTypes.string,\n}\n","import PropTypes from 'prop-types'\nimport { useEffect } from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { Machine } from 'xstate'\nimport { useMachine } from '@xstate/react'\n\nimport { Box, MotionBox, Heading, Text } from '@redriverpress/system'\n\nconst createFlashcardMachine = initialState =>\n Machine({\n id: 'flashcardMachine', // this will need to be unique if more than 1 FC shown at a time\n initial: initialState,\n states: {\n image: {\n on: {\n imageClicked: 'imageAndTitle',\n },\n },\n imageAndTitle: {\n on: {\n imageClicked: 'image',\n titleClicked: 'title',\n },\n },\n title: {\n on: {\n titleClicked: 'imageAndTitle',\n },\n },\n },\n on: {\n // Internal transitions\n // https://xstate.js.org/docs/guides/transitions.html#internal-transitions\n // These are used only to explicitly set the state based on the\n // global display option currently set in the application context.\n image: '.image',\n imageAndTitle: '.imageAndTitle',\n title: '.title',\n },\n })\n\nconst variants = {\n hide: {\n opacity: 0,\n scale: 0.75,\n },\n show: {\n opacity: 1,\n scale: 1,\n },\n}\n\nconst transition = {\n type: 'spring',\n stiffness: 400,\n damping: 30,\n mass: 0.6,\n}\n\nconst MotionHeading = motion(Heading)\n\nconst flashcardSizes = ['11rem', null, '20rem', '25rem', '22rem']\n\nexport default function Flashcard({ font, image, presentationMode, title }) {\n const [state, send] = useMachine(createFlashcardMachine(presentationMode))\n\n useEffect(() => {\n send(presentationMode)\n }, [presentationMode])\n\n const textSize =\n title.length > 26\n ? [3, null, state.matches('title') ? 5 : 4]\n : [4, null, state.matches('title') ? 8 : 6]\n\n return (\n \n \n {!state.matches('title') && (\n send('imageClicked')}\n role='button'\n display='inline-block'\n size={flashcardSizes}\n maxHeight='50vh' // prevent huge size on rotating device\n backgroundImage={`url(${image})`}\n backgroundRepeat='no-repeat'\n backgroundSize='contain'\n style={{ cursor: 'pointer' }}\n alt=''\n />\n )}\n {!state.matches('image') && (\n send('titleClicked')}\n role='button'\n font={font}\n fontSize={textSize}\n fontWeight={font === 'standard' ? 800 : 700}\n textAlign='center'\n py={3}\n mb={0}\n style={{ cursor: 'pointer' }}\n >\n \n {title}\n \n \n )}\n \n \n )\n}\n\nFlashcard.defaultProps = {\n font: 'standard',\n presentationMode: 'image',\n}\n\nFlashcard.propTypes = {\n font: PropTypes.oneOf(['standard', 'literacy']),\n image: PropTypes.string.isRequired,\n presentationMode: PropTypes.oneOf(['image', 'title', 'imageAndTitle']),\n title: PropTypes.string.isRequired,\n}\n","import FlashcardUsage from 'Images/flashcard_usage.gif'\nimport { Image, Text } from '@redriverpress/system'\n\nexport default function FlashcardInstructions() {\n return (\n <>\n \n \n Click on the image to show or hide the text.\n \n \n Click on the text to show or hide the image.\n \n \n )\n}\n","import styled from 'styled-components'\n\nimport { Box, Sun, Text } from '@redriverpress/system'\n\nconst DemoBox = styled(Box).attrs(() => ({\n border: '1px solid',\n borderColor: 'gray600',\n borderRadius: 'rounded',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n size: '3rem',\n role: 'img',\n}))``\n\nexport function DemoImage(props) {\n return (\n \n \n \n )\n}\n\nexport function DemoImageText(props) {\n return (\n \n \n \n sun\n \n \n )\n}\n\nexport function DemoText(props) {\n return (\n \n sun\n \n )\n}\n\nexport function DemoOpenSans(props) {\n return (\n \n \n abc\n \n \n )\n}\n\nexport function DemoQuicksand(props) {\n return (\n \n \n abc\n \n \n )\n}\n","import PropTypes from 'prop-types'\n\nexport const flashcardsPropType = PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n thumbnail: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n userTitle: PropTypes.string.isRequired,\n })\n)\n\nexport const modePropType = PropTypes.oneOf(['default', 'edit', 'reorder'])\n\nexport const sharedFlashcardSetPropType = PropTypes.shape({\n id: PropTypes.number.isRequired,\n flashcardSet: PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n description: PropTypes.string,\n flashcardCount: PropTypes.number.isRequired,\n }).isRequired,\n flashcardCategory: PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n description: PropTypes.string,\n flashcardCount: PropTypes.number.isRequired,\n }).isRequired,\n teacher: PropTypes.shape({\n id: PropTypes.number.isRequired,\n firstName: PropTypes.string.isRequired,\n lastName: PropTypes.string.isRequired,\n teacherName: PropTypes.string.isRequired,\n avatarUrl: PropTypes.string.isRequired,\n }).isRequired,\n yumiClass: PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n color: PropTypes.string.isRequired,\n }).isRequired,\n studentIds: PropTypes.arrayOf(PropTypes.number), // only include if shared to a subset of the class,\n})\n","import getWithXHR from 'Common/utils/getWithXHR'\n\nconst url = '/api/v1/current_user'\n\n// Endpoint returns a current user object, see\n// /app/views/api/v1/users/current.json.jb\nconst getCurrentUser = () => getWithXHR(url)\n\nexport default getCurrentUser\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Fragment, useEffect, useRef, useState } from 'react'\nimport { useMutation } from 'react-query'\n\nimport FourFlashcards from 'Images/four_flashcards.svg'\nimport {\n Box,\n Button,\n CheckboxControl,\n Columns,\n Col,\n Dialog,\n Icon,\n Heading,\n HR,\n Image,\n LoadingPlane,\n LoadingSpinner,\n MonoButton,\n SimpleInput,\n Text,\n useToast,\n} from '@redriverpress/system'\n\nimport { capitalCase } from 'text-case'\nimport services from '../services/flashcardSets'\nimport useFlashcardSets from '../hooks/useFlashcardSets'\n\nexport const SAVE_MODES = {\n copy: 'copy',\n save: 'save',\n paste: 'paste',\n}\n\nconst translations = {\n [SAVE_MODES.copy]: {\n past: 'copied',\n progressive: 'copying',\n },\n [SAVE_MODES.save]: {\n past: 'saved',\n progressive: 'saving',\n },\n [SAVE_MODES.paste]: {\n past: 'pasted',\n progressive: 'pasting',\n },\n}\n\n/* This component borrows several patterns from MoveItemModal.js.\n * Changes to one component may need to be reflected in the other.\n */\nexport default function SaveToSetsDialog({\n flashcards,\n onClose,\n onOpenChange,\n onSaved,\n open,\n mode,\n exclude,\n}) {\n const translation = translations[mode] || translations[SAVE_MODES.save]\n\n const { addToast } = useToast()\n\n const {\n isLoading: flashcardSetsLoading,\n data,\n refetch: refetchFlashcardSets,\n } = useFlashcardSets({ exclude })\n\n const [newSets, setNewSets] = useState([])\n const addNewSet = newSet => setNewSets(sets => R.prepend(newSet, sets))\n\n const [namingNewSet, setNamingNewSet] = useState(false)\n const newSetInput = useRef(null)\n\n const createSetMutation = useMutation(services.createFlashcardSet, {\n onSuccess: ({ data: newFlashcardSet }) => {\n addNewSet(newFlashcardSet)\n setNamingNewSet(true)\n newSetInput.current.focus()\n },\n })\n\n const renameSetMutation = useMutation(\n // Let's only update the name, keep existing description.\n ({ id, name }) => services.updateFlashcardSet({ id, name }),\n {\n onSuccess: ({ data: renamedSet }) => {\n setNamingNewSet(false)\n setNewSets(current =>\n R.adjust(0, R.assoc('name', renamedSet.name), current)\n )\n },\n }\n )\n\n // Yes, this naming is ridiculous. I know. :)\n const [setsSelection, setSetsSelection] = useState([])\n const toggleSetSelection = setId =>\n setSetsSelection(current =>\n current.includes(setId)\n ? R.without([setId], current)\n : R.append(setId, current)\n )\n\n const [savePending, setSavePending] = useState(false)\n const [saveErrored, setSaveErrored] = useState(false)\n\n const handleSaveFlashcards = async () => {\n setSavePending(true)\n setSaveErrored(false)\n try {\n await services.createUserFlashcards({\n setIds: setsSelection,\n flashcards,\n })\n setSavePending(false)\n addToast({\n id: `${capitalCase(translation.past)} Flashcards`,\n content: `Successfully ${translation.past} ${\n flashcards.length\n } flashcard${flashcards.length !== 1 ? 's' : ''}`,\n timeout: 3000,\n action: mode === SAVE_MODES.save && (\n \n View Sets\n \n ),\n })\n onSaved()\n onClose()\n } catch {\n setSavePending(false)\n setSaveErrored(true)\n }\n }\n\n useEffect(() => {\n // When closing the modal, reset newSets and setsSelection,\n // and refetch flashcard sets (in case user created new sets while dialog was open)\n if (!open) {\n setNewSets([])\n setSetsSelection([])\n refetchFlashcardSets()\n }\n }, [open])\n\n return (\n \n \n \n \n \n \n {capitalCase(mode)} to…\n \n \n\n {flashcardSetsLoading && (\n \n \n \n )}\n\n {!flashcardSetsLoading &&\n (data.flashcardSets?.length || newSets?.length) ? (\n <>\n \n {flashcards.length === 1 ? (\n <>\n Where would you like to {mode}{' '}\n {flashcards[0].title}?\n \n ) : (\n <>Where would you like to {mode} your selected flashcards?\n )}\n \n \n {newSets &&\n newSets.map(set => (\n \n \n \n toggleSetSelection(set.id)}\n />\n \n {set === newSets[0] && namingNewSet ? (\n e.target.select()}\n onKeyDown={e =>\n e.keyCode === 13 &&\n renameSetMutation.mutate({\n id: set.id,\n name: e.target.value,\n })\n }\n onBlur={e =>\n renameSetMutation.mutate({\n id: set.id,\n name: e.target.value,\n })\n }\n />\n ) : (\n \n {set.name}\n \n )}\n \n {/* Don't render an HR under this set if it's the last one in the newSets\n and there are no existing sets (results in a double bottom border w/ wrapping box) */}\n {!data.flashcardSets?.length &&\n R.equals(set, R.last(newSets)) ? null : (\n
\n )}\n
\n ))}\n {data.flashcardSets &&\n data.flashcardSets.map(set => (\n \n \n \n toggleSetSelection(set.id)}\n />\n \n \n {set.name}\n \n \n {R.equals(set, R.last(data.flashcardSets)) ? null : (\n
\n )}\n
\n ))}\n \n \n ) : (\n \n \n \n You have no flashcard sets\n \n \n )}\n\n \n {saveErrored && (\n \n \n \n \n Something went wrong when {translation.progressive} your\n flashcards. Please try again!\n \n \n \n )}\n\n \n \n {createSetMutation.isLoading ? (\n \n ) : (\n \n )}\n \n New Set\n \n \n \n \n \n \n Cancel\n \n \n \n \n {savePending ? : }\n \n {capitalCase(mode)}\n \n \n \n \n
\n
\n
\n )\n}\n\nSaveToSetsDialog.defaultProps = {\n onSaved: () => {},\n mode: SAVE_MODES.save,\n exclude: [],\n}\n\nSaveToSetsDialog.propTypes = {\n flashcards: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string,\n userTitle: PropTypes.string,\n })\n ).isRequired,\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n onSaved: PropTypes.func,\n mode: PropTypes.oneOf(Object.values(SAVE_MODES)),\n exclude: PropTypes.arrayOf(PropTypes.number),\n}\n","import { useQuery } from 'react-query'\nimport { over, lensProp } from 'ramda'\n\nimport services from '../services/flashcardSets'\n\nconst responseWithoutExcludedSets = excludedIds => data => {\n if (!excludedIds || excludedIds.length === 0) {\n return data\n }\n\n return over(\n lensProp('flashcardSets'),\n sets => sets?.filter(set => !excludedIds.includes(set.id)),\n data\n )\n}\n\nexport default function useFlashcardSets({\n exclude = [],\n enabled = true,\n} = {}) {\n const { isLoading, data, refetch } = useQuery(\n 'flashcardSets',\n () => services.getFlashcardSets().then(response => response.data),\n {\n select: responseWithoutExcludedSets(exclude),\n enabled,\n }\n )\n\n return {\n isLoading,\n data,\n refetch,\n }\n}\n","/*\n * Services for working with a student's flashcard sets,\n * shared to them from a teacher.\n */\n\nimport getWithXHR from 'Common/utils/getWithXHR'\nimport xhr from 'Common/utils/xhr'\n\nconst url = '/api/v1/students/shared_flashcard_sets'\n\nfunction getStudentFlashcardSets() {\n return getWithXHR(url)\n}\n\n// Add a student to the list of students who have opened a given shared flashcard set\nfunction markSharedFlashcardSetOpened(sharedSetId) {\n return xhr({\n url: `${url}/${sharedSetId}/open`,\n method: 'PUT',\n })\n}\n\nexport default {\n getStudentFlashcardSets,\n markSharedFlashcardSetOpened,\n}\n"],"sourceRoot":""}