fix merge conflict

This commit is contained in:
Денис Сарапулов 2023-05-15 21:41:02 +10:00
commit 67140144d7
82 changed files with 27634 additions and 17472 deletions

BIN
.DS_Store vendored

Binary file not shown.

4
.gitignore vendored
View File

@ -27,4 +27,8 @@ local_settings.py
.env .env
db.sqlite3 db.sqlite3
# macOS moment
pairent_backend/.DS_Store pairent_backend/.DS_Store
# macOS moment жиза
.DS_Store

18
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,18 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug django server",
"type": "python",
"request": "launch",
"program": "manage.py",
"console": "integratedTerminal",
"args": ["runserver"],
"cwd": "${workspaceFolder}/pairent_backend",
"justMyCode": true
}
]
}

Binary file not shown.

View File

@ -4,16 +4,33 @@ import time, datetime
from django.db import models from django.db import models
from pairent_app.models import Apartament from pairent_app.models import Apartament, User
factory.Faker.override_default_locale('ru_RU'); factory.Faker.override_default_locale('ru_RU');
class OpenID_Address(factory.declarations.BaseDeclaration):
def evaluate(self, instance, step, extra):
return ''.join(random.choices(list('abcdef12345678990'), k=6)) + "@vvsu.ru";
class PhoneNumber(factory.declarations.BaseDeclaration): class PhoneNumber(factory.declarations.BaseDeclaration):
def evaluate(self, instance, step, extra): def evaluate(self, instance, step, extra):
return '+799' + str(random.randint(0, 99999999)).zfill(8); return '+799' + str(random.randint(0, 99999999)).zfill(8);
class CSV(factory.declarations.BaseDeclaration):
def __init__(self, min, max, count_min, count_max):
self.min = min; self.max = max;
self.count_min = count_min;
self.count_max = count_max;
super().__init__();
def evaluate(self, instance, step, extra):
len_ = random.randint(self.count_min, self.count_max);
out = [];
for i in range(len_): out.append(str(random.randint(self.min, self.max)));
return ','.join(out);
class Random(factory.declarations.BaseDeclaration): class Random(factory.declarations.BaseDeclaration):
def __init__(self, min, max = None, multiply = 1): def __init__(self, min, max = None, multiply = 1, list = None):
if (max == None): if (max == None):
self.min = 0; self.min = 0;
self.max = min; self.max = min;
@ -21,17 +38,26 @@ class Random(factory.declarations.BaseDeclaration):
self.min = min; self.min = min;
self.max = max; self.max = max;
self.multiply = multiply; self.multiply = multiply;
self.list = list;
super().__init__(); super().__init__();
def evaluate(self, instance, step, extra): def evaluate(self, instance, step, extra):
if (type(self.list) == list):
return random.choice(self.list);
if (self.multiply != None): if (self.multiply != None):
return random.randint(self.min, self.max) * self.multiply; return random.randint(self.min, self.max) * self.multiply;
return random.randint(self.min, self.max); return random.randint(self.min, self.max);
class Date(factory.declarations.BaseDeclaration): class Date(factory.declarations.BaseDeclaration):
def __init__(self, min_year = 2022, max_year = datetime.date.today().year):
self.min_year = min_year;
self.max_year = max_year;
super().__init__();
def evaluate(self, instance, step, extra): def evaluate(self, instance, step, extra):
# year_before = time.time() - (60 * 60 * 24 * 30 * 12); return datetime.datetime(random.randint(self.min_year, self.max_year), random.randint(1,12), random.randint(1,27)).strftime("%G-%m-%d");
return datetime.datetime(2023, random.randint(1,12), random.randint(1,27)).strftime("%G-%m-%d");
class ApartmentFactory(factory.django.DjangoModelFactory): class ApartmentFactory(factory.django.DjangoModelFactory):
@ -82,3 +108,24 @@ class ApartmentFactory(factory.django.DjangoModelFactory):
# views = [] # factory.Faker('random_number') # views = [] # factory.Faker('random_number')
dateCreate = Date() dateCreate = Date()
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
favorites_apartments = CSV(1, 100, 1, 16);
comparison_apartments = CSV(1, 100, 1, 5);
psych_test_result = Random(20, 90);
openid_addr = OpenID_Address();
name = factory.faker.Faker('name');
date_of_birth = Date(1980, 2006);
about_me = factory.faker.Faker('sentence');
gender = Random(0,0,0, ['f', 'm', 'n', '?'])
phone = PhoneNumber()
email = OpenID_Address()
telegram = '@uwu'
discord = '@uwu' # они поменяли формат
city = Random(0,0,0, ['Владивосток', 'Хабаровск', 'Урюпинск', 'Мухосранск', 'Нью-Йорк'])
role = 's'

View File

@ -1,8 +1,10 @@
# Generated by Django 4.2.1 on 2023-05-12 12:45 # Generated by Django 4.2.1 on 2023-05-12 12:45
import django.core.validators import django.core.validators
from django.core.validators import RegexValidator, MaxValueValidator
from django.db import migrations, models from django.db import migrations, models
from pairent_app.models import User
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -14,14 +16,20 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='User', name='User',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('favorites_apartments', models.CharField(max_length=100, help_text="Избранные квартиры (CSV)")),
('favorites_apartaments', models.CharField(max_length=100, verbose_name='Избранные квартиры')), ('comparison_apartments', models.CharField(max_length=100, help_text="Квартиры для сравнения (CSV)")),
('apartaments_for_comparison', models.CharField(max_length=100, verbose_name='Квартиры для сравнения')), ('psych_test_result', models.IntegerField(validators=[MaxValueValidator(100)], null=True, help_text="Результат психологического теста")),
('psych_test_result', models.IntegerField(null=True, validators=[django.core.validators.MaxValueValidator(100)], verbose_name='Результат психологического теста')), ('openid_addr', models.CharField(max_length=1000, null=False, help_text='Адрес Open ID Connect (login@provider.com, для ВВГУ - login@vvsu.ru)')),
], ('name', models.CharField(max_length=256, help_text='ФИО Пользователя')),
options={ ('date_of_birth', models.DateField(help_text='Дата рождения пользователя')),
'verbose_name': 'Пользователь', ('about_me', models.CharField(max_length=1000, help_text='Поле "О Себе"')),
'verbose_name_plural': 'Пользователи', ('gender', models.CharField(max_length=1, help_text='Пол пользователя (f,m,n,?)')),
}, ('phone', models.CharField(max_length=30, help_text='Телефон пользователя в международном формате (+00000000)', null=True)),
), ('email', models.CharField(max_length=1000, help_text='Почтовый ящик пользователя в формате user@example.com', null=True)),
('telegram', models.CharField(max_length=1000, help_text='Телеграм пользователя', null=True)),
('discord', models.CharField(max_length=1000, help_text='Дискорд ник пользователя', null=True)),
('city', models.CharField(max_length=1000, help_text='Город пользователя', null=True)),
('role', models.CharField(max_length=1, help_text='Роль пользователя (s - student, a - admin, m - moderator)', null=False))
]
)
] ]

View File

@ -81,10 +81,26 @@ class Photo(models.Model):
# TODO: Add auth # TODO: Add auth
class User(models.Model): class User(models.Model):
"""Тестовая модель данных для избранных и сравнения""" """Модель данных пользователя"""
favorites_apartaments = models.CharField(max_length=100, verbose_name="Избранные квартиры")
apartaments_for_comparison = models.CharField(max_length=100, verbose_name="Квартиры для сравнения") favorites_apartments = models.CharField(max_length=100, verbose_name="Избранные квартиры (CSV)")
comparison_apartments = models.CharField(max_length=100, verbose_name="Квартиры для сравнения (CSV)")
psych_test_result = models.IntegerField(validators=[MaxValueValidator(100)], null=True, verbose_name="Результат психологического теста") psych_test_result = models.IntegerField(validators=[MaxValueValidator(100)], null=True, verbose_name="Результат психологического теста")
openid_addr = models.CharField(max_length=1000, null=False, verbose_name='Адрес Open ID Connect (login@provider.com, для ВВГУ - login@vvsu.ru)')
name = models.CharField(max_length=256, verbose_name='ФИО Пользователя')
date_of_birth = models.DateField(verbose_name='Дата рождения пользователя')
about_me = models.CharField(max_length=1000, verbose_name='Поле "О Себе"')
gender = models.CharField(max_length=1, verbose_name='Пол пользователя (f,m,n,?)')
phone = models.CharField(max_length=30, verbose_name='Телефон пользователя в международном формате (+00000000)', null=True)
email = models.CharField(max_length=1000, verbose_name='Почтовый ящик пользователя в формате user@example.com', null=True)
telegram = models.CharField(max_length=1000, verbose_name='Телеграм пользователя', null=True)
discord = models.CharField(max_length=1000, verbose_name='Дискорд ник пользователя', null=True)
# as in "City wok"
city = models.CharField(max_length=1000, verbose_name='Город пользователя', null=True)
role = models.CharField(max_length=1, verbose_name='Роль пользователя (s - student, a - admin, m - moderator)', null=False)
class Meta: class Meta:
verbose_name = "Пользователь" verbose_name = "Пользователь"

View File

@ -22,3 +22,8 @@ class PsychTestAddResultSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = User model = User
fields = ("psych_test_result",) fields = ("psych_test_result",)
class PublicUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
exclude = ('favorites_apartments', 'comparison_apartments')

View File

@ -1,4 +1,5 @@
from django.urls import path from django.urls import path, re_path
# from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
from . import views from . import views
@ -9,5 +10,7 @@ urlpatterns = format_suffix_patterns([
path("apartaments/comparison/", views.ApartamentGetManyViewSet.as_view({'get': 'retrieve'})), # пример: apartaments/comparison/?user_id=1 user_id - id пользователя path("apartaments/comparison/", views.ApartamentGetManyViewSet.as_view({'get': 'retrieve'})), # пример: apartaments/comparison/?user_id=1 user_id - id пользователя
path("apartaments/favorite/", views.ApartamentGetManyViewSet.as_view({'get': 'list'})), # пример: apartaments/favorite/?user_id=1 user_id - id пользователя path("apartaments/favorite/", views.ApartamentGetManyViewSet.as_view({'get': 'list'})), # пример: apartaments/favorite/?user_id=1 user_id - id пользователя
path("apartaments/filters/", views.ApartmentFilter.as_view({'post': 'list'})), path("apartaments/filters/", views.ApartmentFilter.as_view({'post': 'list'})),
path("psych_test/add_result/<int:pk>", views.PsychTestAddResultViewSet.as_view({'patch': 'update'})) # пример: psych_test/add_result/1/?result=50 result - результат псих теста пользователя path("psych_test/add_result/<int:pk>", views.PsychTestAddResultViewSet.as_view({'patch': 'update'})), # пример: psych_test/add_result/1/?result=50 result - результат псих теста пользователя
path("users/get_compatible", views.CompatibleUsersView.as_view({'post': 'list'})),
re_path(r'^auth/vvsu/', views.VVSUAuthProxy),
]) ])

View File

@ -3,14 +3,19 @@ from rest_framework.response import Response
from rest_framework.views import APIView, View from rest_framework.views import APIView, View
from rest_framework.request import Request from rest_framework.request import Request
from django.http import HttpResponseBadRequest from django.http import HttpResponseBadRequest, HttpResponse
from django.db.models.query import QuerySet
from django.core.validators import validate_email
from django.core.exceptions import ValidationError
from .models import Apartament, User from .models import Apartament, User
from .serializer import (ApartamentListSerializer, from .serializer import (ApartamentListSerializer,
ApartamentDetailSerializer, ApartamentDetailSerializer,
PsychTestAddResultSerializer) PsychTestAddResultSerializer,
PublicUserSerializer)
import json import json, math, random, re, requests
class ApartamentViewSet(viewsets.ReadOnlyModelViewSet): class ApartamentViewSet(viewsets.ReadOnlyModelViewSet):
"""Вывод списка квартир или отдельной квартиры""" """Вывод списка квартир или отдельной квартиры"""
@ -92,3 +97,58 @@ class PsychTestAddResultViewSet(viewsets.ViewSet):
user.update(psych_test_result=result) user.update(psych_test_result=result)
return Response(PsychTestAddResultSerializer(User.objects.get(pk=pk)).data) return Response(PsychTestAddResultSerializer(User.objects.get(pk=pk)).data)
class CompatibleUsersView(viewsets.ViewSet):
def list(self, req: Request):
user_data = dict(req.data);
# TODO: Verify auth
vvsu_login = user_data['openid'];
# Exclude already viewed users
exclude = [];
if ('exclude' in user_data.keys()):
exclude = user_data['exclude'];
try:
validate_email(vvsu_login);
except ValidationError:
return Request({'error': 'bad login'}, 400);
try:
this_user = User.objects.get(openid_addr=vvsu_login);
except User.DoesNotExist:
return Response({'error': 'user not found'}, 404);
score = this_user.psych_test_result;
users_query = User.objects.all();
users = [];
for user in users_query:
if (abs(user.psych_test_result - score) < 20):
users.append(PublicUserSerializer(user).data);
random.shuffle(users);
users = users[:7];
for i in range(3):
users.append(PublicUserSerializer(random.choice(users_query)).data);
random.shuffle(users);
return Response(users);
def VVSUAuthProxy(req: Request):
proxy = 'https://vvsu.ru/connect' + req.path[len('/api/auth/vvsu'):];
preq = requests.request(req.method, proxy, headers={
'User-Agent': 'OIDC Client / Pairent',
'Origin': 'http://pairent.vvsu.ru',
'Referer': 'http://pairent.vvsu.ru'
});
resp = HttpResponse(preq.content);
resp.headers['Content-Type'] = preq.headers['Content-Type'];
return resp;

View File

@ -2,3 +2,5 @@ mysqlclient
django django
djangorestframework djangorestframework
django-cors-headers django-cors-headers
Pillow
requests

File diff suppressed because it is too large Load Diff

View File

@ -5,11 +5,13 @@
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"axios": "^1.4.0", "axios": "^1.4.0",
"bootstrap": "^5.2.3",
"bootstrap-icons": "^1.10.5", "bootstrap-icons": "^1.10.5",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"formik": "^2.2.9", "formik": "^2.2.9",
"react": "^18.2.0", "react": "^18.2.0",
"react-awesome-slider": "^4.1.0", "react-awesome-slider": "^4.1.0",
"react-bootstrap": "^2.7.4",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-router-dom": "^6.11.0", "react-router-dom": "^6.11.0",
"react-spinners": "^0.13.8", "react-spinners": "^0.13.8",

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.0625 5H18.75V3.125C18.75 1.375 14.875 0 10 0C5.125 0 1.25 1.375 1.25 3.125V5H0.9375C0.419922 5 0 5.41953 0 5.9375V9.0625C0 9.58008 0.419922 10 0.9375 10H1.25V16.25C1.25 16.9402 1.80977 17.5 2.5 17.5V18.75C2.5 19.4402 3.05977 20 3.75 20H5C5.69023 20 6.25 19.4402 6.25 18.75V17.5H13.75V18.75C13.75 19.4402 14.3098 20 15 20H16.25C16.9402 20 17.5 19.4402 17.5 18.75V17.5H17.75C18.375 17.5 18.75 17 18.75 16.5V10H19.0625C19.5801 10 20 9.58008 20 9.0625V5.9375C20 5.41953 19.5801 5 19.0625 5ZM4.375 15.625C3.68477 15.625 3.125 15.0652 3.125 14.375C3.125 13.6848 3.68477 13.125 4.375 13.125C5.06523 13.125 5.625 13.6848 5.625 14.375C5.625 15.0652 5.06523 15.625 4.375 15.625ZM5 11.25C4.30977 11.25 3.75 10.6902 3.75 10V5C3.75 4.30977 4.30977 3.75 5 3.75H15C15.6902 3.75 16.25 4.30977 16.25 5V10C16.25 10.6902 15.6902 11.25 15 11.25H5ZM15.625 15.625C14.9348 15.625 14.375 15.0652 14.375 14.375C14.375 13.6848 14.9348 13.125 15.625 13.125C16.3152 13.125 16.875 13.6848 16.875 14.375C16.875 15.0652 16.3152 15.625 15.625 15.625Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="royalblue" viewBox="0 0 16 16"><path fill="royalblue" fill-rule="evenodd" d="M7.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L13.293 8 7.646 2.354a.5.5 0 0 1 0-.708z"/><path fill="royalblue" fill-rule="evenodd" d="M3.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L9.293 8 3.646 2.354a.5.5 0 0 1 0-.708z"/></svg>

After

Width:  |  Height:  |  Size: 439 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-double-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M3.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L9.293 8 3.646 2.354a.5.5 0 0 1 0-.708z"/>
<path fill-rule="evenodd" d="M7.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L13.293 8 7.646 2.354a.5.5 0 0 1 0-.708z"/>
</svg>

After

Width:  |  Height:  |  Size: 450 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-caret-right" viewBox="0 0 16 16">
<path d="M6 12.796V3.204L11.481 8 6 12.796zm.659.753 5.48-4.796a1 1 0 0 0 0-1.506L6.66 2.451C6.011 1.885 5 2.345 5 3.204v9.592a1 1 0 0 0 1.659.753z"/>
</svg>

After

Width:  |  Height:  |  Size: 289 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 8.33333V11.6667H15V8.33333C15 6.49479 15.8969 5 17 5H18C18 2.23958 16.6562 0 15 0H5C3.34375 0 2 2.23958 2 5H3C4.10313 5 5 6.49479 5 8.33333ZM18 6.66667H17C16.4469 6.66667 16 7.41146 16 8.33333V13.3333H4V8.33333C4 7.41146 3.55312 6.66667 3 6.66667H2C0.896875 6.66667 0 8.16146 0 10C0 11.2292 0.40625 12.2917 1 12.8698V19.1667C1 19.625 1.225 20 1.5 20H3.5C3.775 20 4 19.625 4 19.1667V18.3333H16V19.1667C16 19.625 16.225 20 16.5 20H18.5C18.775 20 19 19.625 19 19.1667V12.8698C19.5938 12.2917 20 11.2292 20 10C20 8.16146 19.1031 6.66667 18 6.66667Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 676 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="20" viewBox="0 0 16 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.99943 6.25C9.8413 6.25 11.3331 4.85156 11.3331 3.125C11.3331 1.39844 9.8413 0 7.99943 0C6.15755 0 4.66571 1.39844 4.66571 3.125C4.66571 4.85156 6.15755 6.25 7.99943 6.25ZM5.77417 15.9688L6.84096 14.7188L4.27817 12.7188L2.36545 14.9609C1.8904 15.5156 1.8779 16.3047 2.33212 16.875L4.33234 19.375C4.66155 19.7852 5.1616 20 5.66583 20C6.0117 20 6.36591 19.8984 6.66594 19.6875C7.40352 19.1719 7.54937 18.1914 6.99931 17.5L5.77417 15.9688ZM11.7207 12.7188L9.15789 14.7188L10.2247 15.9688L8.99954 17.5C8.44948 18.1914 8.59533 19.1719 9.33291 19.6875C9.63295 19.8984 9.98298 20 10.333 20C10.8414 20 11.3415 19.7852 11.6665 19.375L13.6667 16.875C14.121 16.3047 14.1085 15.5156 13.6334 14.9609L11.7207 12.7188ZM15.6961 5.66406C15.1669 4.95703 14.1293 4.78906 13.375 5.28125L11.6832 6.39453C9.48709 7.83984 6.50759 7.83984 4.31567 6.39453L2.62382 5.28516C1.86956 4.78906 0.831945 4.96094 0.302718 5.66406C-0.226508 6.37109 -0.0431541 7.34375 0.706931 7.83984L2.39879 8.95312C3.1072 9.41797 3.87396 9.76953 4.66571 10.043V11.25H11.3331V10.0469C12.1249 9.77344 12.8916 9.42188 13.6001 8.95703L15.2919 7.84375C16.0462 7.34375 16.2254 6.37109 15.6961 5.66406Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="20" viewBox="0 0 24 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.5 3.46562V2.5H14.25C14.6644 2.5 15 2.12708 15 1.66667V0.833333C15 0.372917 14.6644 0 14.25 0H9.75C9.33562 0 9 0.372917 9 0.833333V1.66667C9 2.12708 9.33562 2.5 9.75 2.5H10.5V3.46562C5.41359 4.27656 1.5 9.12396 1.5 15H22.5C22.5 9.12396 18.5864 4.27656 13.5 3.46562ZM23.25 16.6667H0.75C0.335625 16.6667 0 17.0396 0 17.5V19.1667C0 19.6271 0.335625 20 0.75 20H23.25C23.6644 20 24 19.6271 24 19.1667V17.5C24 17.0396 23.6644 16.6667 23.25 16.6667Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 574 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-three-dots" viewBox="0 0 16 16">
<path d="M3 9.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/>
</svg>

After

Width:  |  Height:  |  Size: 275 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="11" viewBox="0 0 16 11" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.9033 4.92779C14.397 1.98861 11.4147 0 8 0C4.58527 0 1.60221 1.99 0.0966517 4.92806C0.0331076 5.05376 0 5.19264 0 5.33348C0 5.47433 0.0331076 5.6132 0.0966517 5.7389C1.60304 8.67807 4.58527 10.6667 8 10.6667C11.4147 10.6667 14.3978 8.67668 15.9033 5.73862C15.9669 5.61292 16 5.47405 16 5.3332C16 5.19236 15.9669 5.05348 15.9033 4.92779ZM8 9.33335C7.20887 9.33335 6.43551 9.09875 5.77771 8.65923C5.11992 8.2197 4.60723 7.59499 4.30447 6.86408C4.00172 6.13317 3.92251 5.32891 4.07685 4.55298C4.23119 3.77706 4.61216 3.06432 5.17157 2.50491C5.73098 1.9455 6.44371 1.56454 7.21964 1.41019C7.99556 1.25585 8.79983 1.33507 9.53074 1.63782C10.2616 1.94057 10.8864 2.45326 11.3259 3.11106C11.7654 3.76886 12 4.54222 12 5.33334C12.0003 5.8587 11.897 6.37896 11.696 6.86438C11.4951 7.3498 11.2005 7.79086 10.829 8.16235C10.4575 8.53383 10.0165 8.82846 9.53104 9.02939C9.04562 9.23032 8.52536 9.33361 8 9.33335ZM8 2.66667C7.76198 2.67 7.5255 2.70541 7.29694 2.77195C7.48534 3.02797 7.57574 3.34303 7.55177 3.65999C7.52779 3.97695 7.39101 4.27483 7.16625 4.49959C6.94148 4.72436 6.64361 4.86113 6.32665 4.88511C6.00969 4.90909 5.69463 4.81868 5.43861 4.63029C5.29282 5.1674 5.31914 5.7367 5.51385 6.25807C5.70857 6.77944 6.06188 7.22662 6.52406 7.53667C6.98623 7.84672 7.534 8.00403 8.09027 7.98646C8.64653 7.96889 9.18328 7.77732 9.62497 7.43871C10.0667 7.10011 10.391 6.63152 10.5525 6.0989C10.7139 5.56628 10.7042 4.99645 10.5248 4.46961C10.3454 3.94278 10.0053 3.48546 9.5524 3.16204C9.09948 2.83861 8.55654 2.66536 8 2.66667Z" fill="#C0C0C0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.7722 5.00008C12.675 5.00008 11.6594 5.17664 10.7621 5.50241L11.2469 0.693497C11.289 0.28569 10.9301 -0.0459455 10.5207 0.0052256C7.40746 0.395845 5.00008 3.03292 5.00008 6.22779C5.00008 7.32504 5.17664 8.34065 5.50241 9.2379L0.693497 8.75315C0.28569 8.71096 -0.0459455 9.06994 0.0052256 9.47931C0.395845 12.5925 3.03292 14.9999 6.22779 14.9999C7.32504 14.9999 8.34065 14.8234 9.2379 14.4976L8.75315 19.3065C8.71213 19.7139 9.06994 20.0459 9.47931 19.9948C12.5925 19.6042 14.9999 16.9671 14.9999 13.7722C14.9999 12.675 14.8234 11.6594 14.4976 10.7621L19.3065 11.2469C19.7143 11.2879 20.0459 10.9301 19.9948 10.5207C19.6042 7.40746 16.9671 5.00008 13.7722 5.00008ZM10 11.25C9.75278 11.25 9.51111 11.1767 9.30555 11.0393C9.09999 10.902 8.93978 10.7068 8.84517 10.4784C8.75056 10.2499 8.72581 9.99862 8.77404 9.75614C8.82227 9.51367 8.94132 9.29095 9.11613 9.11613C9.29095 8.94132 9.51367 8.82227 9.75614 8.77404C9.99862 8.72581 10.2499 8.75056 10.4784 8.84517C10.7068 8.93978 10.902 9.09999 11.0393 9.30555C11.1767 9.51111 11.25 9.75278 11.25 10C11.25 10.3315 11.1183 10.6495 10.8839 10.8839C10.6495 11.1183 10.3315 11.25 10 11.25Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-gender-female" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 1a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM3 5a5 5 0 1 1 5.5 4.975V12h2a.5.5 0 0 1 0 1h-2v2.5a.5.5 0 0 1-1 0V13h-2a.5.5 0 0 1 0-1h2V9.975A5 5 0 0 1 3 5z"/>
</svg>

After

Width:  |  Height:  |  Size: 316 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-gender-male" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M9.5 2a.5.5 0 0 1 0-1h5a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-1 0V2.707L9.871 6.836a5 5 0 1 1-.707-.707L13.293 2H9.5zM6 6a4 4 0 1 0 0 8 4 4 0 0 0 0-8z"/>
</svg>

After

Width:  |  Height:  |  Size: 312 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.25 5V1.25C16.25 0.559766 15.6902 0 15 0H1.25C0.559766 0 0 0.559766 0 1.25V5C0 5.69023 0.559766 6.25 1.25 6.25H15C15.6902 6.25 16.25 5.69023 16.25 5ZM17.5 2.5V7.5C17.5 8.19023 16.9402 8.75 16.25 8.75H10C8.61914 8.75 7.5 9.86914 7.5 11.25V12.5C6.80977 12.5 6.25 13.0598 6.25 13.75V18.75C6.25 19.4402 6.80977 20 7.5 20H10C10.6902 20 11.25 19.4402 11.25 18.75V13.75C11.25 13.0598 10.6902 12.5 10 12.5V11.25H16.25C18.3211 11.25 20 9.57109 20 7.5V5C20 3.61914 18.8809 2.5 17.5 2.5Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 608 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.8571 0H2.14286C0.959821 0 0 0.959821 0 2.14286V17.8571C0 19.0402 0.959821 20 2.14286 20H17.8571C19.0402 20 20 19.0402 20 17.8571V2.14286C20 0.959821 19.0402 0 17.8571 0ZM10.7143 12.8571H8.57143V15C8.57143 15.3929 8.25 15.7143 7.85714 15.7143H6.42857C6.03571 15.7143 5.71429 15.3929 5.71429 15V5C5.71429 4.60714 6.03571 4.28571 6.42857 4.28571H10.7143C13.0759 4.28571 15 6.20982 15 8.57143C15 10.933 13.0759 12.8571 10.7143 12.8571ZM10.7143 7.14286H8.57143V10H10.7143C11.5 10 12.1429 9.35714 12.1429 8.57143C12.1429 7.78571 11.5 7.14286 10.7143 7.14286Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 685 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.0002 8.57161C6.89827 8.57161 2.50027 14.0519 2.50027 17.5112C2.50027 19.0692 3.54753 20 5.30259 20C7.21038 20 8.47013 18.8804 10.0002 18.8804C11.5435 18.8804 12.8068 20 14.6978 20C16.4529 20 17.5001 19.0692 17.5001 17.5112C17.5001 14.0519 13.1021 8.57161 10.0002 8.57161ZM4.24713 8.00867C3.84088 6.46182 2.58934 5.46005 1.45185 5.77076C0.314359 6.08147 -0.278213 7.58725 0.128033 9.1341C0.534279 10.681 1.78583 11.6827 2.92332 11.372C4.0608 11.0613 4.65338 9.55552 4.24713 8.00867ZM7.55647 7.08101C8.76505 6.71762 9.36973 4.85158 8.90724 2.91322C8.44474 0.974853 7.09007 -0.301466 5.88149 0.0619209C4.67291 0.425308 4.06823 2.29135 4.53072 4.22971C4.99322 6.16807 6.34828 7.44484 7.55647 7.08101ZM18.5482 5.77121C17.4107 5.4605 16.1595 6.46227 15.7529 8.00912C15.3466 9.55597 15.9392 11.0617 17.0767 11.3725C18.2142 11.6832 19.4653 10.6814 19.872 9.13455C20.2782 7.5877 19.6856 6.08192 18.5482 5.77121ZM12.4439 7.08101C13.6525 7.44439 15.0072 6.16807 15.4697 4.22971C15.9322 2.29135 15.3275 0.425754 14.1189 0.0619209C12.9103 -0.301913 11.5556 0.974853 11.0932 2.91322C10.6307 4.85158 11.2353 6.71762 12.4439 7.08101Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.08611 2.91356L13.0868 6.91425L4.39948 15.6016L0.832541 15.9953C0.355033 16.0482 -0.0484114 15.6444 0.00471446 15.1669L0.401596 11.5975L9.08611 2.91356ZM15.5612 2.31793L13.6828 0.43946C13.0968 -0.146487 12.1465 -0.146487 11.5605 0.43946L9.79331 2.20668L13.794 6.20737L15.5612 4.44015C16.1472 3.85389 16.1472 2.90388 15.5612 2.31793Z" fill="#CCCCCC"/>
</svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@ -0,0 +1,3 @@
<svg width="14" height="16" viewBox="0 0 14 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 8C9.20938 8 11 6.20937 11 4C11 1.79063 9.20938 0 7 0C4.79063 0 3 1.79063 3 4C3 6.20937 4.79063 8 7 8ZM9.8 9H9.27812C8.58437 9.31875 7.8125 9.5 7 9.5C6.1875 9.5 5.41875 9.31875 4.72188 9H4.2C1.88125 9 0 10.8813 0 13.2V14.5C0 15.3281 0.671875 16 1.5 16H12.5C13.3281 16 14 15.3281 14 14.5V13.2C14 10.8813 12.1187 9 9.8 9Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 450 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.5437 11.3062L12.0436 9.80614C11.8941 9.74241 11.728 9.72899 11.5701 9.76788C11.4123 9.80677 11.2714 9.89587 11.1686 10.0218L9.6186 11.9155C7.18598 10.7686 5.22828 8.81089 4.08132 6.37826L5.9751 4.82824C6.10125 4.72564 6.19054 4.58473 6.22945 4.42684C6.26836 4.26896 6.25477 4.10269 6.19073 3.95322L4.69071 0.453162C4.62043 0.292037 4.49613 0.160484 4.33925 0.0811864C4.18236 0.00188915 4.00273 -0.0201817 3.83132 0.0187795L0.58126 0.768792C0.415998 0.806955 0.26855 0.900007 0.162983 1.03276C0.0574151 1.16551 -3.80697e-05 1.33013 1.8926e-08 1.49974C1.8926e-08 9.51551 6.49699 16 14.5003 16C14.6699 16.0001 14.8346 15.9427 14.9674 15.8371C15.1002 15.7315 15.1933 15.584 15.2315 15.4187L15.9815 12.1687C16.0202 11.9964 15.9977 11.8161 15.9178 11.6587C15.8379 11.5012 15.7056 11.3766 15.5437 11.3062Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 931 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-question-lg" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M4.475 5.458c-.284 0-.514-.237-.47-.517C4.28 3.24 5.576 2 7.825 2c2.25 0 3.767 1.36 3.767 3.215 0 1.344-.665 2.288-1.79 2.973-1.1.659-1.414 1.118-1.414 2.01v.03a.5.5 0 0 1-.5.5h-.77a.5.5 0 0 1-.5-.495l-.003-.2c-.043-1.221.477-2.001 1.645-2.712 1.03-.632 1.397-1.135 1.397-2.028 0-.979-.758-1.698-1.926-1.698-1.009 0-1.71.529-1.938 1.402-.066.254-.278.461-.54.461h-.777ZM7.496 14c.622 0 1.095-.474 1.095-1.09 0-.618-.473-1.092-1.095-1.092-.606 0-1.087.474-1.087 1.091S6.89 14 7.496 14Z"/>
</svg>

After

Width:  |  Height:  |  Size: 655 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.20939 10.2306C7.33564 10.7773 6.73583 11.1929 6.26923 10.9012L4.67799 9.90688L2.691 13.0866C2.17209 13.9169 2.77186 15 3.75045 15H5.78122C6.04009 15 6.24997 15.2099 6.24997 15.4687V17.0312C6.24997 17.2901 6.04009 17.5 5.78122 17.5H3.75447C0.811743 17.5 -0.983878 14.2559 0.574478 11.7625L2.55971 8.58328L0.968892 7.58922C0.496979 7.29442 0.618658 6.57512 1.15948 6.45024L5.4656 5.4561C5.80197 5.37845 6.13751 5.58817 6.21517 5.92446L7.20939 10.2306ZM11.0594 3.08548L12.6723 5.66657L11.0809 6.66098C10.6101 6.95505 10.7293 7.67477 11.2714 7.79997L15.5776 8.7941C15.9163 8.87219 16.25 8.65981 16.3271 8.32575L17.3213 4.01962C17.4462 3.47884 16.8529 3.05404 16.3811 3.349L14.7918 4.34212L13.18 1.7608C11.7143 -0.584237 8.28899 -0.589627 6.81997 1.7608L6.11829 2.88447C5.98119 3.104 6.04798 3.3931 6.26751 3.53029L7.59247 4.35821C7.812 4.4954 8.10122 4.42864 8.23841 4.20911L8.94001 3.08634C9.43657 2.29177 10.5796 2.31775 11.0594 3.08548ZM19.4253 11.7625L18.3505 10.0412C18.2133 9.82156 17.924 9.75473 17.7044 9.89195L16.3817 10.7185C16.1622 10.8557 16.0954 11.1448 16.2326 11.3644L17.3093 13.0875C17.8272 13.9161 17.229 15 16.2493 15H12.5V13.1258C12.5 12.5706 11.8264 12.2905 11.433 12.6839L8.30805 15.8081C8.06395 16.0522 8.06395 16.4479 8.30805 16.692L11.433 19.8165C11.8238 20.2073 12.5 19.9336 12.5 19.3746V17.5H16.2453C19.1856 17.5 20.9849 14.2579 19.4253 11.7625Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.6561 13.4844L18.1473 12.7227L19.3079 12.4492C19.674 12.3633 19.8927 12.0312 19.7945 11.7109L19.6159 11.1289C19.5177 10.8086 19.1383 10.6172 18.7723 10.7031L15.6118 11.4453L12.7594 10L15.6073 8.55859L18.7678 9.30078C19.1338 9.38672 19.5133 9.19531 19.6115 8.875L19.79 8.29297C19.8882 7.97266 19.6695 7.64062 19.3035 7.55469L18.1428 7.28125L19.6516 6.51953C19.982 6.35156 20.0936 5.98438 19.9061 5.69531L19.2142 4.64844C19.0222 4.35938 18.6026 4.26172 18.2723 4.42578L16.7635 5.1875L17.076 4.17188C17.1742 3.85156 16.9554 3.51953 16.5894 3.43359L15.9243 3.27734C15.5582 3.19141 15.1788 3.38281 15.0806 3.70312L14.2325 6.46875L11.4291 7.88281V4.85547L13.8262 2.75781C14.103 2.51562 14.103 2.11719 13.8262 1.875L13.3218 1.43359C13.0451 1.19141 12.5897 1.19141 12.313 1.43359L11.4291 2.20312V0.625C11.4291 0.28125 11.1077 0 10.7149 0H9.28645C8.89362 0 8.57222 0.28125 8.57222 0.625V2.20312L7.69283 1.43359C7.41607 1.19141 6.96075 1.19141 6.68399 1.43359L6.1751 1.875C5.89387 2.11719 5.89387 2.51562 6.1751 2.75781L8.57222 4.85547V7.88281L5.76888 6.46875L4.92074 3.70312C4.82254 3.38281 4.4431 3.19141 4.07706 3.27734L3.41194 3.43359C3.0459 3.51953 2.82717 3.85156 2.92537 4.17188L3.23785 5.1875L1.72905 4.42578C1.39872 4.25781 0.979109 4.35938 0.787161 4.64844L0.0952545 5.69141C-0.0966937 5.98047 0.019368 6.34766 0.349697 6.51562L1.8585 7.27734L0.697882 7.55078C0.327378 7.63672 0.108646 7.96875 0.206852 8.29297L0.385409 8.875C0.483615 9.19531 0.863047 9.38672 1.22909 9.30078L4.38954 8.55859L7.23751 10L4.38954 11.4414L1.22909 10.6992C0.863047 10.6133 0.483615 10.8047 0.385409 11.125L0.206852 11.707C0.108646 12.0273 0.327378 12.3594 0.693419 12.4453L1.85404 12.7188L0.345233 13.4844C0.0149041 13.6523 -0.0966937 14.0195 0.0907906 14.3086L0.782697 15.3555C0.974645 15.6445 1.39425 15.7422 1.72458 15.5781L3.23338 14.8164L2.92091 15.832C2.8227 16.1523 3.04144 16.4844 3.40748 16.5703L4.0726 16.7266C4.43864 16.8125 4.81807 16.6211 4.91628 16.3008L5.76442 13.5352L8.56776 12.1211V15.1484L6.17064 17.2461C5.88941 17.4883 5.88941 17.8867 6.17064 18.1289L6.67506 18.5703C6.95182 18.8125 7.40714 18.8125 7.6839 18.5703L8.56329 17.8008V19.375C8.56329 19.7188 8.88469 20 9.27752 20H10.706C11.0988 20 11.4202 19.7188 11.4202 19.375V17.7969L12.2996 18.5664C12.5763 18.8086 13.0317 18.8086 13.3084 18.5664L13.8129 18.125C14.0896 17.8828 14.0896 17.4844 13.8129 17.2422L11.4291 15.1445V12.1172L14.2325 13.5312L15.0806 16.2969C15.1788 16.6172 15.5582 16.8086 15.9243 16.7227L16.5894 16.5664C16.9554 16.4805 17.1742 16.1484 17.076 15.8281L16.7635 14.8125L18.2723 15.5742C18.6026 15.7422 19.0222 15.6406 19.2142 15.3516L19.9061 14.3047C20.098 14.0195 19.9864 13.6484 19.6561 13.4844Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.38511 12.1488L11.2499 10V3.75H4.99995V10.625L1.61518 13.1488C0.0761189 14.3035 -0.488725 16.4465 0.474166 18.1121C1.18706 19.3457 2.47143 20 3.75307 20C4.5355 20 5.32534 19.7559 5.99995 19.25L6.85385 18.6098C5.68784 16.4465 6.32495 13.6941 8.38511 12.1488ZM11.2499 1.25C11.2499 0.818359 11.3699 0.417969 11.5632 0.0632813C11.4609 0.0359375 11.3613 0 11.2499 0H6.24995C5.55971 0 4.99995 0.559766 4.99995 1.25V2.5H11.2499V1.25ZM18.75 0H13.75C13.0597 0 12.4999 0.559766 12.4999 1.25V2.5H20V1.25C20 0.559766 19.4402 0 18.75 0ZM12.4999 10.625L9.1355 13.1488C7.59643 14.3035 7.03159 16.4465 7.99448 18.1121C8.70737 19.3457 9.97143 20 11.2531 20C12.0355 20 12.8253 19.7559 13.5 19.25L18 15.875C18.6209 15.4093 19.125 14.8054 19.4721 14.1111C19.8192 13.4168 20 12.6512 20 11.875V3.75H12.4999V10.625Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 923 B

View File

@ -0,0 +1,25 @@
<svg width="68" height="72" viewBox="0 0 68 72" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_d_1_738)">
<path d="M4 33.8171C4 50.323 17.3929 63.6342 34 63.6342C50.6071 63.6342 64 50.323 64 33.8171C64 17.3112 50.6071 4 34 4C17.3929 4 4 17.3112 4 33.8171Z" fill="#FFE500"/>
<path d="M14.9229 14.649C18.5658 12.5192 22.9586 12.1998 27.0301 13.5841C27.5658 13.7971 28.4229 11.7738 27.7801 11.5608C23.1729 9.857 18.1372 10.283 13.8515 12.7322C13.2086 13.0517 14.3872 14.9685 14.9229 14.649ZM40.6372 17.8437C44.2801 15.7139 48.6729 15.3945 52.7444 16.7788C53.2801 16.9918 54.1372 14.9685 53.4944 14.7555C48.8872 13.0517 43.8515 13.4776 39.5658 15.9269C38.9229 16.2464 40.1015 18.0567 40.6372 17.8437Z" fill="#917524"/>
<path d="M25.5376 38.8216C31.0019 37.4373 37.0018 38.3957 41.609 41.5904C42.7875 42.3358 40.6447 45.3175 39.4661 44.4656C36.359 42.4423 31.5376 40.9514 26.5019 42.2293C25.2161 42.5488 24.1447 39.2476 25.5376 38.8216Z" fill="#664E27"/>
<path d="M45.5782 32.8582C41.1853 32.8582 37.5425 29.2375 37.5425 24.8714C37.5425 23.0611 38.1853 21.3573 39.1496 20.0794C40.9711 19.547 43.0068 19.334 45.1496 19.334C47.7211 19.334 50.1853 19.7599 52.3282 20.5054C53.1853 21.7832 53.7211 23.2741 53.7211 24.9779C53.6139 29.344 50.0782 32.8582 45.5782 32.8582Z" fill="white"/>
<path d="M46.649 19.334C47.0776 19.9729 47.399 20.7183 47.399 21.5703C47.399 23.8065 45.5776 25.6169 43.3276 25.6169C41.0776 25.6169 39.3633 23.8065 39.3633 21.6768C39.3633 21.0378 39.4704 20.5054 39.7919 19.9729C41.399 19.547 43.2204 19.334 45.149 19.334H46.649Z" fill="#664E27"/>
<path d="M22.4351 32.8582C18.0423 32.8582 14.3994 29.2375 14.3994 24.8714C14.3994 23.0611 15.0423 21.3573 16.0066 20.0794C17.828 19.547 19.8637 19.334 22.0066 19.334C24.578 19.334 27.0423 19.7599 29.1851 20.5054C30.0423 21.7832 30.578 23.2741 30.578 24.9779C30.4708 29.344 26.828 32.8582 22.4351 32.8582Z" fill="white"/>
<path d="M23.4983 19.335C23.9269 19.9739 24.2483 20.7194 24.2483 21.5713C24.2483 23.8076 22.4269 25.6179 20.1769 25.6179C17.9269 25.6179 16.1055 23.8076 16.1055 21.5713C16.1055 20.9324 16.2126 20.3999 16.534 19.8675C18.1412 19.4415 19.9626 19.2285 21.8912 19.2285C22.534 19.335 22.9626 19.335 23.4983 19.335Z" fill="#664E27"/>
<path d="M34.6454 48.7253C30.1454 49.7902 18.6811 51.1746 16.6454 49.0448C15.6811 48.0864 15.8954 46.702 16.2168 44.2528C16.5382 41.8035 14.1811 39.2477 12.4668 39.0348C10.4311 38.8218 9.25252 40.3126 10.0025 42.4424C11.5025 47.2345 8.50252 48.7253 8.28824 52.2395C8.18109 54.2628 7.53824 57.6704 10.6454 62.0365C14.1811 66.935 20.2882 67.0415 22.4311 66.935C24.8954 66.8286 25.9668 66.7221 26.5025 65.6572C27.1454 64.3793 26.8239 64.0598 27.1454 63.6339C27.6811 62.6755 28.0025 62.7819 28.3239 61.6106C28.6454 60.4392 27.7882 59.6937 28.0025 59.1613C28.4311 57.8834 29.5025 58.0964 28.4311 55.1147C32.0739 54.5822 34.4311 54.0498 36.5739 52.7719C40.5382 50.6421 37.1097 48.1929 34.6454 48.7253Z" fill="white"/>
<path d="M18.4649 67.574C14.8221 66.9351 11.8221 65.1247 9.89351 62.4625C6.89351 58.3094 7.1078 55.0082 7.32208 52.7719V52.0265C7.42923 50.5357 7.8578 49.3643 8.39351 48.1929C9.14351 46.4891 9.78637 45.1047 8.92923 42.549C8.50065 41.2711 8.6078 39.9932 9.46494 39.1413C10.2149 38.3959 11.2864 37.9699 12.5721 38.1829H12.6792C14.9292 38.6088 17.5006 41.5905 17.1792 44.4658C16.8578 46.8085 16.7506 47.8734 17.3935 48.5124C17.5006 48.6189 17.8221 48.9383 19.0006 49.0448C23.0721 49.7902 31.1078 48.6189 34.4292 47.8734C34.9649 47.7669 35.6078 47.7669 36.2506 47.8734C37.8578 48.1929 39.0364 49.1513 39.3578 50.3227C39.4649 51.0681 39.4649 52.4525 37.2149 53.7304C35.0721 54.9017 32.8221 55.5407 29.7149 55.9666C30.5721 58.0964 28.5364 58.8418 28.9649 59.6938C29.5006 60.8651 29.3935 61.8236 28.2149 62.9949C27.3578 63.7404 28.4292 64.6988 27.5721 66.1896C26.6078 67.787 25.0006 67.8935 22.6435 67.9999C21.0364 67.8935 19.7506 67.8935 18.4649 67.574ZM10.3221 41.4841C11.0721 44.9982 11.2864 46.2761 10.0007 49.1513C8.07208 52.9849 7.32208 63.8469 18.7864 65.8702C25.7506 67.148 26.8221 65.4442 26.5006 63.6339C26.2864 62.4625 27.2506 62.0365 27.5721 61.6106C28.3221 60.3327 27.2506 59.6938 27.2506 59.1613C27.2506 58.2029 28.2149 58.2029 28.4292 57.2445C28.7506 55.5407 26.6078 54.9017 28.4292 54.7952C31.9649 54.5823 34.3221 53.9433 36.3578 52.559C38.2864 51.2811 36.8935 48.6189 34.3221 49.1513C28.3221 50.4292 19.3221 51.92 16.3221 49.1513C14.9292 47.8734 16.0007 46.3826 15.8935 43.5074C15.6792 39.6737 9.57208 38.1829 10.3221 41.4841Z" fill="#CCCFD4"/>
</g>
<defs>
<filter id="filter0_d_1_738" x="0" y="0" width="68" height="72" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1_738"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1_738" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="20" viewBox="0 0 16 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.3333 1.875C15.7 1.875 16 1.59375 16 1.25V0.625C16 0.28125 15.7 0 15.3333 0H0.666667C0.3 0 0 0.28125 0 0.625V1.25C0 1.59375 0.3 1.875 0.666667 1.875H1.33333V7.99609C0.491667 8.39062 0 8.86328 0 9.375C0 12 1.44167 14.3047 3.61667 15.6445L2.725 18.3867C2.4625 19.1875 3.10417 20 4 20H12C12.8958 20 13.5375 19.1875 13.275 18.3867L12.3833 15.6445C14.5583 14.3047 16 12 16 9.375C16 8.86328 15.5083 8.39062 14.6667 7.99609V1.875H15.3333ZM3.33333 2.8125C3.33333 2.64062 3.48333 2.5 3.66667 2.5H5.66667C5.85 2.5 6 2.64062 6 2.8125V3.4375C6 3.60938 5.85 3.75 5.66667 3.75H3.66667C3.48333 3.75 3.33333 3.60938 3.33333 3.4375V2.8125ZM8 10.625C4.7875 10.625 2.18333 10.0664 2.18333 9.375C2.18333 8.68359 4.7875 8.125 8 8.125C11.2125 8.125 13.8167 8.68359 13.8167 9.375C13.8167 10.0664 11.2125 10.625 8 10.625Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 929 B

View File

@ -0,0 +1,3 @@
<svg width="18" height="20" viewBox="0 0 18 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 3.75V13.75C18 15.774 15.524 17.5 12.7759 17.5L15.3063 19.4422C15.5453 19.6257 15.411 20 15.1071 20H2.89286C2.58838 20 2.45523 19.6252 2.69369 19.4422L5.2241 17.5C2.48384 17.5 0 15.7795 0 13.75V3.75C0 1.67895 2.57143 0 5.14286 0H12.8571C15.4688 0 18 1.67895 18 3.75ZM8.03571 9.0625V4.6875C8.03571 4.16973 7.604 3.75 7.07143 3.75H2.89286C2.36029 3.75 1.92857 4.16973 1.92857 4.6875V9.0625C1.92857 9.58027 2.36029 10 2.89286 10H7.07143C7.604 10 8.03571 9.58027 8.03571 9.0625ZM16.0714 9.0625V4.6875C16.0714 4.16973 15.6397 3.75 15.1071 3.75H10.9286C10.396 3.75 9.96429 4.16973 9.96429 4.6875V9.0625C9.96429 9.58027 10.396 10 10.9286 10H15.1071C15.6397 10 16.0714 9.58027 16.0714 9.0625ZM14.1429 11.25C13.0777 11.25 12.2143 12.0895 12.2143 13.125C12.2143 14.1605 13.0777 15 14.1429 15C15.208 15 16.0714 14.1605 16.0714 13.125C16.0714 12.0895 15.208 11.25 14.1429 11.25ZM3.85714 11.25C2.79201 11.25 1.92857 12.0895 1.92857 13.125C1.92857 14.1605 2.79201 15 3.85714 15C4.92228 15 5.78571 14.1605 5.78571 13.125C5.78571 12.0895 4.92228 11.25 3.85714 11.25Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="20" viewBox="0 0 24 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.2 0H1.8C1.32261 0 0.864773 0.197544 0.527208 0.549175C0.189642 0.900805 0 1.37772 0 1.875L0 14.375C0 14.8723 0.189642 15.3492 0.527208 15.7008C0.864773 16.0525 1.32261 16.25 1.8 16.25H10.8V17.5H4.2C4.04087 17.5 3.88826 17.5658 3.77574 17.6831C3.66321 17.8003 3.6 17.9592 3.6 18.125V19.375C3.6 19.5408 3.66321 19.6997 3.77574 19.8169C3.88826 19.9342 4.04087 20 4.2 20H19.8C19.9591 20 20.1117 19.9342 20.2243 19.8169C20.3368 19.6997 20.4 19.5408 20.4 19.375V18.125C20.4 17.9592 20.3368 17.8003 20.2243 17.6831C20.1117 17.5658 19.9591 17.5 19.8 17.5H13.2V16.25H22.2C22.6774 16.25 23.1352 16.0525 23.4728 15.7008C23.8104 15.3492 24 14.8723 24 14.375V1.875C24 1.37772 23.8104 0.900805 23.4728 0.549175C23.1352 0.197544 22.6774 0 22.2 0ZM21.6 13.75H2.4V2.5H21.6V13.75Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 895 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 8C7.93437 8 9.5 6.21071 9.5 4C9.5 1.78929 7.93437 0 6 0C4.06563 0 2.5 1.78929 2.5 4C2.5 6.21071 4.06563 8 6 8ZM8.4 9.14286H8.14062C7.49062 9.5 6.76875 9.71429 6 9.71429C5.23125 9.71429 4.5125 9.5 3.85938 9.14286H3.6C1.6125 9.14286 0 10.9857 0 13.2571V14.2857C0 15.2321 0.671875 16 1.5 16H10.5C11.3281 16 12 15.2321 12 14.2857V13.2571C12 10.9857 10.3875 9.14286 8.4 9.14286ZM15 8C16.6562 8 18 6.46429 18 4.57143C18 2.67857 16.6562 1.14286 15 1.14286C13.3438 1.14286 12 2.67857 12 4.57143C12 6.46429 13.3438 8 15 8ZM16.5 9.14286H16.3813C15.9469 9.31429 15.4875 9.42857 15 9.42857C14.5125 9.42857 14.0531 9.31429 13.6187 9.14286H13.5C12.8625 9.14286 12.275 9.35357 11.7594 9.69286C12.5219 10.6321 13 11.8786 13 13.2571V14.6286C13 14.7071 12.9844 14.7821 12.9812 14.8571H18.5C19.3281 14.8571 20 14.0893 20 13.1429C20 10.9321 18.4344 9.14286 16.5 9.14286Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 982 B

View File

@ -0,0 +1 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.21115 10H16.7888C17.8665 10 18.4053 11.0199 17.6425 11.6176L9.85668 17.7225C9.38445 18.0925 8.61555 18.0925 8.14332 17.7225L0.357494 11.6176C-0.405347 11.0199 0.133485 10 1.21115 10Z" fill="#000000"/><path d="M1.21115 8H16.7888C17.8665 8 18.4053 6.98014 17.6425 6.38245L9.85668 0.277498C9.38445 -0.0924988 8.61555 -0.0924988 8.14332 0.277498L0.357494 6.38245C-0.405347 6.98014 0.133485 8 1.21115 8Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 529 B

View File

@ -0,0 +1,3 @@
<svg width="24" height="20" viewBox="0 0 24 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.8091 5.48571C17.1652 -1.82991 6.8321 -1.82723 0.190843 5.48571C-0.0589069 5.76071 -0.063782 6.22634 0.177718 6.51161L1.46172 8.02813C1.69197 8.30045 2.06247 8.30625 2.30172 8.04509C7.77372 2.07723 16.2255 2.07589 21.6986 8.04509C21.9379 8.30625 22.3084 8.3 22.5386 8.02813L23.8226 6.51161C24.0637 6.22634 24.0589 5.76071 23.8091 5.48571ZM12 14.2857C10.6743 14.2857 9.59997 15.5647 9.59997 17.1429C9.59997 18.721 10.6743 20 12 20C13.3256 20 14.4 18.721 14.4 17.1429C14.4 15.5647 13.3256 14.2857 12 14.2857ZM19.6001 10.554C15.2779 6.00357 8.71722 6.00848 4.39985 10.554C4.1411 10.8263 4.13285 11.2991 4.37847 11.5875L5.66997 13.1049C5.89497 13.3692 6.25722 13.3871 6.49685 13.1406C9.64497 9.90089 14.3621 9.90804 17.5027 13.1406C17.7424 13.3871 18.1046 13.3696 18.3296 13.1049L19.6211 11.5875C19.8671 11.2991 19.8585 10.8259 19.6001 10.554Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 971 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -15,7 +15,7 @@ export default class ApartamentService {
} }
static async getById(id) { static async getById(id) {
const response = await axios.get(API_ROOT + '/api/apartament/' + id) const response = await axios.get(API_ROOT + '/api/apartament/' + id + '/')
return response; return response;
} }

View File

@ -0,0 +1,17 @@
import axios from 'axios';
import constants from '../constants';
const { API_ROOT } = constants;
class User {
constructor(data) {
this = { ...data, ...this };
}
static async getById(id) {
const data = await axios.post(API_ROOT + '/users/get', { id });
if (data.data['error'])
throw new Error(data.data['error']);
return new User(data.data);
}
}

View File

@ -93,7 +93,7 @@ const ComparisonsApartmentsList = () => {
return ( return (
<> <>
<PaginatedTitle title={"Сравнения квартир"} totalPages={totalPages} page={page} changePage={changePage}/> <PaginatedTitle title={"Сравнения квартир"} totalPages={totalPages} page={page} changePage={changePage} displayPages={true} />
<ApartmentSection> <ApartmentSection>
<ApartmentSectionTitle> <ApartmentSectionTitle>
<ApartmentSectionTitleText style={{height:300}}>Фото</ApartmentSectionTitleText> <ApartmentSectionTitleText style={{height:300}}>Фото</ApartmentSectionTitleText>

View File

@ -52,7 +52,7 @@ const FavoritesApartamentsList = () => {
<h1 style={{textAlign: 'center'}}>Идет загрузка...</h1> <h1 style={{textAlign: 'center'}}>Идет загрузка...</h1>
} }
<ApartmentsList list={apartamentsFavorites}/> <ApartmentsList list={apartamentsFavorites}/>
<Pagination page={page} changePage={changePage} viewAll={viewAll} totalPages={totalPages}/> <Pagination value={page} onChange={changePage} onViewAll={viewAll} viewAllButton={true} pages={totalPages} />
</> </>
); );
}; };

View File

@ -12,6 +12,7 @@
font-weight: 700; font-weight: 700;
font-size: 20px; font-size: 20px;
color: #222; color: #222;
padding-left: 0px;
} }
.viewedTittle span{ .viewedTittle span{
@ -49,5 +50,5 @@
.viewedBlock{ .viewedBlock{
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-top: 27px; margin-top: 8px;
} }

View File

@ -0,0 +1,72 @@
import React, { useEffect, useState } from 'react';
import ApartamentService from '../../API/ApartamentService';
import {useFetching} from '../../hooks/useFetching';
import {getPageCount, getPagesArray} from '../../utils/Pages';
import CardSmallApartament from '../../components/CardSmallApartament';
const RelatedApartment = function () {
const [apartamentsLastView, setApartamentsLastView] = useState([])
const [totalPages, setTotalPages] = useState(0);
const [page, setPage] = useState(1);
const limit = 4;
const [totalCount, setTotalCount] = useState(0);
const [fetchApartaments, isApartamentsLoading, apartamentsError] = useFetching(async (limit) => {
let offset = (page - 1) * limit;
const response = await ApartamentService.getAll(limit, offset);
setApartamentsLastView(response.data.results)
setTotalCount(response.data.count)
setTotalPages(getPageCount(totalCount, limit))
})
useEffect(() => {
fetchApartaments(limit)
}, [page])
const changePageLastView = (page) => {
setPage(page)
}
return(
<>
<section className="viewedSection">
<div className="viewedTittle">
<h2>Похожие объявления <span>{totalCount}</span></h2>
<div className="viewedBtnSection">
<button className="btnViewed">Посмотреть все Похожие</button>
<div className="viewedBtn">
<button className="btnPrevious" onClick={() => changePageLastView(page !== 1 ? page - 1 : page)}>
<svg width="9" height="16" viewBox="0 0 9 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.238707 8.62179L6.83881 15.7424C7.15713 16.0859 7.6732 16.0859 7.99148 15.7424L8.76127 14.9119C9.07904 14.5691 9.07965 14.0134 8.76263 13.6698L3.53193 7.99998L8.76263 2.33019C9.07965 1.98655 9.07904 1.43091 8.76127 1.08808L7.99148 0.257567C7.67316 -0.0858556 7.15709 -0.0858556 6.83881 0.257567L0.238741 7.37821C-0.0795746 7.72159 -0.0795746 8.27837 0.238707 8.62179Z" fill="black"/>
</svg>
</button>
<button className="btnNext" onClick={() => changePageLastView(page < getPagesArray(totalPages).length ? page + 1 : page)}>
<svg width="9" height="16" viewBox="0 0 9 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.76129 8.62179L2.16119 15.7424C1.84287 16.0859 1.3268 16.0859 1.00852 15.7424L0.238729 14.9119C-0.0790435 14.5691 -0.0796547 14.0134 0.237371 13.6698L5.46807 7.99998L0.237371 2.33019C-0.0796547 1.98655 -0.0790435 1.43091 0.238729 1.08808L1.00852 0.257567C1.32684 -0.0858556 1.84291 -0.0858556 2.16119 0.257567L8.76126 7.37821C9.07957 7.72159 9.07957 8.27837 8.76129 8.62179Z" fill="black"/>
</svg>
</button>
</div>
</div>
</div>
<div className="viewedBlock">
{isApartamentsLoading
?
<h1 style={{textAlign: 'center'}}>Идет загрузка...</h1>
:
<>
{apartamentsLastView.map((apartament, index) =>
<>
<CardSmallApartament key={index} results={apartament}/>
</>
)}
</>
}
</div>
</section>
</>
);
}
export default RelatedApartment;

View File

@ -0,0 +1,34 @@
import { styled } from "styled-components";
const BlueButton = styled.button`
background: white;
border: 2px solid royalblue;
border-radius: 12px;
color: royalblue;
font-weight: 600;
line-height: 20px;
transition: 150ms ease;
width: 100%;
font-size: 10.5pt;
height: 36px;
padding: 6px 10px;
clip-path: border-box;
box-sizing: border-box;
& svg {
fill: royalblue;
margin: 0;
margin-right: 6px;
transform: translateY(2px);
}
&:hover {
color: white;
background: royalblue;
}
&:hover svg {
fill: white
}
`;
export default BlueButton;

View File

@ -1,6 +1,6 @@
import styled from 'styled-components'; import styled from 'styled-components';
export default styled.div` export default styled.svg`
width: ${props => props.width ? props.width : 24}px; width: ${props => props.width ? props.width : 24}px;
height: ${props => props.height ? props.height : 24}px; height: ${props => props.height ? props.height : 24}px;
background: url(${props => props.src}); background: url(${props => props.src});
@ -8,6 +8,5 @@ export default styled.div`
background-position: center; background-position: center;
background-size: contain; background-size: contain;
margin: 0 8px; margin: 0 8px;
display: inline-block; display: inline-block
transform: translateY(2px)
`; `;

View File

@ -48,7 +48,7 @@ const ButtonPreviousAndNext = styled.button`
margin-right: 10px; margin-right: 10px;
`; `;
const PaginatedTitle = function ({title, totalPages, page, changePage}) { const PaginatedTitle = function ({title, totalPages, page, changePage, displayPages}) {
let [previousPage, nextPage] = getPreviousAndNextPage(totalPages, page); let [previousPage, nextPage] = getPreviousAndNextPage(totalPages, page);
return( return(
@ -64,12 +64,18 @@ const PaginatedTitle = function ({title, totalPages, page, changePage}) {
</TitleSectionLeftAndRight> </TitleSectionLeftAndRight>
<TitleSectionLeftAndRight> <TitleSectionLeftAndRight>
{
displayPages ?
<>
<ButtonPreviousAndNext onClick={() => changePage(previousPage)}> <ButtonPreviousAndNext onClick={() => changePage(previousPage)}>
<SVGIcon src='/images/icons/left-arrow.svg' width={9} height={16}/> <SVGIcon src='/images/icons/left-arrow.svg' width={9} height={16}/>
</ButtonPreviousAndNext> </ButtonPreviousAndNext>
<ButtonPreviousAndNext onClick={() => changePage(nextPage)}> <ButtonPreviousAndNext onClick={() => changePage(nextPage)}>
<SVGIcon src='/images/icons/right-arrow.svg' width={9} height={16}/> <SVGIcon src='/images/icons/right-arrow.svg' width={9} height={16}/>
</ButtonPreviousAndNext> </ButtonPreviousAndNext>
</>
: null
}
</TitleSectionLeftAndRight> </TitleSectionLeftAndRight>
</TitleSection> </TitleSection>
); );

View File

@ -1,50 +1,182 @@
import React from 'react'; import React, { useState } from 'react';
import styled from 'styled-components'; import styled from 'styled-components';
import ISVGIcon from '../Icon/SVGIcon';
import {getPagesArray, getPreviousAndNextPage} from "../../../utils/Pages"; const SVGIcon = styled(ISVGIcon)`
margin: 0;
const PageButtonContainer = styled.div` transform: translateY(2px);
margin-top: 24px;
display: inline-block;
`; `;
const Pagination = ({totalPages, page, changePage, onChange, viewAll, showAllEnabled}) => { const PageButtonContainer = styled.div`
let pagesArray = getPagesArray(totalPages); margin: 24px auto;
let [previousPage, nextPage] = getPreviousAndNextPage(totalPages, page); display: inline-block;
changePage = onChange ?? changePage; width: 100%;
text-align: center;
`;
const getPagesShow = () => {
let pagesShow = []; const PageButton = styled.button`
for (let index = page - 1, len = page + 14 > totalPages ? totalPages : page + 14; index < len; ++index) { background: #fefefe;
pagesShow.push(pagesArray[index]) border-radius: 6px;
min-width: 32px;
height: 32px;
transition: 100ms ease;
margin-right: 10px;
font-size: 11pt;
${
props => props.is_active ?
`
color: royalblue;
font-weight: 600;
border: 1px solid royalblue;
`
: ''
} }
return pagesShow;
&:hover {
background: #f2f2f2;
} }
&:active {
background: #eeefee;
}
`;
const FastButton = styled(PageButton)`
background: url(/images/icons/dots.svg) no-repeat;
background-position: center;
background-size: 20px;
user-select: none;
&:hover, &:active {
background: url(/images/icons/caret-double-blue.svg) no-repeat;
background-position: center;
background-size: 14px;
}
`;
const range = (start, stop) => {
if (stop < start) throw 'Stop value can\'t be smaller than start value.';
let a = [];
for (let i = start; i != stop; i++)
a.push(i);
return a;
}
// TODO: Needs some work
class Pagination extends React.Component {
static defaultProps = {
onChange: () => {},
disabled: false,
sideButtons: true,
value: 0,
styles: {},
viewAllButton: false,
onViewAll: () => {}
}
/**
* @type {{
* pages: number,
*
* onChange?: (event: number) => void,
* disabled?: boolean,
* sideButtons?: boolean,
* value?: number,
* styles?: React.CSSProperties,
* viewAllButton?: boolean,
* onViewAll?: () => void
* }}
*/
props;
constructor(props) {
super(props);
this.state = {
value: props.value
}
this.value_controlled = props.value != undefined;
this.updateValue = this.updateValue.bind(this);
}
updateValue(new_val) {
if (this.props.pages != 0) {
if (new_val < 0) new_val = 0;
if (new_val > this.props.pages)
new_val = this.props.pages;
}
this.props.onChange(new_val);
if (this.value_controlled)
return;
this.setState({value: new_val});
}
render() {
const { pages } = this.props;
let value = this.state.value;
if (this.value_controlled) value = this.props.value;
return ( return (
<PageButtonContainer> <PageButtonContainer>
{ {
showAllEnabled ? <button className="allBtn" onClick={viewAll}>Показать весь список</button> this.props.viewAllButton ?
<PageButton style={{float: 'left', padding: '0 16px'}}>Показать все</PageButton>
: null
}
{
this.props.sideButtons ?
<PageButton onClick={() => this.updateValue(value - 1)}>
<SVGIcon width='16' height='16' style={{ transform:'rotate(180deg) translateY(-2px)' }} src='/images/icons/caret-right.svg' />
</PageButton>
: null
}
{
range(0, pages).map((el, i) => {
if ( !( i == 0 | i == pages - 1) )
if ( i < value - 2 | i > value + 2 ) {
if ( i == value - 3 | i == value + 3 ) {
return (
<FastButton
style={{transform: i == value - 3 ? 'rotate(180deg)' : ''}}
onClick={() => {
if (i == value - 3) {
this.updateValue(value - 3);
} else
this.updateValue(value + 3);
}}
>
&nbsp;
</FastButton>
);
}
return null;
}
return <PageButton key={i} is_active={value == i} onClick={() => this.updateValue(i)}>{i + 1}</PageButton>
})
}
{
this.props.sideButtons ?
<PageButton onClick={() => this.updateValue(value + 1)}>
<SVGIcon width='16' height='16' src='/images/icons/caret-right.svg' />
</PageButton>
: null : null
} }
<div className="choiceBtn">
<button onClick={() => changePage(previousPage)} className="btnPrevious">
<svg width="9" height="16" viewBox="0 0 9 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.238707 8.62179L6.83881 15.7424C7.15713 16.0859 7.6732 16.0859 7.99148 15.7424L8.76127 14.9119C9.07904 14.5691 9.07965 14.0134 8.76263 13.6698L3.53193 7.99998L8.76263 2.33019C9.07965 1.98655 9.07904 1.43091 8.76127 1.08808L7.99148 0.257567C7.67316 -0.0858556 7.15709 -0.0858556 6.83881 0.257567L0.238741 7.37821C-0.0795746 7.72159 -0.0795746 8.27837 0.238707 8.62179Z" fill="black"/>
</svg>
</button>
{getPagesShow().map(p =>
<button onClick={() => changePage(p)} key={p} className={page === p ? "pageBtn activePage" : "pageBtn"}>{p}</button>
)}
<button onClick={() => changePage(nextPage)} className="btnNext">
<svg width="9" height="16" viewBox="0 0 9 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.76129 8.62179L2.16119 15.7424C1.84287 16.0859 1.3268 16.0859 1.00852 15.7424L0.238729 14.9119C-0.0790435 14.5691 -0.0796547 14.0134 0.237371 13.6698L5.46807 7.99998L0.237371 2.33019C-0.0796547 1.98655 -0.0790435 1.43091 0.238729 1.08808L1.00852 0.257567C1.32684 -0.0858556 1.84291 -0.0858556 2.16119 0.257567L8.76126 7.37821C9.07957 7.72159 9.07957 8.27837 8.76129 8.62179Z" fill="black"/>
</svg>
</button>
</div>
</PageButtonContainer> </PageButtonContainer>
); );
}; }
}
export default Pagination; export default Pagination;

View File

@ -0,0 +1,532 @@
import React, { useEffect, useState } from 'react';
import ApartamentService from '../../API/ApartamentService';
import styled from 'styled-components';
import LastView from '../../components/LastView';
import RelatedApartment from '../../components/RelatedApartment';
import ISVGIcon from '../../components/UI/Icon/SVGIcon';
import { useFetching } from '../../hooks/useFetching';
import { useParams } from 'react-router-dom';
import { Container, Row, Col, Stack } from 'react-bootstrap';
import AwesomeSlider from 'react-awesome-slider';
import AwsSliderStyles from 'react-awesome-slider/src/styles?inline';
import 'bootstrap/dist/css/bootstrap-grid.min.css';
const SVGIcon = styled(ISVGIcon)`
margin-left: 0px;
margin-right: 0px;
`;
const ContainerLeft = styled.div`
width: 800px;
`
const ContainerSlider = styled.div`
width: 800px;
height: 500px;
clip-path: inset(0% 0% 5% 0% round 20px);
`
const DateCreateAndViews = styled.div`
font-size: 15px;
line-height: 18px;
font-weight: 300;
color: #C0C0C0;
margin-bottom: 8px;
display: flex;
align-items: center;
& span {
margin-left: 15px;
font-size: 15px;
line-height: 18px;
font-weight: 300;
color: #C0C0C0;
}
`
const PerimetrsAndRooms = styled.h3`
font-size: 20px;
line-height: 24px;
font-weight: 500;
margin-bottom: 10px;
`
const ButtonFavorites = styled.button`
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 20px;
background: #FFFFFF;
box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.25);
margin-right: 10px;
`
const ButtonComparisons = styled.button`
display: flex;
align-items: center;
justify-content: center;
background: #FFFFFF;
width: 201px;
height: 28px;
box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.25);
border-radius: 8px;
font-style: normal;
font-weight: 500;
font-size: 14px;
margin-bottom: 12px;
`
const PriceDescription = styled.div`
background: #E3F0FF;
border-radius: 20px;
padding: 13px 16px 11px 17px;
`
const PriceTitleText = styled.p`
font-style: normal;
font-weight: 600;
font-size: 16px;
line-height: 18px;
margin-bottom: 15px;
`
const PriceText = styled.h3`
font-size: 15px;
line-height: 18px;
text-align: end;
`
const SeparationLine = styled.div`
height: 1px;
margin-top: 9px;
margin-bottom: 9px;
width: 100%;
background-color: #CCC;
`
const AdditionalItem = styled.div`
width: 256px;
height: 160px;
background: #FFFFFF;
border: 1px solid #C0C0C0;
border-radius: 20px;
padding: 8px;
&:hover {
box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.25);
cursor: pointer;
}
`
const AdditionalImage = styled.img`
width: 240px;
height: 100px;
margin-bottom: 4px;
border-radius: 12px;
`
const AdditionalText = styled.p`
font-weight: 500;
font-size: 16px;
line-height: 15px;
`
const AdditionalTextSpan = styled.span`
font-weight: 500;
font-size: 14px;
line-height: 17px;
color: #BABABA;
`
const DescriptionTitle = styled.h3`
font-weight: 600;
font-size: 20px;
line-height: 24px;
padding-left: 0px;
margin-top: 35px;
margin-bottom: 10px;
`
const Description = styled.p`
font-weight: 500;
font-size: 15px;
line-height: 18px;
`
const RentButton = styled.button`
background: #007EFF;
border-radius: 12px;
height: 36px;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
font-weight: 500;
font-size: 16px;
line-height: 19px;
color: #FFFFFF;
&:hover {
box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.25);
cursor: pointer;
}
`
const ContactButton = styled.button`
border-radius: 12px;
background: #2348CC;
height: 36px;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
font-weight: 500;
font-size: 16px;
line-height: 19px;
color: #FFFFFF;
&:hover {
box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.25);
cursor: pointer;
}
`
const InputNote = styled.input`
border: 1px solid #CCCCCC;
border-radius: 12px;
height: 36px;
width: 100%;
font-weight: 500;
font-size: 15px;
line-height: 18px;
padding-left: 46px;
&::placeholder {
font-weight: 500;
font-size: 15px;
line-height: 18px;
color: #CCCCCC;
}
`
const ApartmentParametersSection = styled.div`
align-items: center;
justify-content: center;
text-align: center;
`
const ApartmentParametersText = styled.p`
font-weight: 500;
font-size: 20px;
line-height: 24px;
color: #000000;
`
const ApartmentParametersTextSmall = styled(ApartmentParametersText)`
font-size: 15px;
line-height: 18px;
`
const ApartmentParametersTitle = styled.p`
font-weight: 300;
font-size: 16px;
line-height: 24px;
color: #C0C0C0;
`
const NoteSection = styled.div`
position: relative;
& input {
padding-left: 30px;
background-image: url("/images/icons/pencil-gray.svg");
background-size: 16px 16px;
background-repeat: no-repeat;
background-position: 8px 0.6rem;
}
`
const ApartmentParametersTable = styled.table`
margin-left: 15px;
width: 100%;
& td {
padding-top: 19px;
}
`
const PriceBlock = (props) => {
return (
<Row>
<Col xs={props.columnsize}>
<PriceTitleText>{props.title}</PriceTitleText>
</Col>
<Col className='end'>
<PriceText>
{props.price}
</PriceText>
</Col>
</Row>
);
}
const ApartmentParameters = (props) => {
return (
<Col>
<ApartmentParametersSection>
<ApartmentParametersText>{props.params}</ApartmentParametersText>
<ApartmentParametersTitle>{props.title}</ApartmentParametersTitle>
</ApartmentParametersSection>
</Col>
);
}
const ApartmentParametersIconized = (props) => {
return (
<Row style={{marginBottom: 16}}>
<Col xs={2} className='d-flex justify-content-center'>
<SVGIcon src={props.icon} width={props.width} height={props.height}/>
</Col>
<Col>
<ApartmentParametersTextSmall>{props.text}</ApartmentParametersTextSmall>
</Col>
</Row>
);
}
const ApartmentParametersDoubleLine = (props) => {
return (
<Row>
<Col xs={1}>
<SVGIcon src={props.iconFirst} width={20} height={20}/>
</Col>
<Col xs={5}>
<ApartmentParametersTextSmall>{props.textFirst}</ApartmentParametersTextSmall>
</Col>
<Col xs={1}>
<SVGIcon src={props.iconSecond} width={20} height={20}/>
</Col>
<Col xs={5}>
<ApartmentParametersTextSmall>{props.textSecond}</ApartmentParametersTextSmall>
</Col>
</Row>
);
}
const IndexApartment = function () {
const params = useParams();
const apartmentID = params.id;
const [apartment, setApartment] = useState([])
const [fetchApartment, isApartmentLoading, apartmentError] = useFetching(async (apartmentID) => {
const response = await ApartamentService.getById(apartmentID);
setApartment(response.data)
})
useEffect(() => {
fetchApartment(apartmentID)
}, [])
return(
<Container fluid="xl" style={{marginBottom: 50, marginTop: 50}}>
<Row>
<Col xs={8}>
<Stack>
<ContainerLeft>
<ContainerSlider>
<AwesomeSlider cssModule={AwsSliderStyles} bullets={false}>
<div data-src='/images/house-s.jpg'/>
<div data-src='/images/house-s-2.jpg'/>
</AwesomeSlider>
</ContainerSlider>
<Row>
<Col xs={4}>
<AdditionalItem>
<AdditionalImage src='/images/plan.png'/>
<AdditionalText>Планировка</AdditionalText>
<AdditionalTextSpan>Схема помещений</AdditionalTextSpan>
</AdditionalItem>
</Col>
<Col xs={4}>
<AdditionalItem>
<AdditionalImage src='/images/location.png'/>
<AdditionalText>Расположение</AdditionalText>
<AdditionalTextSpan>Показать на карте</AdditionalTextSpan>
</AdditionalItem>
</Col>
<Col xs={4}>
<AdditionalItem>
<AdditionalImage src='/images/panorama.png'/>
<AdditionalText>Панорама</AdditionalText>
<AdditionalTextSpan>Обзор вокруг</AdditionalTextSpan>
</AdditionalItem>
</Col>
</Row>
<div>
<DescriptionTitle>Описание</DescriptionTitle>
<Description>{apartment.description}</Description>
</div>
<RelatedApartment/>
<LastView/>
</ContainerLeft>
</Stack>
</Col>
<Col xs={4}>
<Stack>
<div style={{marginBottom: 12}}>
{/* TODO: Добавить параметр кол-ва просмотров */}
<DateCreateAndViews>
{apartment.dateCreate} <span>78</span> <SVGIcon style={{marginLeft: 5}}src='/images/icons/eye.svg' width={16} height={10}></SVGIcon>
</DateCreateAndViews>
</div>
<PerimetrsAndRooms>{apartment.perimetrs} м², {apartment.rooms == 0 ? '' : apartment.rooms}
{apartment.rooms == 0 ? 'Гостинка' :
(apartment.rooms > 1 ? "-х комнатная" : " комнатная")
}
</PerimetrsAndRooms>
<div>
<Row>
<Col xs={10}>
<h1 style={{marginBottom: 12}}>{apartment.price} / мес.</h1>
</Col>
<Col xs={2}>
<ButtonFavorites>
<SVGIcon src='/images/icons/heart.svg' width={18} height={16}/>
</ButtonFavorites>
</Col>
</Row>
</div>
<ButtonComparisons>
<SVGIcon style={{marginRight: 5}} src='/images/icons/stats.svg' width={16} height={12}/>
Добавить к сравнению
</ButtonComparisons>
<PriceDescription>
<Stack>
<PriceBlock columnsize={9} title={"Оплата в первый месяц"} price={`${apartment.price}`}/>
<PriceBlock columnsize={9} title={"Залог"} price={`${apartment.bail}`}/>
<PriceBlock columnsize={9} title={"Комиссия агенству"} price={`${apartment.agencyCommission}`}/>
<PriceBlock columnsize={9} title={"Коммун. услуги"} price={`${apartment.utilitiesPrice}`}/>
</Stack>
<SeparationLine/>
<Stack>
<PriceBlock columnsize={8} title={"Итого"} price={`${apartment.price + apartment.bail + apartment.agencyCommission} ₽ + КУ`}/>
<PriceBlock columnsize={9} title={"Мин. срок аренды"} price={`${apartment.minimumLeasePeriod} мес.`}/>
</Stack>
</PriceDescription>
<Row style={{marginTop: 14}}>
<Col xs={7}>
<RentButton>
<SVGIcon style={{marginRight: 5}} src='/images/icons/two-people.svg' width={20} height={16}/>
Снимать вдвоём
</RentButton>
</Col>
<Col>
<RentButton>
<SVGIcon style={{marginRight: 5}} src='/images/icons/people.svg' width={14} height={16}/>
Снять
</RentButton>
</Col>
</Row>
<ContactButton style={{marginTop: 12}}>
<SVGIcon style={{marginRight: 5}} src='/images/icons/phone-white.svg' width={16} height={16}/>
Показать телефон +7 (xxx) xxx-xx-xx
</ContactButton>
<NoteSection>
<InputNote style={{marginTop: 12}} placeholder='Добавить заметку'/>
</NoteSection>
<SeparationLine style={{marginTop: 17}}/>
<Row>
<ApartmentParameters params={`${apartment.perimetrs} м²`} title={"общая"}/>
<ApartmentParameters params={`${apartment.ceilingHeight} м`} title={"потолки"}/>
<ApartmentParameters params={`${apartment.floor} этаж`} title={`из ${apartment.floorHouse}`}/>
</Row>
<SeparationLine/>
<ApartmentParametersTable>
<tr>
<td>
<ApartmentParametersDoubleLine iconFirst={'/images/icons/chair-dark.svg'} textFirst={"Мебель"}
iconSecond={'/images/icons/paw-dark.svg'} textSecond={"Можно с питомцем"}/>
</td>
</tr>
<tr>
<td>
<ApartmentParametersDoubleLine iconFirst={'/images/icons/tv-dark.svg'} textFirst={"Телевизор"}
iconSecond={'/images/icons/child-dark.svg'} textSecond={"Можно с детьми"}/>
</td>
</tr>
<tr>
<td>
<ApartmentParametersDoubleLine iconFirst={'/images/icons/wifi-dark.svg'} textFirst={"Интернет"}
iconSecond={'/images/icons/toilet-dark.svg'} textSecond={"Санузел"}/>
</td>
</tr>
<tr>
<td>
<ApartmentParametersDoubleLine iconFirst={'/images/icons/snowflake-dark.svg'} textFirst={"Холодильник"}
iconSecond={'/images/icons/socks-dark.svg'} textSecond={"Стиральная машина"}/>
</td>
</tr>
<tr>
<td>
<ApartmentParametersDoubleLine iconFirst={'/images/icons/fan-dark.svg'} textFirst={"Кондиционер"}
iconSecond={'/images/icons/paint-dark.svg'} textSecond={"Свежий ремонт"}/>
</td>
</tr>
</ApartmentParametersTable>
<SeparationLine style={{marginTop: 19}}/>
<ApartmentParametersTable>
<tr>
<td>
<ApartmentParametersDoubleLine iconFirst={'/images/icons/up-down-arrows-dark.svg'} textFirst={"Лифт"}
iconSecond={'/images/icons/parking-dark.svg'} textSecond={"Парковка"}/>
</td>
</tr>
<tr>
<td>
<ApartmentParametersDoubleLine iconFirst={'/images/icons/recycle-dark.svg'} textFirst={"Мусоропровод"}
iconSecond={'/images/icons/dish-dark.svg'} textSecond={"Консьерж"}/>
</td>
</tr>
</ApartmentParametersTable>
<SeparationLine style={{marginTop: 19, marginBottom: 19}}/>
<ApartmentParametersIconized icon={'/images/icons/pin.svg'} width={12} height={20} text={apartment.address}/>
<ApartmentParametersIconized icon={'/images/icons/bus-dark.svg'} width={20} height={20} text={`${apartment.timeToBus} минут до остановки`}/>
<ApartmentParametersIconized icon={'/images/icons/train-dark.svg'} width={20} height={20} text={`${apartment.timeToTrain} минут до станции`}/>
<PriceDescription style={{marginTop: 18}}>
<Row>
<Col xs={2}>
<SVGIcon style={{marginRight: 5}} src='/images/icons/thinking-face.svg' width={60} height={64}/>
</Col>
<Col>
<h4 style={{marginBottom: 4}}>Не подходит квартира?</h4>
Попробуйте сменить настройки поиска на главной странице.
</Col>
</Row>
</PriceDescription>
</Stack>
</Col>
</Row>
</Container>
);
}
export default IndexApartment;

View File

@ -11,7 +11,7 @@ import ApartamentService from "../../API/ApartamentService";
import { HashLoader } from 'react-spinners'; import { HashLoader } from 'react-spinners';
import AwesomeSlider from 'react-awesome-slider'; import AwesomeSlider from 'react-awesome-slider';
import AwsSliderStyles from 'react-awesome-slider/src/styles?inline'; import 'react-awesome-slider/dist/styles.css';
import constants from "../../constants"; import constants from "../../constants";
@ -145,7 +145,7 @@ const Splash = styled.h3`
const SliderContainer = styled.div` const SliderContainer = styled.div`
filter: drop-shadow(0 2px 8px #00000060); filter: drop-shadow(0 2px 8px #00000060);
clip-path: inset(0% 100% 0% 100% round 16px); clip-path: inset(0% 0% 0% 0% round 16px);
& .awssld, .awssld__container { & .awssld, .awssld__container {
width: 1150px; width: 1150px;
@ -373,11 +373,10 @@ export default class IndexPage extends React.Component {
let current_data = this.state.apartments.slice((page * pageSize), (page * pageSize) + pageSize); let current_data = this.state.apartments.slice((page * pageSize), (page * pageSize) + pageSize);
return ( return (
<IndexPageRoot> <IndexPageRoot>
<SliderContainer> <SliderContainer>
<AwesomeSlider cssModule={AwsSliderStyles} bullets={false}> <AwesomeSlider bullets={false}>
<div data-src='/images/house-s.jpg' /> <div data-src='/images/house-s.jpg' />
<div data-src='/images/house-s-2.jpg' /> <div data-src='/images/house-s-2.jpg' />
</AwesomeSlider> </AwesomeSlider>
@ -409,10 +408,9 @@ export default class IndexPage extends React.Component {
} }
<Pagination <Pagination
totalPages={pages} pages={pages}
page={page}
onChange={(page) => this.setState({ page })} onChange={(page) => this.setState({ page })}
showAllEnabled={false} value={page}
/> />
</IndexPageRoot> </IndexPageRoot>
); );

View File

@ -0,0 +1 @@
// TODO: Make a logged in handler

View File

@ -0,0 +1,130 @@
import React from 'react';
import { styled } from 'styled-components';
import BlueButton from '../../components/UI/BlueButton';
import { HashLoader } from 'react-spinners';
import * as OpenID from 'oidc-client-ts';
import constants from '../../constants';
const { API_ROOT } = constants;
const LoginBox = styled.div`
position: fixed;
top: 45%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid #c2c4c2;
border-radius: 12px;
padding: 24px 36px;
background: white;
box-shadow: 0 2px 1px #00000010;
text-align: center;
& h2 {
margin: 0px 0;
}
& hr {
margin: 16px 0;
margin-bottom: 24px;
height: 0px;
border: 0;
border-bottom: 1px solid #c2c4c2;
box-shadow: 0 2px 1px #c2c4c280;
}
& p {
font-size: 8pt;
color: gray;
margin-top: 16px;
}
`;
const LoginButton = styled(BlueButton)`
font-size: 11pt;
width: 250px;
height: 60px;
padding: 16px 20px;
font-size: 11.5pt;
font-weight: 700;
cursor: ${props => props.disabled ? 'default' : 'pointer'};
& svg {
height: 12pt;
margin-left: 6px
}
&:hover {
background: ${props => props.disabled ? 'white' : 'royalblue'};
}
`;
const OIDCConfig = {
onSignIn: () => {},
authority: API_ROOT + '/api/auth/vvsu/',
client_id: 'it-hub-client',
redirect_uri: 'https://pairent.vvsu.ru/sign-in/',
scope: [
'openid',
// 'vvsu_IdUser',
// 'vvsu_IdEmpl',
// 'vvsu_IdStud',
// 'vvsu_login',
// 'given_name',
// 'family_name'
]
};
const VVSULogoSVG = () => {
return <svg xmlns="http://www.w3.org/2000/svg" xmlSpace="preserve" viewBox="0 0 451.5 155.9"><path fillRule="evenodd" d="M408.7 0h42.8L416 102.5l-2.8 8.1c-8.2 23.9-33.9 43.6-58 45.2h-.6c-.8.1-1.6.1-2.5.1H348c-.8 0-1.6 0-2.4-.1h-43l15.7-45.2.3-.8h35.7c9.1 0 19.2-7.8 22.5-17.2l.4-1 1.2-3.5h-32.7c-4.4 0-19.5 0-13.1-18.5l4.4-12.9 3.9-11.2L356.5 0H393l-21.7 62.8H387c2.6-7.5 15.8-45.6 21.7-62.8zm-91.2 0h25.9l-15.7 45.3h-7c-9.6 0-20.1 7.9-23.5 17.4L265 155.9c-.5 0-1-.1-1.5-.1h-43l15.8-45.2 7.8-22.6 14.8-42.5c8.3-24.1 34.4-44 58.6-45.2V0zM208 0h48.7l-20.1 58.1c-3.2 9.1-9.4 15.2-19.4 17.2l16.8.1-12.3 35.2c-8.2 23.9-33.9 43.6-58 45.2h-.7c-.8.1-1.6.1-2.5.1h-4.1c-.8 0-1.6 0-2.4-.1h-43l38.2-110.4c8.4-24.1 34.4-44 58.7-45.2l.1-.2zm-12.7 40.8h15.4l-8.1 23h-23.9l4.4-12.5c1.7-4.6 7.3-10.5 12.2-10.5zm-25.6 48.8H194l-5.5 16.1c-1.1 3.4-6.1 10.8-13.6 10.8h-14.1l8.9-26.9zM96.9 0h48.7l-20.2 58.1c-3.2 9.1-9.4 15.2-19.4 17.2l16.8.1-9.3 27.1h-.2l-2.8 8.1c-8.2 23.9-33.9 43.6-58 45.2h-.6c-.8.1-1.7.1-2.5.1h-4.1c-.8 0-1.6 0-2.4-.1H0l15.7-45.2L23.6 88l14.7-42.5C46.7 21.4 72.7 1.5 97 .3V0zM84.2 40.8h15.4l-8.1 23H67.6L72 51.3c1.7-4.6 7.3-10.5 12.2-10.5zM58.6 89.6h24.3l-5.5 16.1c-1.1 3.4-6.1 10.8-13.5 10.8H49.7l8.9-26.9z" clipRule="evenodd"/></svg>;
}
export default class LoginPage extends React.Component {
constructor(props) {
super(props);
this.state = {
loading: false
}
this.openid = this.openid.bind(this);
}
async openid() {
if (this.state.loading === true) return;
this.setState({loading: true});
OpenID.Log.setLogger(console);
OpenID.Log.setLevel(OpenID.Log.DEBUG);
let client = new OpenID.OidcClient(OIDCConfig);
const req = await client.createSigninRequest({});
window.location.href = req.url;
}
render() {
return (
<div style={{height: '50vh'}}>
<LoginBox>
<h2>Вход</h2>
<hr/>
<LoginButton onClick={this.openid} disabled={this.state.loading}>
{
this.state.loading ?
<HashLoader size='24px' color='#4169e1' /> :
<>
Войти через
<VVSULogoSVG />
</>
}
</LoginButton>
<p>
Вход осуществляется только через<br/>
Систему Единого Входа ВВГУ
</p>
</LoginBox>
</div>
);
}
}

View File

@ -0,0 +1,327 @@
import React from "react";
import styled, { keyframes } from 'styled-components';
import SVGIcon from "../../components/UI/Icon/SVGIcon";
import Pagination from "../../components/UI/Pagination";
const ChatSVG = () => {
return <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M8 15c4.418 0 8-3.134 8-7s-3.582-7-8-7-8 3.134-8 7c0 1.76.743 3.37 1.97 4.6-.097 1.016-.417 2.13-.771 2.966-.079.186.074.394.273.362 2.256-.37 3.597-.938 4.18-1.234A9.06 9.06 0 0 0 8 15z"/></svg>;
}
const Box = styled.div`
box-shadow: 0 2px 1px #00000010;
border: 1px solid #c2c4c2;
border-radius: 14px;
`;
const BackButton = styled.button`
border: 1px solid #c2c4c2;
display: inline-block;
padding: 12px 16px;
border-radius: 14px;
background: #ffffff;
color: gray;
box-shadow: 0 2px 1px #00000010;
font-size: 12pt;
float: left;
& ${SVGIcon} {
transform: translate(-4px, 2px)
}
`;
const Title = styled.div`
text-align: center;
height: 100px;
padding-top: 32px;
z-index: 1;
position: relative;
top: 0;
& h2 {
font-weight: 600;
text-align: center;
padding: 0;
display: inline-block;
transform: translateY(6px);
}
`;
const FilterForm = styled.div`
display: inline-block;
float: right
`;
const FilterOption = styled(Box)`
display: inline-block;
border: 1px solid #c2c4c2;
border-radius: 14px;
padding: 6px 10px;
margin: 0 12px;
font-size: 11pt;
width: 160px;
& input[type=text] {
margin: 0 8px;
display: inline-block;
width: 20px;
border: 0;
border-bottom: 1px solid gray;
outline: none;
padding-bottom: 2px;
}
`;
const FilterSetting = styled.div`
border-top: 1px solid #c2c4c2;
margin-top: 6px;
padding-top: 8px;
font-size: 10pt;
transform: translate(4px)
`;
const FilterButton = styled.button`
background: royalblue;
width: 40px;
height: 40px;
border-radius: 20px;
float: right;
margin: 0 10px;
box-shadow: 0 2px 1px #00000020;
transition: 250ms ease;
transform: translateY(12px);
&:hover {
box-shadow: 0 2px 2px #00000060;
}
`;
const UserList = styled.div`
margin: 32px auto;
margin-bottom: 0;
display: block;
width: fit-content;
`;
const ContactButton = styled.button`
background: white;
border: 2px solid royalblue;
border-radius: 12px;
color: royalblue;
font-weight: 600;
line-height: 20px;
transition: 150ms ease;
width: 100%;
font-size: 10.5pt;
height: 36px;
opacity: 0;
padding: 0px 10px;
clip-path: border-box;
box-sizing: border-box;
& svg {
fill: royalblue;
margin: 0;
margin-right: 6px;
transform: translateY(2px);
}
&:hover {
color: white;
background: royalblue;
}
&:hover svg {
fill: white
}
`;
const UserAppear = keyframes`
0%, 50% {
opacity: 0;
transform: scale(1.05)
}
to {
opacity: 1;
transform: scale(1)
}
`;
const UserCard = styled(Box)`
display: inline-block;
padding: 10px;
padding-top: 20px;
background: white;
width: 200px;
height: 256px;
margin-right: 20px;
margin-bottom: 84px;
text-align: center;
animation: ${UserAppear} 500ms ease;
& h4 {
margin: 10px 0;
font-weight: 600;
}
& p {
margin: 10px 0;
height: 74px;
color: gray;
font-size: 10pt;
}
transition: 150ms ease;
&:hover > ${ContactButton} {
opacity: 1;
padding: 6px 10px;
}
&:hover {
height: 300px;
margin-bottom: 40px;
}
`;
const Badges = styled.div`
height: 0px;
`;
const LeftBadge = styled.div`
float: left;
transform: translate(90%, -100%);
background: lightgray;
border: 3px solid white;
border-radius: 100px;
width: 36px; height: 36px;
`;
const RightBadge = styled(LeftBadge)`
float: right;
transform: translate(-75%, -100%);
background: limegreen;
& p {
transform: translateY(6px);
font-size: 11pt;
font-weight: 600;
color: white;
text-shadow: 0 2px 1px #00000040;
margin: 0;
height: auto;
}
`;
class Users extends React.Component {
render() {
return (
<UserList>
<h2 style={{textAlign: 'center', lineHeight: '11pt', marginBottom: 32}}>
Выбери соседа
<br/>
<br/>
<span style={{ fontSize: '11pt', fontWeight: 500 }}>
Не забывай, с этим человеком<br/>
придется жить бок-о-бок!
</span>
</h2>
{
[...Array(11)].map((_, i) => {
if (i == 5) return <br/>;
return (
<UserCard>
<SVGIcon src='/images/icons/user.svg' width='100' height='100' />
<Badges>
<LeftBadge>
<SVGIcon src='/images/icons/question.svg' style={{margin: '5px 0'}} width='20' height='20' />
</LeftBadge>
<RightBadge>
<p>?</p>
</RightBadge>
</Badges>
<h4 className="inner-element">User, 0</h4>
<p>No description provided.</p>
<ContactButton>
<ChatSVG />
Перейти в чат
</ContactButton>
</UserCard>
);
})
}
</UserList>
)
}
}
class Filters extends React.Component {
render() {
return (
<FilterForm>
<FilterOption>
Совместимость
<FilterSetting>
от
<input type='text' />
до
<input type='text' />
</FilterSetting>
</FilterOption>
<FilterOption>
Возраст
<FilterSetting>
от
<input type='text' />
до
<input type='text' />
</FilterSetting>
</FilterOption>
<FilterButton>
<SVGIcon src='/images/icons/search.svg' width='18' height='18' />
</FilterButton>
</FilterForm>
);
}
}
export default class Tinder extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
return (
<>
<Title>
<BackButton>
<SVGIcon src='/images/icons/left-arrow-light.svg' width={10} height={16}/>
Вернуться назад
</BackButton>
<Filters />
</Title>
<div style={{transform: 'translateY(-100px)', position: 'relative', top:0, zIndex: 0}}>
<Users />
<Pagination pages={0} />
</div>
</>
);
}
}

View File

@ -1,7 +1,10 @@
import Favorites from "../pages/Favorites"; import Favorites from "../pages/Favorites";
import Comparisons from "../pages/Comparisons"; import Comparisons from "../pages/Comparisons";
import IndexApartment from "../pages/IndexApartment";
import IndexPage from "../pages/IndexPage"; import IndexPage from "../pages/IndexPage";
import PsychTest from "../pages/PsychTest"; import PsychTest from "../pages/PsychTest";
import Tinder from "../pages/Tinder";
import LoginPage from "../pages/LoginPage";
// НА ПРОДАШКЕНЕ СДЕЛАТЬ ПРИВАТНЫЕ МАРШРУТЫ // НА ПРОДАШКЕНЕ СДЕЛАТЬ ПРИВАТНЫЕ МАРШРУТЫ
// export const privateRoutes = [ // export const privateRoutes = [
@ -14,6 +17,13 @@ export default Object.freeze({
{ path: "/", component: <IndexPage />, exact: true }, { path: "/", component: <IndexPage />, exact: true },
{ path: "/favorites", component: <Favorites />, exact: true }, { path: "/favorites", component: <Favorites />, exact: true },
{ path: "/comparisons", component: <Comparisons />, exact: true }, { path: "/comparisons", component: <Comparisons />, exact: true },
{ path: "/", component: <IndexPage />, exact: true },
{ path: "/apartment/:id", component: <IndexApartment />, exact: true },
{ path: "/favorites", component: <Favorites />, exact: true },
{ path: "/comparisons", component: <Comparisons />, exact: true },
{ path: "/tinder", component: <Tinder />, exact: true },
{ path: "/login", component: <LoginPage />, exact: true },
{ path: "/sign-in", component: <LoginPage />, exact: true },
{ path: "/psych_test", component: <PsychTest />, exact: true }, { path: "/psych_test", component: <PsychTest />, exact: true },
], ],
privateRoutes: [], privateRoutes: [],

View File

@ -993,7 +993,8 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": "@babel/runtime@^7.12.5", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.21.5" version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200"
integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==
@ -1289,16 +1290,57 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@popperjs/core@^2.11.6":
version "2.11.7"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7"
integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==
"@react-aria/ssr@^3.5.0":
version "3.6.0"
resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.6.0.tgz#e5d52bd1686ff229f68f806cf94ee29dd9f54fb7"
integrity sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg==
dependencies:
"@swc/helpers" "^0.4.14"
"@remix-run/router@1.6.1": "@remix-run/router@1.6.1":
version "1.6.1" version "1.6.1"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.1.tgz#3a3a408481a3796f45223a549c2571517bc8af2d" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.1.tgz#3a3a408481a3796f45223a549c2571517bc8af2d"
integrity sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA== integrity sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA==
"@restart/hooks@^0.4.9":
version "0.4.9"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.9.tgz#ad858fb39d99e252cccce19416adc18fc3f18fcb"
integrity sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ==
dependencies:
dequal "^2.0.2"
"@restart/ui@^1.6.3":
version "1.6.3"
resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.3.tgz#8063f5b5e0131d41db2cefe148b20cb08a208e76"
integrity sha512-7HM5aiSWvJBWr+FghZj/n3PSuH2kUrOPiu/D92aIv1zTL8IBwFoQ3oz/f76svoN5v2PKaP6pQbg6vTcIiSffzg==
dependencies:
"@babel/runtime" "^7.21.0"
"@popperjs/core" "^2.11.6"
"@react-aria/ssr" "^3.5.0"
"@restart/hooks" "^0.4.9"
"@types/warning" "^3.0.0"
dequal "^2.0.3"
dom-helpers "^5.2.0"
uncontrollable "^7.2.1"
warning "^4.0.3"
"@sinclair/typebox@^0.25.16": "@sinclair/typebox@^0.25.16":
version "0.25.24" version "0.25.24"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718"
integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==
"@swc/helpers@^0.4.14":
version "0.4.14"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74"
integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==
dependencies:
tslib "^2.4.0"
"@testing-library/dom@^8.5.0": "@testing-library/dom@^8.5.0":
version "8.20.0" version "8.20.0"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6"
@ -1393,7 +1435,15 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react@*": "@types/react-transition-group@^4.4.5":
version "4.4.6"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e"
integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@>=16.9.11":
version "18.2.6" version "18.2.6"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571"
integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==
@ -1419,6 +1469,11 @@
dependencies: dependencies:
"@types/jest" "*" "@types/jest" "*"
"@types/warning@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52"
integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==
"@types/yargs-parser@*": "@types/yargs-parser@*":
version "21.0.0" version "21.0.0"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
@ -1603,6 +1658,11 @@ bootstrap-icons@^1.10.5:
resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.10.5.tgz#5a1bbb1bb2212397d416587db1d422cc9501847c" resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.10.5.tgz#5a1bbb1bb2212397d416587db1d422cc9501847c"
integrity sha512-oSX26F37V7QV7NCE53PPEL45d7EGXmBgHG3pDpZvcRaKVzWMqIRL9wcqJUyEha1esFtM3NJzvmxFXDxjJYD0jQ== integrity sha512-oSX26F37V7QV7NCE53PPEL45d7EGXmBgHG3pDpZvcRaKVzWMqIRL9wcqJUyEha1esFtM3NJzvmxFXDxjJYD0jQ==
bootstrap@^5.2.3:
version "5.2.3"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.3.tgz#54739f4414de121b9785c5da3c87b37ff008322b"
integrity sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -1696,6 +1756,12 @@ ci-info@^3.2.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
classnames@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
color-convert@^1.9.0: color-convert@^1.9.0:
version "1.9.3" version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@ -1758,6 +1824,11 @@ cross-spawn@^7.0.2:
shebang-command "^2.0.0" shebang-command "^2.0.0"
which "^2.0.1" which "^2.0.1"
crypto-js@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
css-color-keywords@^1.0.0: css-color-keywords@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
@ -1836,6 +1907,11 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
dequal@^2.0.2, dequal@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
diff-sequences@^29.4.3: diff-sequences@^29.4.3:
version "29.4.3" version "29.4.3"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2"
@ -1860,6 +1936,14 @@ dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9:
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453"
integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==
dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
dependencies:
"@babel/runtime" "^7.8.7"
csstype "^3.0.2"
electron-to-chromium@^1.4.284: electron-to-chromium@^1.4.284:
version "1.4.385" version "1.4.385"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.385.tgz#1afd8d6280d510145148777b899ff481c65531ff" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.385.tgz#1afd8d6280d510145148777b899ff481c65531ff"
@ -2445,6 +2529,13 @@ internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5:
has "^1.0.3" has "^1.0.3"
side-channel "^1.0.4" side-channel "^1.0.4"
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
dependencies:
loose-envify "^1.0.0"
is-arguments@^1.1.1: is-arguments@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
@ -2719,6 +2810,11 @@ json5@^2.2.2:
array-includes "^3.1.5" array-includes "^3.1.5"
object.assign "^4.1.3" object.assign "^4.1.3"
jwt-decode@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59"
integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==
levn@^0.4.1: levn@^0.4.1:
version "0.4.1" version "0.4.1"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@ -2754,7 +2850,7 @@ lodash@^4.17.15, lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
loose-envify@^1.1.0, loose-envify@^1.4.0: loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
@ -2906,6 +3002,14 @@ object.values@^1.1.6:
define-properties "^1.1.4" define-properties "^1.1.4"
es-abstract "^1.20.4" es-abstract "^1.20.4"
oidc-client-ts@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/oidc-client-ts/-/oidc-client-ts-2.2.3.tgz#85c6382540cf59383896d6470c9c3908d5d625f7"
integrity sha512-nheMI8kSJu8L+Pmg7E4ra+LJ7lOTK60IfyblFmyx5qaJwwDpc1zkzFyH9eyERAQ92xUTF1uaB8WiaVxXATjLGA==
dependencies:
crypto-js "^4.1.1"
jwt-decode "^3.1.2"
once@^1.3.0: once@^1.3.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@ -3018,7 +3122,17 @@ pretty-format@^29.0.0, pretty-format@^29.5.0:
ansi-styles "^5.0.0" ansi-styles "^5.0.0"
react-is "^18.0.0" react-is "^18.0.0"
prop-types@^15.8.1:
prop-types-extra@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b"
integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
dependencies:
react-is "^16.3.2"
warning "^4.0.0"
prop-types@^15.6.2, prop-types@^15.8.1:
version "15.8.1" version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@ -3049,6 +3163,24 @@ react-awesome-slider@^4.1.0:
dependencies: dependencies:
web-animation-club "^0.6.0" web-animation-club "^0.6.0"
react-bootstrap@^2.7.4:
version "2.7.4"
resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.7.4.tgz#db95ecdcdfae9619de14511b5e9923bf95daf73d"
integrity sha512-EPKPwhfbxsKsNBhJBitJwqul9fvmlYWSft6jWE2EpqhEyjhqIqNihvQo2onE5XtS+QHOavUSNmA+8Lnv5YeAyg==
dependencies:
"@babel/runtime" "^7.21.0"
"@restart/hooks" "^0.4.9"
"@restart/ui" "^1.6.3"
"@types/react-transition-group" "^4.4.5"
classnames "^2.3.2"
dom-helpers "^5.2.1"
invariant "^2.2.4"
prop-types "^15.8.1"
prop-types-extra "^1.1.0"
react-transition-group "^4.4.5"
uncontrollable "^7.2.1"
warning "^4.0.3"
react-dom@^18.2.0: react-dom@^18.2.0:
version "18.2.0" version "18.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
@ -3062,7 +3194,7 @@ react-fast-compare@^2.0.1:
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
react-is@^16.13.1, react-is@^16.7.0: react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0:
version "16.13.1" version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@ -3077,6 +3209,11 @@ react-is@^18.0.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
react-lifecycles-compat@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-refresh@^0.14.0: react-refresh@^0.14.0:
version "0.14.0" version "0.14.0"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
@ -3102,6 +3239,16 @@ react-spinners@^0.13.8:
resolved "https://registry.yarnpkg.com/react-spinners/-/react-spinners-0.13.8.tgz#5262571be0f745d86bbd49a1e6b49f9f9cb19acc" resolved "https://registry.yarnpkg.com/react-spinners/-/react-spinners-0.13.8.tgz#5262571be0f745d86bbd49a1e6b49f9f9cb19acc"
integrity sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA== integrity sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==
react-transition-group@^4.4.5:
version "4.4.5"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
dependencies:
"@babel/runtime" "^7.5.5"
dom-helpers "^5.0.1"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react@^18.2.0: react@^18.2.0:
version "18.2.0" version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
@ -3447,7 +3594,7 @@ tslib@^1.10.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.5.0: tslib@^2.4.0, tslib@^2.5.0:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
@ -3483,6 +3630,16 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3" has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2" which-boxed-primitive "^1.0.2"
uncontrollable@^7.2.1:
version "7.2.1"
resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738"
integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==
dependencies:
"@babel/runtime" "^7.6.3"
"@types/react" ">=16.9.11"
invariant "^2.2.4"
react-lifecycles-compat "^3.0.4"
unicode-canonical-property-names-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
@ -3532,6 +3689,13 @@ vite@^4.3.5:
optionalDependencies: optionalDependencies:
fsevents "~2.3.2" fsevents "~2.3.2"
warning@^4.0.0, warning@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
dependencies:
loose-envify "^1.0.0"
web-animation-club@^0.6.0: web-animation-club@^0.6.0:
version "0.6.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/web-animation-club/-/web-animation-club-0.6.0.tgz#c1dd79646b21e4265b5f95ae9cb8b93b73e05e47" resolved "https://registry.yarnpkg.com/web-animation-club/-/web-animation-club-0.6.0.tgz#c1dd79646b21e4265b5f95ae9cb8b93b73e05e47"