Compare commits
8 Commits
Madara0330
...
f4588561bf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4588561bf | ||
|
|
34696e69c9 | ||
|
|
f96aa1a348 | ||
|
|
fb715be932 | ||
|
|
cb8d06f512 | ||
|
|
9aa0e1d9af | ||
|
|
769e551698 | ||
|
|
b9608fdcd7 |
41
.github/workflows/docker.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: Docker CI/CD
|
||||||
|
# Apache 2.0 by Dmitrii yawaflua Shimanskii
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "master", "develop", "main" ]
|
||||||
|
paths-ignore:
|
||||||
|
- 'README.md'
|
||||||
|
- '*.md'
|
||||||
|
jobs:
|
||||||
|
compose:
|
||||||
|
name: Push Docker image to ghcr.io
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: Check out the repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract metadata (tags, labels) for Docker
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
ghcr.io/${{ github.repository }}
|
||||||
|
|
||||||
|
- name: Build and push API
|
||||||
|
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: Dockerfile
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 359 KiB |
|
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 219 KiB After Width: | Height: | Size: 50 KiB |
@@ -24,7 +24,7 @@ function Footer() {
|
|||||||
className="footer__logo font-inter-regular"
|
className="footer__logo font-inter-regular"
|
||||||
onClick={() => handlePageChange("/")}
|
onClick={() => handlePageChange("/")}
|
||||||
>
|
>
|
||||||
OOO "ALMA-VID"
|
Ткаченко НН
|
||||||
</Link>
|
</Link>
|
||||||
<div className="footer-info font-inter-bold">
|
<div className="footer-info font-inter-bold">
|
||||||
<Link to="/objects" onClick={() => handlePageChange("/objects")}>
|
<Link to="/objects" onClick={() => handlePageChange("/objects")}>
|
||||||
|
|||||||
@@ -6,6 +6,17 @@ function Object(props) {
|
|||||||
const [needsExpansion, setNeedsExpansion] = useState(false);
|
const [needsExpansion, setNeedsExpansion] = useState(false);
|
||||||
const contentRef = useRef(null);
|
const contentRef = useRef(null);
|
||||||
|
|
||||||
|
const handleCardClick = (e) => {
|
||||||
|
// Don't redirect if user clicked on the expand button
|
||||||
|
if (e.target.closest('.item__expand-btn')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props.cianUrl) {
|
||||||
|
window.open(props.cianUrl, '_blank');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const checkExpansion = () => {
|
const checkExpansion = () => {
|
||||||
if (!props.desc || !props.address || !contentRef.current) {
|
if (!props.desc || !props.address || !contentRef.current) {
|
||||||
@@ -36,7 +47,11 @@ function Object(props) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`item ${isExpanded ? "item--expanded" : ""}`}>
|
<div
|
||||||
|
className={`item ${isExpanded ? "item--expanded" : ""} ${props.cianUrl ? "item--clickable" : ""}`}
|
||||||
|
onClick={handleCardClick}
|
||||||
|
style={{ cursor: props.cianUrl ? 'pointer' : 'default' }}
|
||||||
|
>
|
||||||
<img className="item__image" src={props.image} alt="квартира" />
|
<img className="item__image" src={props.image} alt="квартира" />
|
||||||
<div className="item__info font-inter-bold">
|
<div className="item__info font-inter-bold">
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -20,6 +20,16 @@
|
|||||||
transition: height 0.6s cubic-bezier(0.4, 0, 0.2, 1), min-height 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: height 0.6s cubic-bezier(0.4, 0, 0.2, 1), min-height 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&--clickable {
|
||||||
|
cursor: pointer;
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media (min-width: 1800px) {
|
@media (min-width: 1800px) {
|
||||||
height: 480px;
|
height: 480px;
|
||||||
|
|
||||||
|
|||||||
@@ -86,18 +86,21 @@ const SliderComponent = () => {
|
|||||||
price="2 500 000 ₽"
|
price="2 500 000 ₽"
|
||||||
desc="2-комн. кв., 47 м², 1/2 этаж"
|
desc="2-комн. кв., 47 м², 1/2 этаж"
|
||||||
address="Челябинская область, Челябинск, Лазурная улица, 14А, район Металлургический, микрорайон Северо-Западный"
|
address="Челябинская область, Челябинск, Лазурная улица, 14А, район Металлургический, микрорайон Северо-Западный"
|
||||||
|
cianUrl="https://cian.ru/sale/flat/310187199/"
|
||||||
/>
|
/>
|
||||||
<Object
|
<Object
|
||||||
image={objectPicTwo}
|
image={objectPicTwo}
|
||||||
price="4 200 000 ₽"
|
price="4 200 000 ₽"
|
||||||
desc="3-комн. кв., 77 м², 4/4 этаж"
|
desc="3-комн. кв., 77 м², 4/4 этаж"
|
||||||
address="Челябинская область, Челябинск, улица Ярослава Гашека, 20, район Ленинский, микрорайон Центральный"
|
address="Челябинская область, Челябинск, улица Ярослава Гашека, 20, район Ленинский, микрорайон Центральный"
|
||||||
|
cianUrl="https://cian.ru/"
|
||||||
/>
|
/>
|
||||||
<Object
|
<Object
|
||||||
image={objectPicThree}
|
image={objectPicThree}
|
||||||
price="4 900 000 ₽"
|
price="4 900 000 ₽"
|
||||||
desc="Квартира-студия, 27,6 м², 19/25 этаж"
|
desc="Квартира-студия, 27,6 м², 19/25 этаж"
|
||||||
address="Свердловская область, Екатеринбург, улица Студенческая, 80, район Верх-Исетский, микрорайон Уралмаш"
|
address="Свердловская область, Екатеринбург, улица Студенческая, 80, район Верх-Исетский, микрорайон Уралмаш"
|
||||||
|
cianUrl="https://cian.ru/"
|
||||||
/>
|
/>
|
||||||
</Slider>
|
</Slider>
|
||||||
</div>
|
</div>
|
||||||
@@ -114,6 +117,7 @@ const SliderComponent = () => {
|
|||||||
price={object.price}
|
price={object.price}
|
||||||
desc={object.title}
|
desc={object.title}
|
||||||
address={object.address}
|
address={object.address}
|
||||||
|
cianUrl={object.cianUrl}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</Slider>
|
</Slider>
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ export const CONTACTS = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const API_CONFIG = {
|
export const API_CONFIG = {
|
||||||
baseURL: "https://almavid.ngr1.ru",
|
baseURL: "https://api.almavid.ru",
|
||||||
endpoints: {
|
endpoints: {
|
||||||
feedback: "/api/feedback/send",
|
feedback: "/api/feedback/send",
|
||||||
rental: "/api/rental/send",
|
rental: "/api/rental/send",
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ function About() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="about__title font-inter-semibold">
|
<div className="about__title font-inter-semibold">
|
||||||
Об {CONTACTS.companyName} <span>{CONTACTS.companyNameShort}</span>
|
Об {CONTACTS.companyName}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||