{"version":3,"file":"search.849bb.min.mjs","mappings":"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","sources":["webpack://identigraf-frontend/./src/components/ReadRequirements/index.tsx","webpack://identigraf-frontend/./src/components/UploadProgress/index.tsx","webpack://identigraf-frontend/./src/components/UploadSubmitButton/index.tsx","webpack://identigraf-frontend/./src/hocs/withLoginCheck.tsx","webpack://identigraf-frontend/./src/hooks/usexhr.ts","webpack://identigraf-frontend/./src/routes/SearchRoute.tsx","webpack://identigraf-frontend/./node_modules/react-bootstrap/esm/InputGroupText.js","webpack://identigraf-frontend/./node_modules/react-bootstrap/esm/InputGroup.js","webpack://identigraf-frontend/./src/components/SearchForm/index.tsx","webpack://identigraf-frontend/./node_modules/react-bootstrap/esm/Image.js"],"sourcesContent":["import { h } from 'preact';\nimport { Link } from 'preact-router';\nimport { Alert } from 'react-bootstrap';\n\nexport function ReadRequirements(): h.JSX.Element {\n    return (\n        <Alert variant=\"info\">\n            <strong>Уважно</strong> прочитайте{' '}\n            <Link href=\"/about/requirements\">Вимоги до підготовки фотоматеріалів</Link>.\n        </Alert>\n    );\n}\n","import { h } from 'preact';\n\ninterface Props {\n    progress: number;\n}\n\nexport function UploadProgress({ progress }: Readonly<Props>): h.JSX.Element | null {\n    if (isNaN(progress)) {\n        return null;\n    }\n\n    return (\n        <div className=\"d-flex align-items-center mb-3\">\n            Завантаження:{' '}\n            <progress max={100} value={-1 === progress ? undefined : progress} className=\"flex-grow-1 ms-1\" />{' '}\n            {progress !== -1 ? <span className=\"ms-1\">{progress.toFixed(2)}%</span> : undefined}\n        </div>\n    );\n}\n","import { h } from 'preact';\nimport { Button } from 'react-bootstrap';\n\ninterface Props extends h.JSX.HTMLAttributes {\n    progress: number;\n}\n\nfunction progressToText(progress: number): string {\n    switch (true) {\n        case isNaN(progress):\n            return 'Відправити';\n\n        case progress === 100:\n            return 'Обробка…';\n\n        case progress > 0:\n            return `Вивантаження (${Math.floor(progress)}%)…`;\n\n        default:\n            return 'Вивантаження…';\n    }\n}\n\nexport function UploadSubmitButton({ progress }: Readonly<Props>): h.JSX.Element {\n    return (\n        <Button type=\"submit\" variant=\"primary\">\n            {progressToText(progress)}\n        </Button>\n    );\n}\n","import { type ComponentType, h } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport { route } from 'preact-router';\nimport { Loader } from '../components/Loader';\nimport { AppContext } from '../context';\n\nexport const withLoginCheck = <P extends object>(WrappedComponent: ComponentType<P>): ComponentType<P> =>\n    function Wrapped({ ...props }: P): h.JSX.Element | null {\n        const { token } = useContext(AppContext)!;\n        switch (true) {\n            case token === undefined:\n                return <Loader />;\n\n            case typeof token === 'string':\n                return <WrappedComponent {...props} token={token} />;\n\n            default:\n                route('/');\n                return null;\n        }\n    };\n\nexport const withVisitorCheck = <P extends object>(WrappedComponent: ComponentType<P>): ComponentType<P> =>\n    function Wrapped({ ...props }: P): h.JSX.Element | null {\n        const { token, setToken, setUserLogin } = useContext(AppContext)!;\n        switch (true) {\n            case token === undefined:\n                return <Loader />;\n\n            case token === null:\n                return <WrappedComponent {...props} setToken={setToken} setLogin={setUserLogin} />;\n\n            default:\n                route('/search');\n                return null;\n        }\n    };\n","import { useCallback, useEffect, useState } from 'preact/hooks';\n\nexport interface XHRResponse {\n    response: string;\n    status: number;\n    url: string;\n    headers: Record<string, string>;\n}\n\nexport interface UseXHRResult {\n    progress: number;\n    error: Error | null;\n    response: XHRResponse | null;\n    finished: boolean;\n}\n\nexport const useXHR = (url: string, token: string, data: FormData | undefined): UseXHRResult => {\n    const [progress, setProgress] = useState<number>(NaN);\n    const [error, setError] = useState<Error | null>(null);\n    const [response, setResponse] = useState<XHRResponse | null>(null);\n    const [finished, setFinished] = useState(false);\n\n    const onProgress = useCallback((e: ProgressEvent<XMLHttpRequestEventTarget>) => {\n        const val = e.lengthComputable ? (e.loaded / e.total) * 100 : -1;\n        setProgress(val);\n    }, []);\n\n    const onError = useCallback(() => {\n        setProgress(NaN);\n        setFinished(true);\n        setError(new Error());\n    }, []);\n\n    const onLoad = useCallback((e: ProgressEvent<XMLHttpRequestEventTarget>) => {\n        const req = e.currentTarget as XMLHttpRequest;\n        const headers = req.getAllResponseHeaders();\n        const arr = headers.trim().split(/[\\r\\n]+/u);\n        const headerMap: Record<string, string> = {};\n        arr.forEach((line) => {\n            const parts = line.split(': ', 2);\n            const header = parts[0];\n            const value = parts[1] ?? '';\n            headerMap[header] = value;\n        });\n\n        setProgress(NaN);\n        setFinished(true);\n        setResponse({\n            response: req.responseText,\n            status: req.status,\n            url: req.responseURL,\n            headers: headerMap,\n        });\n    }, []);\n\n    useEffect(() => {\n        if (url && data) {\n            const req = new XMLHttpRequest();\n            req.upload.addEventListener('progress', onProgress);\n            req.addEventListener('error', onError);\n            req.addEventListener('load', onLoad);\n            req.open('POST', url);\n            req.setRequestHeader('Authorization', `Bearer ${token}`);\n            req.send(data);\n        }\n    }, [data, onError, onLoad, onProgress, token, url]);\n\n    return { progress, error, response, finished };\n};\n","import { h } from 'preact';\nimport { SearchForm } from '../components/SearchForm';\nimport { useDocumentTitle } from '../hooks/usedocumenttitle';\nimport { useTrackPageView } from '../hooks/usetrackpageview';\n\nexport default function SearchRoute(): h.JSX.Element {\n    useDocumentTitle('Пошук');\n    useTrackPageView();\n    return <SearchForm />;\n}\n","\"use client\";\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst InputGroupText = /*#__PURE__*/React.forwardRef(({\n  className,\n  bsPrefix,\n  as: Component = 'span',\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'input-group-text');\n  return /*#__PURE__*/_jsx(Component, {\n    ref: ref,\n    className: classNames(className, bsPrefix),\n    ...props\n  });\n});\nInputGroupText.displayName = 'InputGroupText';\nexport default InputGroupText;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useMemo } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport FormCheckInput from './FormCheckInput';\nimport InputGroupContext from './InputGroupContext';\nimport InputGroupText from './InputGroupText';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst InputGroupCheckbox = props => /*#__PURE__*/_jsx(InputGroupText, {\n  children: /*#__PURE__*/_jsx(FormCheckInput, {\n    type: \"checkbox\",\n    ...props\n  })\n});\nconst InputGroupRadio = props => /*#__PURE__*/_jsx(InputGroupText, {\n  children: /*#__PURE__*/_jsx(FormCheckInput, {\n    type: \"radio\",\n    ...props\n  })\n});\nconst InputGroup = /*#__PURE__*/React.forwardRef(({\n  bsPrefix,\n  size,\n  hasValidation,\n  className,\n  // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n  as: Component = 'div',\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'input-group');\n\n  // Intentionally an empty object. Used in detecting if a dropdown\n  // exists under an input group.\n  const contextValue = useMemo(() => ({}), []);\n  return /*#__PURE__*/_jsx(InputGroupContext.Provider, {\n    value: contextValue,\n    children: /*#__PURE__*/_jsx(Component, {\n      ref: ref,\n      ...props,\n      className: classNames(className, bsPrefix, size && `${bsPrefix}-${size}`, hasValidation && 'has-validation')\n    })\n  });\n});\nInputGroup.displayName = 'InputGroup';\nexport default Object.assign(InputGroup, {\n  Text: InputGroupText,\n  Radio: InputGroupRadio,\n  Checkbox: InputGroupCheckbox\n});","import { h } from 'preact';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\nimport { route } from 'preact-router';\nimport { Alert, Card, Form, Image, InputGroup } from 'react-bootstrap';\nimport Bugsnag from '@bugsnag/js';\nimport { CardHeader } from '../CardHeader';\nimport { ReadRequirements } from '../ReadRequirements';\nimport { UploadProgress } from '../UploadProgress';\nimport { UploadSubmitButton } from '../UploadSubmitButton';\nimport { type ErrorResponse, type SearchUploadResponse, decodeErrorResponse } from '../../api';\nimport { useXHR } from '../../hooks/usexhr';\nimport { withLoginCheck } from '../../hocs/withLoginCheck';\nimport { Paragraph } from '../Paragraph';\n\ninterface Props {\n    token?: string;\n}\n\nfunction SearchFormInternal({ token }: Readonly<Props>): h.JSX.Element {\n    const [image, setImage] = useState('');\n    const [error, setError] = useState<string>('');\n    const [minSimilarity, setMinSimilarity] = useState<number>(30);\n    const [data, setData] = useState<FormData | undefined>(undefined);\n\n    const {\n        progress: uploadProgress,\n        error: xhrError,\n        response,\n        finished,\n    } = useXHR('https://api2.myrotvorets.center/identigraf/v2/search', token!, data);\n\n    const onFileChange = useCallback(({ currentTarget }: h.JSX.TargetedEvent<HTMLInputElement>): void => {\n        setError('');\n        const { files } = currentTarget;\n        const f = files?.[0];\n        if (f?.type.startsWith('image/')) {\n            const reader = new FileReader();\n            reader.addEventListener('load', ({ target }: ProgressEvent<FileReader>): void => {\n                setImage(target!.result as string);\n            });\n\n            reader.readAsDataURL(f);\n        } else {\n            setImage('');\n        }\n    }, []);\n\n    const onSimilarityChange = useCallback(({ currentTarget }: h.JSX.TargetedInputEvent<HTMLInputElement>): void => {\n        const value = currentTarget.valueAsNumber;\n        if (value < 5) {\n            setMinSimilarity(5);\n        } else if (value > 80) {\n            setMinSimilarity(80);\n        } else {\n            setMinSimilarity(value);\n        }\n    }, []);\n\n    const onFormSubmit = useCallback(\n        (e: h.JSX.TargetedSubmitEvent<HTMLFormElement>): void => {\n            e.preventDefault();\n            if (image.length !== 0 && isNaN(uploadProgress) && data === undefined) {\n                setData(new FormData(e.currentTarget));\n            }\n        },\n        [image, uploadProgress, data],\n    );\n\n    useEffect(() => {\n        setError(xhrError ? 'Помилка вивантаження файлу' : '');\n        setData(undefined);\n    }, [xhrError]);\n\n    useEffect(() => {\n        if (finished && response) {\n            setData(undefined);\n            try {\n                const body = JSON.parse(response.response) as SearchUploadResponse | ErrorResponse;\n                if (body.success) {\n                    route(`/search/${body.guid}`);\n                } else if (response.status === 401) {\n                    route('/logout');\n                } else {\n                    setError(decodeErrorResponse(body));\n                }\n            } catch (err) {\n                Bugsnag.notify(err as Error);\n                setError('Несподівана помилка під час аналізу відповіді сервера');\n            }\n        }\n    }, [finished, response]);\n\n    return (\n        <section className=\"d-flex flex-column w-100\">\n            <ReadRequirements />\n\n            <Card as=\"form\" onSubmit={onFormSubmit}>\n                <CardHeader>Пошук</CardHeader>\n                <Card.Body>\n                    {error && <Alert variant=\"danger\">{error}</Alert>}\n\n                    <Form.Group controlId=\"photo\" className=\"mb-3\">\n                        <Form.Label>Світлина для розпізнавання:</Form.Label>\n                        <Form.Control\n                            type=\"file\"\n                            required\n                            accept=\"image/png, image/jpeg\"\n                            disabled={!isNaN(uploadProgress)}\n                            onChange={onFileChange}\n                            name=\"photo\"\n                        />\n                    </Form.Group>\n\n                    <Form.Group controlId=\"minSimilarity\" className=\"mb-3\">\n                        <Form.Label>Мінімальна схожість:</Form.Label>\n                        <InputGroup>\n                            <Form.Control\n                                type=\"number\"\n                                value={minSimilarity}\n                                required\n                                name=\"minSimilarity\"\n                                min={5}\n                                max={80}\n                                onInput={onSimilarityChange}\n                            />\n                            <InputGroup.Text>%</InputGroup.Text>\n                        </InputGroup>\n                    </Form.Group>\n\n                    {image.length > 0 ? (\n                        <Image src={image} alt=\"Завантажена світлина\" className=\"img-fluid mb-3\" />\n                    ) : null}\n\n                    <UploadProgress progress={uploadProgress} />\n\n                    <Paragraph>\n                        <UploadSubmitButton\n                            disabled={image.length === 0 || !isNaN(uploadProgress)}\n                            progress={uploadProgress}\n                        />\n                    </Paragraph>\n                </Card.Body>\n            </Card>\n        </section>\n    );\n}\n\nexport const SearchForm = withLoginCheck(SearchFormInternal);\n","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const propTypes = {\n  /**\n   * @default 'img'\n   */\n  bsPrefix: PropTypes.string,\n  /**\n   * Sets image as fluid image.\n   */\n  fluid: PropTypes.bool,\n  /**\n   * Sets image shape as rounded.\n   */\n  rounded: PropTypes.bool,\n  /**\n   * Sets image shape as circle.\n   */\n  roundedCircle: PropTypes.bool,\n  /**\n   * Sets image shape as thumbnail.\n   */\n  thumbnail: PropTypes.bool\n};\nconst Image = /*#__PURE__*/React.forwardRef(({\n  bsPrefix,\n  className,\n  fluid = false,\n  rounded = false,\n  roundedCircle = false,\n  thumbnail = false,\n  ...props\n}, ref) => {\n  bsPrefix = useBootstrapPrefix(bsPrefix, 'img');\n  return /*#__PURE__*/_jsx(\"img\", {\n    // eslint-disable-line jsx-a11y/alt-text\n    ref: ref,\n    ...props,\n    className: classNames(className, fluid && `${bsPrefix}-fluid`, rounded && `rounded`, roundedCircle && `rounded-circle`, thumbnail && `${bsPrefix}-thumbnail`)\n  });\n});\nImage.displayName = 'Image';\nexport default Image;"],"names":["ReadRequirements","h","Alert","variant","Link","href","UploadProgress","progress","isNaN","className","max","value","undefined","toFixed","UploadSubmitButton","Button","type","Math","floor","progressToText","withLoginCheck","WrappedComponent","_ref","props","_extends","_objectDestructuringEmpty","token","useContext","AppContext","Loader","route","withVisitorCheck","_ref2","setToken","setUserLogin","setLogin","useXHR","url","data","setProgress","useState","NaN","error","setError","response","setResponse","finished","setFinished","onProgress","useCallback","e","lengthComputable","loaded","total","onError","Error","onLoad","req","currentTarget","arr","getAllResponseHeaders","trim","split","headerMap","forEach","line","_parts$","parts","responseText","status","responseURL","headers","useEffect","XMLHttpRequest","upload","addEventListener","open","setRequestHeader","send","SearchRoute","useDocumentTitle","useTrackPageView","SearchForm","InputGroupText","bsPrefix","as","Component","ref","displayName","InputGroup","size","hasValidation","contextValue","InputGroupContext","Provider","children","Object","assign","Text","Radio","FormCheckInput","Checkbox","image","setImage","minSimilarity","setMinSimilarity","setData","uploadProgress","xhrError","onFileChange","files","f","startsWith","reader","FileReader","target","result","readAsDataURL","onSimilarityChange","valueAsNumber","onFormSubmit","preventDefault","length","FormData","body","JSON","parse","success","guid","decodeErrorResponse","err","Bugsnag","Card","onSubmit","CardHeader","Body","Form","Group","controlId","Label","Control","required","accept","disabled","onChange","name","min","onInput","Image","src","alt","Paragraph","fluid","rounded","roundedCircle","thumbnail"],"sourceRoot":""}