about summary refs log tree commit diff
path: root/src/view/com/util/images/image-crop-picker/ImageCropPicker.web.tsx
blob: d632590d666ce9e109265752290ccad4a5434da3 (plain) (blame)
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
/// <reference lib="dom" />

import {CropImageModal} from 'state/models/shell-ui'
import {PickerOpts, CameraOpts, CropperOpts, PickedMedia} from './types'
export type {PickedMedia} from './types'
import {RootStoreModel} from 'state/index'

interface PickedFile {
  uri: string
  path: string
  size: number
}

export async function openPicker(
  store: RootStoreModel,
  opts: PickerOpts,
): Promise<PickedMedia[] | PickedMedia> {
  const res = await selectFile(opts)
  return new Promise((resolve, reject) => {
    store.shell.openModal(
      new CropImageModal(res.uri, (img?: PickedMedia) => {
        if (img) {
          resolve(img)
        } else {
          reject(new Error('Canceled'))
        }
      }),
    )
  })
}

export async function openCamera(
  _store: RootStoreModel,
  _opts: CameraOpts,
): Promise<PickedMedia> {
  // const mediaType = opts.mediaType || 'photo' TODO
  throw new Error('TODO')
}

export async function openCropper(
  _store: RootStoreModel,
  _opts: CropperOpts,
): Promise<PickedMedia> {
  // const mediaType = opts.mediaType || 'photo' TODO
  throw new Error('TODO')
}

function selectFile(opts: PickerOpts): Promise<PickedFile> {
  return new Promise((resolve, reject) => {
    var input = document.createElement('input')
    input.type = 'file'
    input.accept = opts.mediaType === 'photo' ? 'image/*' : '*/*'
    input.onchange = e => {
      const target = e.target as HTMLInputElement
      const file = target?.files?.[0]
      if (!file) {
        return reject(new Error('Canceled'))
      }

      var reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = readerEvent => {
        if (!readerEvent.target) {
          return reject(new Error('Canceled'))
        }
        resolve({
          uri: readerEvent.target.result as string,
          path: file.name,
          size: file.size,
        })
      }
    }
    input.click()
  })
}