summaryrefslogtreecommitdiff
path: root/client/src/pages/Update/Biometric/Biometric.jsx
blob: 10b277632b8045f631fd5b85673c4873811fbb65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* eslint-disable space-before-function-paren */
import React, { useState, useEffect } from 'react'
import SubmitButton from '../../../components/SubmitButton/SubmitButton'
import PhotoCapture from '../PhotoCapture/PhotoCapture'
import Fingerprint from '../Fingerprint/Fingerprint'
import IrisScan from '../IrisScan/IrisScan'
import BiometricSelect from '../BiometricSelect/BiometricSelect'
import BackButton from '../../../components/BackButton/BackButton'
import { userContext } from '../../../context/User'
import * as cocoSsd from '@tensorflow-models/coco-ssd'
import * as tf from '@tensorflow/tfjs'
import { ToastContainer, toast } from 'react-toastify'
import 'react-toastify/dist/ReactToastify.css'
import { useTranslation } from 'react-i18next'

const Biometric = () => {
  const { t } = useTranslation()
  const [page, setPage] = useState(4)
  const { userData, oriUserData, setUserData } = userContext()

  const [model, setModel] = useState()

  async function loadModel() {
    try {
      const model = await cocoSsd.load()
      setModel(model)
      console.log('setloadedModel')
    } catch (err) {
      console.log(err)
      console.log('failed load model')
    }
  }

  useEffect(() => {
    tf.ready().then(() => {
      loadModel()
    })
  }, [])

  let predictions = []
  async function predictionFunction() {
    predictions = await model.detect(document.getElementById('img'))
    console.log(predictions)
    if (predictions.length > 0) {
      console.log(predictions)
      console.log(predictions[0])
    }
    return predictions
  }

  const conditionalComponent = () => {
    switch (page) {
      case 0:
        return <PhotoCapture />
      case 1:
        return <Fingerprint />
      case 2:
        return <IrisScan />
      default:
        return <BiometricSelect page={page} setPage={setPage} />
    }
  }

  const handleBack = () => {
    if (!userData.photo) {
      setUserData({ ...userData, photo: oriUserData.photo })
    }
    setPage(4) // DUMMY VALUE 4
  }

  const handleSubmit = () => {
    predictionFunction()
    if (predictions.length === 0) {
      toast.warning(t('PLEASE_WAIT'), {
        timeout: 1000
      })
    }
    console.log('befoer start')
    setTimeout(() => {
      if (predictions.length > 0) {
        if (!userData.photo) {
          setUserData({ ...userData, photo: oriUserData.photo })
        } else if (
          predictions[0].class === 'person' &&
          predictions[0].score > 0.8
        ) {
          setPage(4)
        } else {
          toast.error(t('PLEASE_CAPTURE_CLEAR_PHOTOGRAPH'))
        }
      } else {
        toast.error(t('PLEASE_CAPTURE_CLEAR_PHOTOGRAPH'))
      }
    }, 1000)
  }

  const conditionalButton = () => {
    switch (page) {
      case 0:
        return (
          <>
            <SubmitButton onClick={() => handleSubmit()} />
            <BackButton onClick={() => handleBack()} />
          </>
        )
      case 1:
        return (
          <>
            <SubmitButton onClick={() => setPage(4)} />
            <BackButton onClick={() => setPage(4)} />
          </>
        )
      case 2:
        return (
          <>
            <SubmitButton onClick={() => setPage(4)} />
            <BackButton onClick={() => setPage(4)} />
          </>
        )
    }
  }
  return (
    <>
      <ToastContainer
        autoClose={1000}
        hideProgressBar={true}
        theme={'colored'}
      />
      {conditionalComponent()}
      {conditionalButton()}
    </>
  )
}

export default Biometric