All files / src/components/world WorldStatusBar.tsx

0% Statements 0/44
0% Branches 0/19
0% Functions 0/17
0% Lines 0/41

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                                                                                                                                                                                                                                                           
import React, { useCallback, useEffect, useMemo, useState } from "react";
import { useAppDispatch, useAppSelector } from "store/hooks";
import l10n from "shared/lib/lang/l10n";
import { sceneSelectors } from "store/features/entities/entitiesState";
import { sceneName } from "shared/lib/entities/entitiesHelpers";
import settingsActions from "store/features/settings/settingsActions";
import styled, { css } from "styled-components";
import { PillButton } from "ui/buttons/PillButton";
 
const Wrapper = styled.div`
  position: absolute;
  display: flex;
  align-items: center;
  bottom: 25px;
  left: 10px;
  z-index: 11;
  padding-left: 5px;
`;
 
interface ContainerProps {
  $hide?: boolean;
}
 
const Container = styled.div<ContainerProps>`
  color: ${(props) => props.theme.colors.text};
  font-size: ${(props) => props.theme.typography.fontSize};
  background: ${(props) => props.theme.colors.background};
  box-shadow: 0 0 0 4px ${(props) => props.theme.colors.background};
  border-radius: 16px;
  margin-right: 15px;
  height: 19px;
  line-height: 19px;
  margin-right: 15px;
 
  transition: opacity 0.3s ease-in-out;
  opacity: 1;
 
  ${(props) =>
    props.$hide
      ? css`
          opacity: 0;
        `
      : ""}
`;
 
const Text = styled.div`
  color: ${(props) => props.theme.colors.text};
  padding: 0 5px;
`;
 
const Monospace = styled.span`
  font-family: monospace;
`;
 
const WorldStatusBar = () => {
  const dispatch = useAppDispatch();
  const sceneId = useAppSelector((state) => state.editor.hover.sceneId);
  const x = useAppSelector((state) => state.editor.hover.x);
  const y = useAppSelector((state) => state.editor.hover.y);
 
  const scene = useAppSelector((state) =>
    sceneSelectors.selectById(state, sceneId)
  );
  const sceneIndex = useAppSelector((state) =>
    sceneSelectors.selectIds(state).indexOf(sceneId)
  );
  const hoverSceneName = useMemo(() => {
    return scene && sceneName(scene, sceneIndex);
  }, [scene, sceneIndex]);
  const canPreviewAsMono = useAppSelector(
    (state) => state.project.present.settings.colorMode === "mixed"
  );
  const previewAsMono = useAppSelector(
    (state) => canPreviewAsMono && state.project.present.settings.previewAsMono
  );
 
  const onTogglePreviewAsMono = useCallback(() => {
    dispatch(
      settingsActions.editSettings({
        previewAsMono: !previewAsMono,
      })
    );
  }, [dispatch, previewAsMono]);
 
  const [hoverLabel, setHoverLabel] = useState({
    sceneName: "",
    x: "00",
    y: "00",
  });
 
  useEffect(() => {
    Iif (hoverSceneName) {
      setHoverLabel({
        sceneName: hoverSceneName,
        x: String(x ?? 0).padStart(2, "0"),
        y: String(y ?? 0).padStart(2, "0"),
      });
    }
  }, [hoverSceneName, x, y]);
 
  return (
    <Wrapper>
      {canPreviewAsMono && (
        <Container>
          <PillButton
            variant={previewAsMono ? "primary" : "normal"}
            onClick={onTogglePreviewAsMono}
          >
            {l10n("FIELD_PREVIEW_AS_MONO")}
          </PillButton>
        </Container>
      )}
      <Container $hide={!hoverSceneName}>
        <Text>
          {hoverLabel.sceneName}
          {" : "}
          {l10n("FIELD_X")}=<Monospace>{hoverLabel.x}</Monospace>{" "}
          {l10n("FIELD_Y")}=<Monospace>{hoverLabel.y}</Monospace>
        </Text>
      </Container>
    </Wrapper>
  );
};
 
export default WorldStatusBar;