All files / app/features/communities NewPlaceForm.tsx

0% Statements 0/28
0% Branches 0/7
0% Functions 0/6
0% Lines 0/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                                                                                                                                                                                                                             
import Alert from "components/Alert";
import Button from "components/Button";
import CircularProgress from "components/CircularProgress";
import EditLocationMap from "components/EditLocationMap";
import ImageInput from "components/ImageInput";
import TextField from "components/TextField";
import ProfileMarkdownInput from "features/profile/ProfileMarkdownInput";
import { RpcError } from "grpc-web";
import { useRouter } from "next/router";
import { Page, PageType } from "proto/pages_pb";
import React from "react";
import { Controller, useForm } from "react-hook-form";
import { useMutation } from "react-query";
import { routeToGuide, routeToPlace } from "routes";
import { service } from "service";
 
type NewPlaceInputs = {
  title: string;
  content: string;
  address: string;
  lat: number;
  lng: number;
  photoKey?: string;
};
 
export default function NewPlaceForm() {
  const { control, register, handleSubmit, setValue, errors } =
    useForm<NewPlaceInputs>({
      mode: "onBlur",
      shouldUnregister: false,
    });
 
  const router = useRouter();
 
  const {
    mutate: createPlace,
    isLoading: isCreateLoading,
    error: createError,
  } = useMutation<Page.AsObject, RpcError, NewPlaceInputs>(
    ({ title, content, address, lat, lng, photoKey }: NewPlaceInputs) =>
      service.pages.createPlace(title, content, address, lat, lng, photoKey),
    {
      onSuccess: (page) => {
        router.push(
          page.type === PageType.PAGE_TYPE_PLACE
            ? routeToPlace(page.pageId, page.slug)
            : routeToGuide(page.pageId, page.slug)
        );
      },
    }
  );
 
  const onSubmit = handleSubmit((data: NewPlaceInputs) => createPlace(data));
 
  return (
    <>
      {createError && <Alert severity="error">{createError?.message}</Alert>}
      {isCreateLoading ? (
        <CircularProgress />
      ) : (
        <form onSubmit={onSubmit}>
          <TextField
            id="new-place-title"
            name="title"
            label="Place Title"
            inputRef={register({
              required: "Enter a page title",
            })}
            helperText={errors?.title?.message}
          />
          <ImageInput
            type="rect"
            alt="Place photo"
            control={control}
            id="place-photo"
            name="photoKey"
          />
          <ProfileMarkdownInput
            id="content"
            label="Place content"
            control={control}
            name="content"
          />
 
          <Controller
            name="address"
            control={control}
            render={() => (
              <EditLocationMap
                exact
                updateLocation={(location) => {
                  Iif (location) {
                    // TODO: error handling
                    setValue("address", location.address);
                    setValue("lat", location.lat);
                    setValue("lng", location.lng);
                  }
                }}
              />
            )}
          />
 
          <Button onClick={onSubmit} loading={isCreateLoading}>
            Create page
          </Button>
        </form>
      )}
    </>
  );
}