// Copyright 2019-2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import * as React from 'react';
import type { FileWithPath } from 'react-dropzone';
import * as styles from './DropZone.scss';
import { useI18n } from '../util/i18n';
import { useStickerDropzone } from '../util/useStickerDropzone';

export type Props = {
  readonly inner?: boolean;
  readonly label: string;
  onDrop(files: Array<string>): unknown;
  onDragActive?(active: boolean): unknown;
};

const getClassName = ({ inner }: Props, isDragActive: boolean) => {
  if (inner) {
    return styles.base;
  }

  if (isDragActive) {
    return styles.active;
  }

  return styles.standalone;
};

export const DropZone: React.ComponentType<Props> = props => {
  const { inner, label, onDrop, onDragActive } = props;
  const i18n = useI18n();

  const handleDrop = React.useCallback(
    (files: ReadonlyArray<FileWithPath>) => {
      onDrop(files.map(({ path }) => path));
    },
    [onDrop]
  );

  const { getRootProps, getInputProps, isDragActive } =
    useStickerDropzone(handleDrop);

  React.useEffect(() => {
    if (onDragActive) {
      onDragActive(isDragActive);
    }
  }, [isDragActive, onDragActive]);

  return (
    <div
      {...getRootProps({ className: getClassName(props, isDragActive) })}
      role="button"
      area-label={label}
    >
      <input {...getInputProps()} />
      <svg viewBox="0 0 36 36" width="36px" height="36px">
        <path d="M32 17.25H18.75V4h-1.5v13.25H4v1.5h13.25V32h1.5V18.75H32v-1.5z" />
      </svg>
      {!inner ? (
        <p className={styles.text}>
          {isDragActive
            ? i18n('StickerCreator--DropZone--activeText')
            : i18n('StickerCreator--DropZone--staticText')}
        </p>
      ) : null}
    </div>
  );
};
