Skip to content

Commit 3c48bf1

Browse files
authored
Merge pull request #53 from iranpsc/fix/ui-resp
Fix/UI resp
2 parents 35b9c2b + b27d2f7 commit 3c48bf1

143 files changed

Lines changed: 2482 additions & 3561 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package-lock.json

Lines changed: 601 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"@use-gesture/react": "^10.3.0",
3636
"axios": "^1.2.1",
3737
"compressorjs": "^1.2.1",
38-
"deck.gl-leaflet": "^1.2.1",
38+
"dompurify": "^3.3.0",
3939
"drei": "^2.2.21",
4040
"esbuild": "^0.19.2",
4141
"i18next": "^23.15.1",
@@ -91,6 +91,7 @@
9191
},
9292
"devDependencies": {
9393
"@sentry/cli": "latest",
94+
"@svgr/cli": "^8.1.0",
9495
"@types/react": "^18.0.28",
9596
"@types/react-dom": "^18.0.11",
9697
"@vitejs/plugin-react": "^4.0.0",

src/App.jsx

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ import { LoaderProvider } from "./services/reducers/LoaderProvider.jsx";
2727
import RotateDevice from "./components/RotateDevice";
2828
import Error410Modal from "./components/Error410Modal";
2929
import { useAppHeight } from "./hooks/useAppHeight.js";
30+
import { ScrollDirectionProvider } from "./services/reducers/ScrollDirectionContext.jsx";
3031

3132
const Container = styled.section`
3233
display: flex;
34+
overflow-y: hidden;
3335
width: 100%;
3436
height: var(--app-height);
3537
flex-direction: row;
@@ -45,7 +47,7 @@ const Container = styled.section`
4547
`;
4648

4749
function App() {
48-
useAppHeight();
50+
useAppHeight();
4951

5052
console.log(useTranslation());
5153
useLayoutEffect(() => {
@@ -64,44 +66,48 @@ function App() {
6466
}, []);
6567

6668
return (
67-
<LoaderProvider>
68-
<MapProvider>
69-
<ThemeProviderContext>
70-
<LanguageProvider>
71-
<UserProvider>
72-
<WalletProvider>
73-
<FollowProvider>
74-
<SelectedEnvironmentProvider>
75-
<MapContextProvider>
76-
<AlertProvider>
77-
<BrowserRouter>
78-
<RotateDevice />
79-
<Routers />
80-
<Container>
81-
<MenuContextProvider>
82-
<Menu />
83-
</MenuContextProvider>
84-
<MapTreeD />
85-
<StatusBar />
86-
</Container>
87-
<Error410Modal />
88-
<Toaster
89-
containerStyle={{ zIndex: 100000, marginBottom: 48 }}
90-
position="bottom-right"
91-
/>
92-
</BrowserRouter>
93-
</AlertProvider>
94-
</MapContextProvider>
95-
</SelectedEnvironmentProvider>
96-
</FollowProvider>
97-
</WalletProvider>
98-
</UserProvider>
99-
</LanguageProvider>
100-
</ThemeProviderContext>
101-
</MapProvider>
102-
</LoaderProvider>
69+
<ScrollDirectionProvider>
70+
<LoaderProvider>
71+
<MapProvider>
72+
<ThemeProviderContext>
73+
<LanguageProvider>
74+
<UserProvider>
75+
<WalletProvider>
76+
<FollowProvider>
77+
<SelectedEnvironmentProvider>
78+
<MapContextProvider>
79+
<AlertProvider>
80+
<BrowserRouter>
81+
<RotateDevice />
82+
<Routers />
83+
<Container>
84+
<MenuContextProvider>
85+
<Menu />
86+
</MenuContextProvider>
87+
<MapTreeD />
88+
<StatusBar />
89+
</Container>
90+
<Error410Modal />
91+
<Toaster
92+
containerStyle={{
93+
zIndex: 100000,
94+
marginBottom: 48,
95+
}}
96+
position="bottom-right"
97+
/>
98+
</BrowserRouter>
99+
</AlertProvider>
100+
</MapContextProvider>
101+
</SelectedEnvironmentProvider>
102+
</FollowProvider>
103+
</WalletProvider>
104+
</UserProvider>
105+
</LanguageProvider>
106+
</ThemeProviderContext>
107+
</MapProvider>
108+
</LoaderProvider>
109+
</ScrollDirectionProvider>
103110
);
104111
}
105112

106-
107113
export default App;
31.2 KB
Loading

src/assets/svg/message.svg

Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// src/components/common/Container.jsx
2+
import styled from "styled-components";
3+
import { useRef, useEffect } from "react";
4+
import { useScrollDirection } from "../../hooks/useScrollDirection";
5+
import { useScrollDirectionContext } from "../../services/reducers/ScrollDirectionContext";
6+
7+
const StyledContainer = styled.div`
8+
padding: 15px;
9+
width: 100%;
10+
height: 100%;
11+
overflow-y: auto;
12+
scroll-behavior: smooth;
13+
14+
@media (max-height: 500px) and (max-width: 1000px) {
15+
padding-bottom: 30px;
16+
}
17+
`;
18+
19+
export default function BaseContainer({ children, className }) {
20+
const ref = useRef(null);
21+
const isScrollingDown = useScrollDirection(ref);
22+
const { updateScrollDirection } = useScrollDirectionContext();
23+
24+
useEffect(() => {
25+
updateScrollDirection(isScrollingDown);
26+
}, [isScrollingDown, updateScrollDirection]);
27+
28+
return (
29+
<StyledContainer ref={ref} className={className}>
30+
{children}
31+
</StyledContainer>
32+
);
33+
}

src/components/Common/Dropdown.jsx

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
import { useState, useEffect, useRef } from "react";
2+
import styled, { css } from "styled-components";
3+
import { MdKeyboardArrowDown } from "react-icons/md";
4+
import { getFieldTranslationByNames } from "../../services/Utility";
5+
6+
const DropdownContainer = styled.div`
7+
position: relative;
8+
width: 100%;
9+
font-size: 16px;
10+
white-space: nowrap;
11+
`;
12+
13+
const DropdownButton = styled.div`
14+
padding: 10px 12px;
15+
border-radius: 5px;
16+
border: 1px solid #454545;
17+
background-color: ${({ theme }) =>
18+
theme.colors.newColors.otherColors.inputBg};
19+
color: #84858f;
20+
cursor: pointer;
21+
display: flex;
22+
justify-content: space-between;
23+
align-items: center;
24+
`;
25+
26+
const ArrowIcon = styled(MdKeyboardArrowDown)`
27+
font-size: 20px;
28+
color: #84858f;
29+
transition: transform 0.25s ease;
30+
${({ isOpen }) =>
31+
isOpen &&
32+
css`
33+
transform: rotate(180deg);
34+
`}
35+
`;
36+
37+
const DropdownList = styled.div`
38+
position: absolute;
39+
top: 100%;
40+
left: 0;
41+
width: 100%;
42+
background-color: ${({ theme }) =>
43+
theme.colors.newColors.otherColors.inputBg};
44+
border-radius: 5px;
45+
border: 1px solid #454545;
46+
max-height: 200px;
47+
overflow-y: auto;
48+
z-index: 10;
49+
`;
50+
51+
const DropdownItem = styled.div`
52+
padding: 10px 12px;
53+
color: #84858f;
54+
cursor: pointer;
55+
56+
&:hover {
57+
color: white;
58+
background-color: ${({ theme }) => theme.colors.shades[80]};
59+
}
60+
`;
61+
62+
const SearchInput = styled.input`
63+
width: 92%;
64+
font-size: 16px;
65+
padding: 10px 12px;
66+
border: none;
67+
border-bottom: 1px solid #454545;
68+
background-color: ${({ theme }) =>
69+
theme.colors.newColors.otherColors.inputBg};
70+
color: #84858f;
71+
outline: none;
72+
`;
73+
const Dropdown = ({
74+
options = [],
75+
selected,
76+
onSelect,
77+
placeholder = "please select",
78+
searchable = false,
79+
disSelectOption = true,
80+
}) => {
81+
const [isOpen, setIsOpen] = useState(false);
82+
const [searchTerm, setSearchTerm] = useState("");
83+
const dropdownRef = useRef(null);
84+
const optionsWithPlaceholder = disSelectOption
85+
? [placeholder, ...options]
86+
: options;
87+
88+
const filteredOptions = searchable
89+
? optionsWithPlaceholder.filter((option) =>
90+
(typeof option === "string" ? option : option.label)
91+
.toLowerCase()
92+
.includes(searchTerm.toLowerCase())
93+
)
94+
: optionsWithPlaceholder;
95+
96+
const handleOptionClick = (option) => {
97+
const value = typeof option === "string" ? option : option.value;
98+
if (disSelectOption && option === placeholder) {
99+
onSelect(null);
100+
} else {
101+
onSelect(value);
102+
}
103+
setIsOpen(false);
104+
setSearchTerm("");
105+
};
106+
107+
useEffect(() => {
108+
const handleClickOutside = (event) => {
109+
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
110+
setIsOpen(false);
111+
}
112+
};
113+
document.addEventListener("mousedown", handleClickOutside);
114+
return () => document.removeEventListener("mousedown", handleClickOutside);
115+
}, []);
116+
117+
return (
118+
<DropdownContainer ref={dropdownRef}>
119+
<DropdownButton onClick={() => setIsOpen(!isOpen)}>
120+
{selected || placeholder}
121+
<ArrowIcon isOpen={isOpen} />
122+
</DropdownButton>
123+
124+
{isOpen && (
125+
<DropdownList>
126+
{searchable && (
127+
<SearchInput
128+
type="text"
129+
placeholder={getFieldTranslationByNames("57")}
130+
value={searchTerm}
131+
onChange={(e) => setSearchTerm(e.target.value)}
132+
/>
133+
)}
134+
135+
{filteredOptions.map((option, index) => (
136+
<DropdownItem key={index} onClick={() => handleOptionClick(option)}>
137+
{typeof option === "string" ? option : option.label}
138+
</DropdownItem>
139+
))}
140+
</DropdownList>
141+
)}
142+
</DropdownContainer>
143+
);
144+
};
145+
146+
export default Dropdown;

src/components/DropDownLang/index.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,12 @@ const DropdownMenu = styled.div`
5858
`;
5959

6060
const DropdownItem = styled.div`
61+
cursor: pointer;
6162
padding: 0 50px;
6263
color: ${({ isSelected }) => (isSelected ? "#000" : "#858585")};
63-
font-weight: ${({ isSelected }) => (isSelected ? "bold" : "normal")};
64+
65+
font-weight: ${({ isSelected }) => (isSelected ? "bold" : "normal")};
66+
6467
`;
6568

6669
const Tooltip = styled.div`

src/components/Education/Content.jsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { FaChevronCircleLeft } from "react-icons/fa";
22
import styled from "styled-components";
33

44
const Container = styled.div`
5-
padding-bottom: 5px;
6-
padding-right: 10px;
5+
padding: 0 20px;
6+
margin: 0 5px;
77
height: ${(props) => (props.show ? "160px" : "")};
88
overflow-y: auto;
99
@@ -32,7 +32,7 @@ const Container = styled.div`
3232
h2 {
3333
font-size: 18px;
3434
font-weight: 500;
35-
color: #ffffff;
35+
color: ${(props)=>{props.theme.colors.newColors.shades.title}};
3636
margin-top: 7px;
3737
margin-bottom: 10px;
3838
}
@@ -83,7 +83,9 @@ const Content = ({ show, setShow, data }) => {
8383
return (
8484
<Container show={show}>
8585
<div>
86-
<h2>{data?.title}</h2>
86+
87+
{data?.title && <h2>{data.title}</h2>}
88+
8789
{show ? (
8890
<Icon>
8991
<div />

src/components/Education/Header.jsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { IoIosClose } from "react-icons/io";
22
import { TbMinimize } from "react-icons/tb";
33
import styled from "styled-components";
4-
import { ReactComponent as Exit } from "../../assets/svg/close.svg";
54
import { getFieldTranslationByNames } from "../../services/Utility";
5+
import { ExitIcon } from "../Icons/IconsHeader";
66
const Div = styled.div`
77
position: relative;
88
display: flex;
@@ -19,6 +19,7 @@ const Div = styled.div`
1919
const HeaderWrapper = styled.div`
2020
display: flex;
2121
align-items: center;
22+
2223
width: 100%;
2324
justify-content: space-between;
2425
@@ -53,11 +54,6 @@ const Icons = styled.div`
5354
}
5455
`;
5556

56-
const ExitIcon = styled(Exit)`
57-
width: 40px;
58-
height: 40px;
59-
cursor: pointer;
60-
`;
6157

6258
const Header = ({ show, setOpenEducation, setSize, title }) => {
6359
const handleMinimizeClick = (event) => {
@@ -73,7 +69,7 @@ const Header = ({ show, setOpenEducation, setSize, title }) => {
7369
<Text>
7470
{title
7571
? getFieldTranslationByNames(title[0], title[1])
76-
: getFieldTranslationByNames("479")}
72+
: getFieldTranslationByNames("1455")}
7773
</Text>
7874
<Icons>
7975
<Div onClick={handleMinimizeClick}>

0 commit comments

Comments
 (0)