All files / app/features/auth/visibility ProfileVisibility.tsx

0% Statements 0/24
0% Branches 0/1
0% Functions 0/6
0% Lines 0/24

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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128                                                                                                                                                                                                                                                               
import {
  FormControl,
  FormControlLabel,
  Radio,
  RadioGroup,
  Typography,
} from "@mui/material";
import Alert from "components/Alert";
import Button from "components/Button";
import { accountInfoQueryKey } from "features/queryKeys";
import { Empty } from "google-protobuf/google/protobuf/empty_pb";
import { RpcError } from "grpc-web";
import { Trans, useTranslation } from "i18n";
import { AUTH, GLOBAL } from "i18n/namespaces";
import { GetAccountInfoRes, ProfilePublicVisibility } from "proto/account_pb";
import { useEffect } from "react";
import { Controller, useForm } from "react-hook-form";
import { useMutation, useQueryClient } from "react-query";
import { service } from "service";
 
type ProfileVisibilityProps = {
  accountInfo: GetAccountInfoRes.AsObject;
  className?: string;
};
 
export default function ProfileVisibility({
  className,
  accountInfo,
}: ProfileVisibilityProps) {
  const { t } = useTranslation([GLOBAL, AUTH]);
 
  const { handleSubmit, reset, control } = useForm<{
    choice: ProfilePublicVisibility;
  }>();
 
  const onSubmit = handleSubmit(({ choice }) => {
    mutate(choice);
  });
 
  const queryClient = useQueryClient();
  const { error, isLoading, mutate } = useMutation<
    Empty,
    RpcError,
    ProfilePublicVisibility
  >(service.account.setProfilePublicVisibility, {
    onSuccess: () => {
      queryClient.invalidateQueries(accountInfoQueryKey);
    },
  });
 
  const choices: [number, string][] = [
    [
      ProfilePublicVisibility.PROFILE_PUBLIC_VISIBILITY_NOTHING,
      "auth:profile_visibility.visiblility_options.nothing",
    ],
    [
      ProfilePublicVisibility.PROFILE_PUBLIC_VISIBILITY_MAP_ONLY,
      "auth:profile_visibility.visiblility_options.map_only",
    ],
    // [
    //   ProfilePublicVisibility.PROFILE_PUBLIC_VISIBILITY_LIMITED,
    //   "auth:profile_visibility.visiblility_options.limited",
    // ],
    // [
    //   ProfilePublicVisibility.PROFILE_PUBLIC_VISIBILITY_MOST,
    //   "auth:profile_visibility.visiblility_options.most",
    // ],
    // [
    //   ProfilePublicVisibility.PROFILE_PUBLIC_VISIBILITY_FULL,
    //   "auth:profile_visibility.visiblility_options.full_profile",
    // ],
  ];
 
  useEffect(() => {
    reset({ choice: accountInfo.profilePublicVisibility });
  }, [accountInfo, reset]);
 
  return (
    <div className={className}>
      <Typography variant="h2">{t("auth:profile_visibility.title")}</Typography>
      <Typography variant="body1">
        {t("auth:profile_visibility.choose")}
      </Typography>
      {error && <Alert severity="error">{error.message}</Alert>}
      <form onSubmit={onSubmit}>
        <Controller
          control={control}
          name="choice"
          defaultValue={accountInfo.profilePublicVisibility}
          render={({ field }) => (
            <FormControl component="fieldset" sx={{ mb: 2, display: "block" }}>
              <RadioGroup
                {...field}
                row
                onChange={(event, newValue) => field.onChange(Number(newValue))}
                sx={{ marginBlockStart: 1 }}
              >
                {choices.map(([setting, translationKey]) => (
                  <FormControlLabel
                    key={setting}
                    value={setting}
                    control={<Radio />}
                    label={
                      <Trans
                        t={t}
                        i18nKey={translationKey}
                        components={{ "1": <strong /> }}
                      />
                    }
                  />
                ))}
              </RadioGroup>
            </FormControl>
          )}
        />
        <Button
          type="submit"
          variant="contained"
          color="primary"
          loading={isLoading}
        >
          {t("global:save")}
        </Button>
      </form>
    </div>
  );
}