From 0e5f06466c96f00a733e9e03c2bc6a6352c6928d Mon Sep 17 00:00:00 2001 From: Kimiega Date: Fri, 10 Jan 2025 22:14:14 +0300 Subject: [PATCH 1/8] Fourth frontend part --- .../ifmo/se/dating/spring/api/CorsFilter.kt | 9 +- .../security/MatchmakerSecuredPaths.kt | 1 + frontend/Dockerfile | 2 +- frontend/src/app/routes/ui/index.tsx | 15 +- .../person-patch/model/PersonPatch.ts | 20 +- frontend/src/entities/person/model/Person.ts | 13 + .../registration-data/model/Coordinates.ts | 4 + .../registration-data/model/Location.ts | 8 + .../model/RegistartionData.ts | 19 +- .../registration-data/model/faculty.ts | 4 + .../src/features/authentication/api/authFx.ts | 107 ++-- .../features/edit-profile/api/editProfile.ts | 58 +- .../get-faculties/api/getFaculties.ts | 22 + .../get-locations/api/getLocations.ts | 29 + .../get-suggestions/api/getSuggestions.ts | 24 + .../src/features/get-topics/api/getTopics.ts | 39 +- frontend/src/features/get_user/api/getUser.ts | 20 + .../features/patch-person/api/patchPerson.ts | 29 + frontend/src/pages/Home.tsx | 26 +- .../pages/registration/ui/Registration.tsx | 230 ++++---- frontend/src/pages/welcome/ui/Welcome.tsx | 34 ++ frontend/src/shared/api/api.ts | 6 +- .../ui/RegistrationCommonInfo.tsx | 188 +++--- frontend/src/widgets/swiper/ui/SwiperMenu.tsx | 555 +++++++++--------- 24 files changed, 856 insertions(+), 606 deletions(-) create mode 100644 frontend/src/entities/registration-data/model/Coordinates.ts create mode 100644 frontend/src/entities/registration-data/model/Location.ts create mode 100644 frontend/src/entities/registration-data/model/faculty.ts create mode 100644 frontend/src/features/get-faculties/api/getFaculties.ts create mode 100644 frontend/src/features/get-locations/api/getLocations.ts create mode 100644 frontend/src/features/get-suggestions/api/getSuggestions.ts create mode 100644 frontend/src/features/get_user/api/getUser.ts create mode 100644 frontend/src/features/patch-person/api/patchPerson.ts create mode 100644 frontend/src/pages/welcome/ui/Welcome.tsx diff --git a/backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api/CorsFilter.kt b/backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api/CorsFilter.kt index b4e7e10e..7c8b3dd8 100644 --- a/backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api/CorsFilter.kt +++ b/backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api/CorsFilter.kt @@ -13,12 +13,13 @@ class CorsFilter : WebFilter { // FIXME override fun filter(ctx: ServerWebExchange, chain: WebFilterChain): Mono { ctx.response.headers.add("Access-Control-Allow-Origin", "*") - ctx.response.headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS") + ctx.response.headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, PATCH, DELETE, OPTIONS") ctx.response.headers.add( "Access-Control-Allow-Headers", - "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," + - "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range" - ) +// "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," + +// "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Authorization" + "*" + ) if (ctx.request.method == HttpMethod.OPTIONS) { ctx.response.headers.add("Access-Control-Max-Age", "1728000") ctx.response.statusCode = HttpStatus.NO_CONTENT diff --git a/backend/matchmaker/src/main/kotlin/ru/ifmo/se/dating/matchmaker/security/MatchmakerSecuredPaths.kt b/backend/matchmaker/src/main/kotlin/ru/ifmo/se/dating/matchmaker/security/MatchmakerSecuredPaths.kt index 73c03d06..18df44fe 100644 --- a/backend/matchmaker/src/main/kotlin/ru/ifmo/se/dating/matchmaker/security/MatchmakerSecuredPaths.kt +++ b/backend/matchmaker/src/main/kotlin/ru/ifmo/se/dating/matchmaker/security/MatchmakerSecuredPaths.kt @@ -14,5 +14,6 @@ class MatchmakerSecuredPaths : SpringSecuredPaths { Path("/api/**"), Not(Path("/api/people/{person_id}", HttpMethod.PUT)), Not(Path("/api/monitoring/healthcheck", HttpMethod.GET)), + Not(Path("/api/suggestions", HttpMethod.OPTIONS)), ) } diff --git a/frontend/Dockerfile b/frontend/Dockerfile index fbec17a1..0286136a 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -6,7 +6,7 @@ COPY package*.json ./ RUN npm install -# COPY .cert ./.cert +COPY .cert ./.cert COPY dist ./dist diff --git a/frontend/src/app/routes/ui/index.tsx b/frontend/src/app/routes/ui/index.tsx index 54c9dfd6..47996bfa 100644 --- a/frontend/src/app/routes/ui/index.tsx +++ b/frontend/src/app/routes/ui/index.tsx @@ -1,11 +1,12 @@ import { Route } from 'atomic-router-react' import { routes } from '../api' -import { Registration, Home, Main } from '@/pages' +import { Registration, Main } from '@/pages' +import { Welcome } from '@/pages/welcome/ui/Welcome.tsx' export const Routes = () => ( - <> - - - - -) + <> + + + + +); \ No newline at end of file diff --git a/frontend/src/entities/person-patch/model/PersonPatch.ts b/frontend/src/entities/person-patch/model/PersonPatch.ts index 0f8fbdca..0871343b 100644 --- a/frontend/src/entities/person-patch/model/PersonPatch.ts +++ b/frontend/src/entities/person-patch/model/PersonPatch.ts @@ -1,15 +1,15 @@ export interface PersonPatch { - status: string - firstName: string - lastName: string - interests: Topic[] - height: number - birthday: string - facultyId: number - locationId: number + status: string | null, + firstName: string | null, + lastName: string | null, + interests: Topic[] | null, + height: number | null, + birthday: string | null, + facultyId: number | null, + locationId: number | null } export interface Topic { - topicId: number - level: number + topicId: number, + level: number } diff --git a/frontend/src/entities/person/model/Person.ts b/frontend/src/entities/person/model/Person.ts index 41d20977..84d58b58 100644 --- a/frontend/src/entities/person/model/Person.ts +++ b/frontend/src/entities/person/model/Person.ts @@ -15,3 +15,16 @@ export interface Person { faculty: string location: Location } + +export interface PersonLegacy { + status: string, + userId: number, + firstName: string, + zodiac: string, + lastName: string, + interests: Interest[], + height: number, + birthday: Date, + facultyId: number, + locationId: number +} diff --git a/frontend/src/entities/registration-data/model/Coordinates.ts b/frontend/src/entities/registration-data/model/Coordinates.ts new file mode 100644 index 00000000..5c3788e1 --- /dev/null +++ b/frontend/src/entities/registration-data/model/Coordinates.ts @@ -0,0 +1,4 @@ +export interface Coordinates { + latitude: number, + longitude: number +} \ No newline at end of file diff --git a/frontend/src/entities/registration-data/model/Location.ts b/frontend/src/entities/registration-data/model/Location.ts new file mode 100644 index 00000000..37f4cd30 --- /dev/null +++ b/frontend/src/entities/registration-data/model/Location.ts @@ -0,0 +1,8 @@ +import { Coordinates } from './Coordinates.ts' + +export interface Location { + id: number, + name: string, + coordinates: Coordinates + +} \ No newline at end of file diff --git a/frontend/src/entities/registration-data/model/RegistartionData.ts b/frontend/src/entities/registration-data/model/RegistartionData.ts index b093eebc..0f5a88a5 100644 --- a/frontend/src/entities/registration-data/model/RegistartionData.ts +++ b/frontend/src/entities/registration-data/model/RegistartionData.ts @@ -2,12 +2,13 @@ import { Interest } from './interest.ts' import { Picture } from './picture.ts' export type RegistrationData = { - tgId: string - name: string - surname: string - height: number - faculty: string - birthday: Date - pictures: Picture[] - interests: Interest[] -} + tgId: string | null; + name: string | null; + surname: string | null; + height: number | null; + facultyId: number | null; + birthday: Date | null; + pictures: Picture[] | null; + interests: Interest[] | null; + locationId: number | null; +}; diff --git a/frontend/src/entities/registration-data/model/faculty.ts b/frontend/src/entities/registration-data/model/faculty.ts new file mode 100644 index 00000000..0ecfdfb1 --- /dev/null +++ b/frontend/src/entities/registration-data/model/faculty.ts @@ -0,0 +1,4 @@ +export interface Faculty { + id: number, + longName: string +} diff --git a/frontend/src/features/authentication/api/authFx.ts b/frontend/src/features/authentication/api/authFx.ts index 61bad602..2bdab358 100644 --- a/frontend/src/features/authentication/api/authFx.ts +++ b/frontend/src/features/authentication/api/authFx.ts @@ -1,51 +1,80 @@ -import { createEffect, createStore } from 'effector' -import { persist } from 'effector-storage/session' -import { AuthRequest } from '../model/AuthRequest.ts' -import { AuthResponse } from '../model/AuthResponse.ts' +import {createEffect, createStore} from 'effector' +import {persist} from 'effector-storage/session' +import {AuthRequest} from '../model/AuthRequest.ts' +import {AuthResponse} from '../model/AuthResponse.ts' import axios from 'axios' -import { AuthState, initialAuthState } from '@/entities' -import { backendAuthikUrl } from '@/shared/api' +import {AuthState, initialAuthState} from '@/entities' +import {backendAuthikUrl} from '@/shared/api' export const $authStore = createStore(initialAuthState) +export const $userIdStore = createStore(null); -persist({ store: $authStore, key: 'authStore' }) +export const $userRegisteredStore = createStore(false); + + +persist({store: $authStore, key: 'authStore'}) +persist({store: $userIdStore, key: 'userIdStore'}) +persist({store: $userRegisteredStore, key: 'userRegisteredStore'}) export const authFx = createEffect({ - handler: async (authReq) => { - try { - const response = await axios.put( - `${backendAuthikUrl}/api/auth/telegram/web-app`, - JSON.stringify(authReq), - { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - }, - ) - return fillAuthState(response.data) - } catch (error) { - console.error(error) - throw new Error('Auth failed') - } - }, + handler: async (authReq) => { + try { + const response = await axios.put( + `${backendAuthikUrl}/api/auth/telegram/web-app`, + JSON.stringify(authReq), + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + }, + ) + return fillAuthState(response.data) + } catch (error) { + console.error(error) + throw new Error('Auth failed') + } + }, }) const fillAuthState = (response: AuthResponse): AuthState => { - return { - token: response.access, - loading: false, - tgId: '-1', - isAuthenticated: true, - error: null, - } + return { + token: response.access, + loading: false, + tgId: '-1', + isAuthenticated: true, + error: null + }; } -export const $isAuthenticated = $authStore.map((state) => state.isAuthenticated) +export const $isAuthenticated = $authStore.map(state => state.isAuthenticated) + +$authStore.on(authFx.doneData, (_, result) => result); +$authStore.on(authFx.failData, (_, error) => ({...initialAuthState, loading: false, error: error.message})); + +export const userIdFx = createEffect({ + handler: async (x) => { + if (x == null) + throw Error("x is null") + return x + } + } +) + +export const userRegisteredFx = createEffect({ + handler: async (x) => { + if (!x) + throw Error("user not registered") + return x + } + } +) -$authStore.on(authFx.doneData, (_, result) => result) -$authStore.on(authFx.failData, (_, error) => ({ - ...initialAuthState, - loading: false, - error: error.message, -})) +$userIdStore.on(userIdFx.doneData, (_, result) => result) +$userIdStore.on(userIdFx.failData, (_, __) => { + return null +}) +$userRegisteredStore.on(userRegisteredFx.doneData, (_, result) => result) +$userRegisteredStore.on(userRegisteredFx.failData, (_, __) => { + return false +}) diff --git a/frontend/src/features/edit-profile/api/editProfile.ts b/frontend/src/features/edit-profile/api/editProfile.ts index 31740b80..49aca01e 100644 --- a/frontend/src/features/edit-profile/api/editProfile.ts +++ b/frontend/src/features/edit-profile/api/editProfile.ts @@ -6,33 +6,33 @@ import { PersonPatch } from '@/entities/person-patch/model/PersonPatch.ts' export function editProfile(profile: Person) { const url = `${backendPeopleUrl}/api/people/${profile.id}` - // FIXME jwt token - const basicAuth = 'test basic auth' - const config = { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: +basicAuth, - }, - } - const profilePatch: PersonPatch = { - status: 'ready', - firstName: profile.firstName, - lastName: profile.lastName, - interests: profile.interests.map((interest) => { - return { topicId: interest.topic.id, level: interest.level } - }), - height: profile.height, - birthday: `${profile.birthday.getFullYear()}-${profile.birthday.getMonth()}-${profile.birthday.getDay()}`, - facultyId: 1, - locationId: 1, - } - axios - .post(url, profilePatch, config) - .then((response) => { - console.log(response.data) - }) - .catch((error) => { - console.error('Error patching: ', error) - }) + // FIXME jwt token + const basicAuth = 'test basic auth' + const config = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': +basicAuth, + }, + } + const profilePatch: PersonPatch = { + status: 'ready', + firstName: profile.firstName, + lastName: profile.lastName, + interests: profile.interests.map((interest) => { + return { topicId: interest.topic.id, level: interest.level } + }), + height: profile.height, + birthday: `${profile.birthday.getFullYear()}-${profile.birthday.getMonth()}-${profile.birthday.getDay()}`, + facultyId: 1, + locationId: 1, + } + axios + .post(url, profilePatch, config) + .then((response) => { + console.log(response.data); + }) + .catch((error) => { + console.error('Error patching: ', error) + }) } diff --git a/frontend/src/features/get-faculties/api/getFaculties.ts b/frontend/src/features/get-faculties/api/getFaculties.ts new file mode 100644 index 00000000..8086943e --- /dev/null +++ b/frontend/src/features/get-faculties/api/getFaculties.ts @@ -0,0 +1,22 @@ +import axios from "axios"; +import React from "react"; +import {backendPeopleUrl} from "@/shared/api"; +import {Faculty} from "@/entities/registration-data/model/faculty.ts"; + +export function getFaculties(setFaculties: React.Dispatch>>) { + const url = `${backendPeopleUrl}/api/faculties`; + + axios.get(url) + .then((response) => { + console.log(response.data); + //FIXME after integration with backend + setFaculties(response.data) + }) + .catch((error) => { + console.error("Error getting faculties: ", error); + //TODO remove after integration with backend + setFaculties([ + {id: 1, longName: "piict"} + ]) + }) +} \ No newline at end of file diff --git a/frontend/src/features/get-locations/api/getLocations.ts b/frontend/src/features/get-locations/api/getLocations.ts new file mode 100644 index 00000000..e08594d4 --- /dev/null +++ b/frontend/src/features/get-locations/api/getLocations.ts @@ -0,0 +1,29 @@ +import axios from 'axios' +import React from 'react' +import { backendPeopleUrl } from '@/shared/api' +import { Location } from '@/entities/registration-data/model/Location.ts' + +export function getLocations(setLocations: React.Dispatch>>) { + const url = `${backendPeopleUrl}/api/locations`; + + axios.get(url) + .then((response) => { + console.log(response.data); + //FIXME after integration with backend + setLocations(response.data) + }) + .catch((error) => { + console.error("Error getting locations: ", error); + //TODO remove after integration with backend + setLocations([ + { + "id": 1, + "name": "ITMO University, Kronverkskiy Avenue", + "coordinates": { + "latitude": 59.957478, + "longitude": 30.308014 + } + } + ]) + }) +} \ No newline at end of file diff --git a/frontend/src/features/get-suggestions/api/getSuggestions.ts b/frontend/src/features/get-suggestions/api/getSuggestions.ts new file mode 100644 index 00000000..a5d92a1c --- /dev/null +++ b/frontend/src/features/get-suggestions/api/getSuggestions.ts @@ -0,0 +1,24 @@ +import axios from 'axios' +import React from 'react' +import { backendMatchmakerUrl } from '@/shared/api' +import { $authStore } from '@/features/authentication/api/authFx.ts' + +export function getSuggestions(setPersonIdArray: React.Dispatch>>, limit: number) { + const url = `${backendMatchmakerUrl}/api/suggestions?limit=${limit}`; + const config = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${$authStore.getState().token}` + } + } + axios.get(url, config) + .then((response) => { + console.log(response.data); + setPersonIdArray(response.data) + }) + .catch((error) => { + console.error("Error getting suggestions: ", error); + setPersonIdArray([]) + }) +} \ No newline at end of file diff --git a/frontend/src/features/get-topics/api/getTopics.ts b/frontend/src/features/get-topics/api/getTopics.ts index d510fd63..c1dfde3b 100644 --- a/frontend/src/features/get-topics/api/getTopics.ts +++ b/frontend/src/features/get-topics/api/getTopics.ts @@ -1,26 +1,27 @@ import axios from 'axios' import { Topic } from '@/entities/registration-data/model/topic.ts' import React from 'react' +import { backendPeopleUrl } from '@/shared/api' export function getTopics( - setTopics: React.Dispatch>>, -) { - const url = 'http://localhost:3000/getTopics' + setTopics: React.Dispatch>>, + ) { + const url = `${backendPeopleUrl}/api/topics` - axios - .get(url) - .then((response) => { - console.log(response.data) - //FIXME after integration with backend - // setTopics(response.data) - }) - .catch((error) => { - console.error('Error getting topics: ', error) - //TODO remove after integration with backend - setTopics([ - { id: 1, name: 'programming', color: undefined, icon: undefined }, - { id: 2, name: 'eating', color: undefined, icon: undefined }, - { id: 3, name: 'sleeping', color: undefined, icon: undefined }, - ]) - }) + axios + .get(url) + .then((response) => { + console.log(response.data); + //FIXME after integration with backend + setTopics(response.data) + }) + .catch((error) => { + console.error('Error getting topics: ', error); + //TODO remove after integration with backend + setTopics([ + {id: 1, name: 'programming', color: undefined, icon: undefined}, + {id: 2, name: 'eating', color: undefined, icon: undefined}, + {id: 3, name: 'sleeping', color: undefined, icon: undefined} + ]) + }) } diff --git a/frontend/src/features/get_user/api/getUser.ts b/frontend/src/features/get_user/api/getUser.ts new file mode 100644 index 00000000..529ad876 --- /dev/null +++ b/frontend/src/features/get_user/api/getUser.ts @@ -0,0 +1,20 @@ +import { PersonLegacy } from '@/entities/person/model/Person.ts' +import { backendPeopleUrl } from '@/shared/api' +import axios, { AxiosResponse } from 'axios' +import { $authStore } from '@/features/authentication/api/authFx.ts' + +export function getUser(userId: number): Promise> { + const url = `${backendPeopleUrl}/api/people/${userId}`; + + // FIXME jwt token + const basicAuth = `Bearer ${$authStore.getState().token}` + const config = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Authorization': basicAuth + }, + } + + return axios.get(url, config) +} \ No newline at end of file diff --git a/frontend/src/features/patch-person/api/patchPerson.ts b/frontend/src/features/patch-person/api/patchPerson.ts new file mode 100644 index 00000000..ab45db62 --- /dev/null +++ b/frontend/src/features/patch-person/api/patchPerson.ts @@ -0,0 +1,29 @@ +import axios, { AxiosResponse } from 'axios' +import { backendPeopleUrl } from '@/shared/api' +import { RegistrationData } from '@/entities' +import { $authStore, $userIdStore } from '@/features/authentication/api/authFx.ts' +import { PersonPatch } from '@/entities/person-patch/model/PersonPatch.ts' + +export function patchPerson(registartionData: RegistrationData, status: string): Promise> { + const url = `${backendPeopleUrl}/api/people/${$userIdStore.getState()}`; + const config = { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${$authStore.getState().token}` + } + } + const birthday = registartionData.birthday || new Date() + const patchData: PersonPatch = { + status: status, + firstName: registartionData.name, + lastName: registartionData.surname, + interests: registartionData.interests, + height: registartionData.height, + birthday: birthday.toISOString().split('T')[0], + facultyId: registartionData.facultyId, + locationId: registartionData.locationId + } + + return axios.patch(url, JSON.stringify(patchData), config) +} \ No newline at end of file diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index e97f713d..32d5398a 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -2,17 +2,17 @@ import { Link } from 'atomic-router-react' import { Text } from '@telegram-apps/telegram-ui' import { AuthTest } from '@/widgets' export const Home = () => { - return ( - <> - - TEXT - -
- -
- - Main - - - ) + return ( + <> + + TEXT + +
+ +
+ + Main + + + ) } diff --git a/frontend/src/pages/registration/ui/Registration.tsx b/frontend/src/pages/registration/ui/Registration.tsx index 93271863..fa272f08 100644 --- a/frontend/src/pages/registration/ui/Registration.tsx +++ b/frontend/src/pages/registration/ui/Registration.tsx @@ -4,8 +4,8 @@ import { useEffect, useState } from 'react' import { fetchTgUser } from '@/features/fetch-tg-user/api/fetchTgUser.ts' import { RegistrationData } from '@/entities' import { - setMainButtonParams, - setMainButtonVisible, + setMainButtonParams, + setMainButtonVisible, } from '@/entities/main-button' import { setMainButtonOnClick } from '@/entities/main-button/api/mainButtonOnClick.ts' import { RegistrationPictures } from '@/widgets/registration-pictures' @@ -14,121 +14,139 @@ import { setBackButtonOnClick } from '@/entities/back-button/api/backButtonOnCli import { router } from '@/app/routes/api' import { RegistrationInterests } from '@/widgets/registration-interests' import { useEffectOnce } from '@/shared/api' +import { patchPerson } from '@/features/patch-person/api/patchPerson.ts' export const Registration = () => { - const registrationOrder = [ - 'registration-common', - 'registration-pictures', - 'registration-interests', - ] + const registrationOrder = [ + 'registration-common', + 'registration-pictures', + 'registration-interests', + ] - const [key, changeKey] = useState(0) + const [key, changeKey] = useState(0) - const tgUser = fetchTgUser() - const [registrationData, changeRD] = useState({ - tgId: tgUser?.id?.toString() || '-1', - name: tgUser?.firstName || '', - surname: tgUser?.lastName || '', - height: 175, - faculty: 'ПИиКТ', - birthday: new Date(), - pictures: [], - interests: [], - }) + const tgUser = fetchTgUser() + const [registrationData, changeRD] = useState( + { + tgId: tgUser?.id?.toString() || null, + name: tgUser?.firstName || null, + surname: tgUser?.lastName!! || null, + height: 175, + facultyId: null, + birthday: null, + pictures: [], + interests: [], + locationId: null + }) - const mainButtonFun = () => { - changeKey((prev) => prev + 1) - } - const backButtonFun = () => { - changeKey((prev) => prev - 1) - } + const mainButtonFun = () => { + changeKey((prev) => prev + 1) + } + const backButtonFun = () => { + changeKey((prev) => prev - 1) + } - const backButtonHomeFun = () => { - changeKey(0) - setBackButtonVisible(false) - setMainButtonVisible(false) - router.back() - } + const backButtonHomeFun = () => { + changeKey(0) + setBackButtonVisible(false) + setMainButtonVisible(false) + router.back() + } - useEffectOnce(() => { - setMainButtonParams('Next', false, true) - setMainButtonVisible(true) - setBackButtonVisible(true) - }) + useEffectOnce(() => { + setMainButtonParams('Next', false, true) + setMainButtonVisible(true) + setBackButtonVisible(true) + }) - function setButtons(localKey: number) { - if (localKey == 0) { - const offBack = setBackButtonOnClick(() => { - backButtonHomeFun() - offBack() - offMain() - }) - const offMain = setMainButtonOnClick(() => { - mainButtonFun() - offMain() - offBack() - }) - } else { - const offBack = setBackButtonOnClick(() => { - backButtonFun() - offBack() - offMain() - }) - const offMain = setMainButtonOnClick(() => { - mainButtonFun() - offMain() - offBack() - }) + function setButtons(localKey: number) { + if (localKey == 0) { + const offBack = setBackButtonOnClick(() => { + backButtonHomeFun() + offBack() + offMain() + }) + const offMain = setMainButtonOnClick(() => { + mainButtonFun() + offMain() + offBack() + }) + } else { + const offBack = setBackButtonOnClick(() => { + backButtonFun() + offBack() + offMain() + }) + const offMain = setMainButtonOnClick(() => { + mainButtonFun() + offMain() + offBack() + }) + } } - } - useEffect(() => { - setButtons(key) - }, [key]) + useEffect(() => { + setButtons(key) + if (key === registrationOrder.length) { + patchPerson(registrationData, 'ready') + .then((_) => + { + router.back() + }) + .catch((e) => console.log(e)) + } + else + patchPerson(registrationData, 'draft') + .then((x) => console.log(x)) + .catch((e) => console.log(e)) + }, [key]); - function renderSwitchWidget(key: number) { - switch (registrationOrder[key]) { - case 'registration-common': { - return ( - - ) - } - case 'registration-pictures': { - return ( - - ) - } - case 'registration-interests': { - return ( - - ) - } - default: - return ( - - Telegram sticker - - ) + function renderSwitchWidget(key: number) { + switch (registrationOrder[key]) { + case 'registration-common': { + return ( + + ) + } + case 'registration-pictures': { + return ( + + ) + } + case 'registration-interests': { + return ( + + ) + } + default: + return ( + + Telegram sticker + + ) + } } - } - return ( -
- {renderSwitchWidget(key)} -
- ) + return ( +
+ {renderSwitchWidget(key)} +
+ ) } diff --git a/frontend/src/pages/welcome/ui/Welcome.tsx b/frontend/src/pages/welcome/ui/Welcome.tsx new file mode 100644 index 00000000..994f795b --- /dev/null +++ b/frontend/src/pages/welcome/ui/Welcome.tsx @@ -0,0 +1,34 @@ +import { useEffectOnce } from '@/shared/api' +import { authenticate } from '@/widgets/auth-test/api/authenticate.ts' +import { redirect } from 'atomic-router' +import { $authStore, $isAuthenticated, userIdFx, userRegisteredFx } from '@/features/authentication/api/authFx.ts' +import { routes } from '@/app/routes/api' +import { useEffect } from 'react' +import { getUser } from '@/features/get_user/api/getUser.ts' + +export const Welcome = () => { + useEffectOnce(() => { + authenticate() + }) + redirect({clock: userRegisteredFx.doneData, route: routes.main}) + redirect({clock: userRegisteredFx.failData, route: routes.registration}) + useEffect(() => { + const userId: string = JSON.parse(atob($authStore.getState().token!!.split(".")[1])).user_id; + userIdFx(Number(userId)) + getUser(Number(userId)).then((x) => { + if (x.data.status == 'ready') + userRegisteredFx(true) + else + userRegisteredFx(false) + } + ).catch(() => { + userRegisteredFx(false) + }) + }, [$isAuthenticated]) + + return ( +
+ Wait please... :) +
+ ) +} \ No newline at end of file diff --git a/frontend/src/shared/api/api.ts b/frontend/src/shared/api/api.ts index 385548aa..fc36fcee 100644 --- a/frontend/src/shared/api/api.ts +++ b/frontend/src/shared/api/api.ts @@ -8,6 +8,6 @@ export async function api(url: string): Promise { } export type JwtToken = string -export const backendMatchmakerUrl = 'https://itmodating.3utilities.com:8080' -export const backendPeopleUrl = 'https://itmodating.3utilities.com:8081' -export const backendAuthikUrl = 'https://itmodating.3utilities.com:8082' +export const backendMatchmakerUrl = 'https://itmodating.3utilities.com:444' +export const backendPeopleUrl = 'https://itmodating.3utilities.com:444' +export const backendAuthikUrl = 'https://itmodating.3utilities.com:444' diff --git a/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx b/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx index f0f3a583..9cbad1ff 100644 --- a/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx +++ b/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx @@ -1,115 +1,101 @@ import { - Input, - List, - Section, - Select, - Slider, + Input, + List, + Section, + Select, + Slider, } from '@telegram-apps/telegram-ui' import { RegistrationData } from '@/entities' -import { getAmountOfDays } from '@/shared/api' +import { getAmountOfDays, useEffectOnce } from '@/shared/api' import { useEffect, useState } from 'react' +import { getFaculties } from '@/features/get-faculties/api/getFaculties.ts' +import { Faculty } from '@/entities/registration-data/model/faculty.ts' +import { Location } from '@/entities/registration-data/model/Location.ts' +import { getLocations } from '@/features/get-locations/api/getLocations.ts' interface RegistrationCommonInfoProps { - registrationData: RegistrationData - changeRD: React.Dispatch> + registrationData: RegistrationData, + changeRD: React.Dispatch> } export const RegistrationCommonInfo = ({ - registrationData, - changeRD, + registrationData, + changeRD, }: RegistrationCommonInfoProps) => { - const actualDate = new Date() - const [day, setDay] = useState(actualDate.getDay()) - const [month, setMonth] = useState(actualDate.getMonth()) - const [year, setYear] = useState(actualDate.getFullYear()) + const actualDate = new Date() + const [day, setDay] = useState(actualDate.getDay()) + const [month, setMonth] = useState(actualDate.getMonth()) + const [year, setYear] = useState(actualDate.getFullYear()) + const [faculties, setFaculties] = useState>([]) + const [locations, setLocations] = useState>([]) - useEffect(() => { - changeRD((previous) => ({ - ...previous, - birthday: new Date(year, month, day), - })) - }, [day, month, year]) - return ( -
- - - changeRD((previous) => ({ ...previous, name: e.target.value })) - } - /> - - changeRD((previous) => ({ ...previous, surname: e.target.value })) - } - /> -
- - changeRD((previous) => ({ ...previous, height: e })) - } - min={50} - max={300} - /> -
- -
- {/*
*/} - - - - {/*
*/} + useEffectOnce(() => { + getFaculties(setFaculties) + getLocations(setLocations) + }) + + useEffect(() => { + changeRD((previous) => ({ + ...previous, + birthday: new Date(year, month, day), + })) + }, [day, month, year]) + + return ( +
+ + changeRD((previous) => ({...previous, name: e.target.value}))}/> + changeRD((previous) => ({...previous, surname: e.target.value}))}/> +
+ changeRD((previous) => ({...previous, height: e}))} min={50} max={300}/> +
+ +
+ {/*
*/} + + + + {/*
*/} +
+ +
- -
- ) + ) } diff --git a/frontend/src/widgets/swiper/ui/SwiperMenu.tsx b/frontend/src/widgets/swiper/ui/SwiperMenu.tsx index 78599559..53ff0fb9 100644 --- a/frontend/src/widgets/swiper/ui/SwiperMenu.tsx +++ b/frontend/src/widgets/swiper/ui/SwiperMenu.tsx @@ -9,286 +9,311 @@ import 'swiper/css/pagination' import { Pagination } from 'swiper/modules' import { CardChip } from '@telegram-apps/telegram-ui/dist/components/Blocks/Card/components/CardChip/CardChip' import { setAttitude } from '@/features/set-attitude/api/setAttitude.ts' +import { useEffectOnce } from '@/shared/api' +import { getSuggestions } from '@/features/get-suggestions/api/getSuggestions.ts' +import { getUser } from '@/features/get_user/api/getUser.ts' //src={"https://avatars.githubusercontent.com/u/93886405"} + const actP: Person = { - id: 1234567, - zodiac: 'aries', - updateMoment: new Date(), - firstName: 'Ivan', - lastName: 'Ivan', - pictures: [ - { - id: 1, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', - }, - { - id: 2, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', - }, - ], - interests: [ - { - topic: { - id: 123, - name: 'programming', - icon: { - id: 123, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', + id: 1234567, + zodiac: 'aries', + updateMoment: new Date(), + firstName: 'Ivan', + lastName: 'Ivan', + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' }, - color: '#dasda', - }, - level: 5, - }, - ], - height: 111, - birthday: new Date(), - faculty: 'piict', - location: { - name: 'nameLoc', - coordinates: { - latitude: 321, - longitude: 321, - }, - }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + } + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + }, + color: '#dasda' + }, + level: 5 + } + ], + height: 111, + birthday: new Date(), + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321 + } + } } const actP2: Person = { - id: 1234567, - zodiac: 'aries', - updateMoment: new Date(), - firstName: 'Vitya', - lastName: 'Vitya', - pictures: [ - { - id: 1, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', - }, - { - id: 2, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', - }, - ], - interests: [ - { - topic: { - id: 123, - name: 'programming', - icon: { - id: 123, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', + id: 1234567, + zodiac: 'aries', + updateMoment: new Date(), + firstName: 'Vitya', + lastName: 'Vitya', + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' }, - color: '#dasda', - }, - level: 5, - }, - ], - height: 111, - birthday: new Date(), - faculty: 'piict', - location: { - name: 'nameLoc', - coordinates: { - latitude: 321, - longitude: 321, - }, - }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + } + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + }, + color: '#dasda' + }, + level: 5 + } + ], + height: 111, + birthday: new Date(), + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321 + } + } } const actP3: Person = { - id: 1234567, - zodiac: 'aries', - updateMoment: new Date(), - firstName: 'Dima', - lastName: 'Dima', - pictures: [ - { - id: 1, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', - }, - { - id: 2, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', - }, - ], - interests: [ - { - topic: { - id: 123, - name: 'programming', - icon: { - id: 123, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405', + id: 1234567, + zodiac: 'aries', + updateMoment: new Date(), + firstName: 'Dima', + lastName: 'Dima', + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' }, - color: '#dasda', - }, - level: 5, - }, - ], - height: 111, - birthday: new Date(), - faculty: 'piict', - location: { - name: 'nameLoc', - coordinates: { - latitude: 321, - longitude: 321, - }, - }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + } + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + }, + color: '#dasda' + }, + level: 5 + } + ], + height: 111, + birthday: new Date(), + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321 + } + } } -const personArray = [actP, actP2, actP3] - +const personArrayOld = [actP, actP2, actP3] +personArrayOld.map(()=>{}) export const SwiperMenu = () => { - const [, setSwiperRef] = useState() - const [iter, setIter] = useState(0) - const [actualPerson, setActualPerson] = useState(actP) - const [attitudeGotten, setAttitudeGotten] = useState(false) + const [_, setSwiperRef] = useState() + const [iter, setIter] = useState(0) + const [actualPerson, setActualPerson] = useState(actP) + const [attitudeGotten, setAttitudeGotten] = useState(false) + const [personArray, setPersonArray] = useState>([]) + const [personIdArray, setPersonIdArray] = useState>([]) - useEffect(() => { - if (attitudeGotten) { - setActualPerson(personArray[(iter + 1) % personArray.length]) - setIter((prevState) => (prevState + 1) % personArray.length) - setAttitudeGotten(false) - } - }, [attitudeGotten]) + useEffectOnce(() => { + getSuggestions(setPersonIdArray, 20) + }) - return ( -
- - { - setAttitude(actualPerson.id, 'skip') - setAttitudeGotten(true) - }} - style={{ - left: '7%', - marginTop: '75%', - width: '35%', - height: '7%', - zIndex: '2', - textAlign: 'center', - backgroundColor: 'red', - }} - > - Skip - - { - setAttitude(actualPerson.id, 'like') - setAttitudeGotten(true) - }} - style={{ - right: '7%', - marginTop: '75%', - width: '35%', - height: '7%', - zIndex: '2', - textAlign: 'center', - backgroundColor: 'green', - }} - > - Like - - - {actualPerson.pictures.map((p, index) => ( - - {`Picture - - ))} - - -
- {actualPerson.firstName} {actualPerson.lastName} -
-
- height: {actualPerson.height} -
-
- location: {JSON.stringify(actualPerson.location)} -
-
- faculty: {actualPerson.faculty} -
-
- birthday: {actualPerson.birthday.toDateString()} -
-
- lastUpdate: {actualPerson.updateMoment.toString()} -
-
id: {actualPerson.id}
-
- zodiac sign: {actualPerson.zodiac} -
-
- interests:{' '} - {actualPerson.interests.map((i) => ( -
-
-
- -
- {i.topic.id} {i.topic.name} {i.topic.color} -
-
-
-
level: {i.level}
-
- ))} -
-
-
-
- ) -} + useEffect(() => { + for (let personId of personIdArray) { + getUser(personId).then(personResponse => { + const person = personResponse.data + const newUser: Person = { + id: person.userId, + zodiac: person.zodiac, + updateMoment: new Date(), + firstName: person.firstName, + lastName: person.lastName, + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + } + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405' + }, + color: '#dasda' + }, + level: 5 + } + ], + height: person.height, + birthday: person.birthday, + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321 + } + } + } + setPersonArray((prevState) => [...prevState, newUser] + ) + }) + } + }, [personIdArray]); + + useEffect(() => { + if (attitudeGotten) { + setActualPerson(personArray[(iter + 1) % personArray.length]) + setIter((prevState) => (prevState + 1) % personArray.length) + setAttitudeGotten(false) + } + }, [attitudeGotten]); + + return ( +
+ + { + setAttitude(actualPerson.id, 'skip'); + setAttitudeGotten(true) + }} style={{ + left: '7%', + marginTop: '75%', + width: '35%', + height: '7%', + zIndex: '2', + textAlign: 'center', + backgroundColor: 'red' + }}> + Skip + + { + setAttitude(actualPerson.id, 'like'); + setAttitudeGotten(true) + }} style={{ + right: '7%', + marginTop: '75%', + width: '35%', + height: '7%', + zIndex: '2', + textAlign: 'center', + backgroundColor: 'green' + }}> + Like + + + {actualPerson.pictures.map((p, index) => ( + + {`Picture + + ))} + + +
{actualPerson.firstName} {actualPerson.lastName}
+
height: {actualPerson.height}
+
location: {JSON.stringify(actualPerson.location)}
+
faculty: {actualPerson.faculty}
+
birthday: {actualPerson.birthday.toDateString()}
+
lastUpdate: {actualPerson.updateMoment.toString()}
+
id: {actualPerson.id}
+
zodiac sign: {actualPerson.zodiac}
+
interests: {actualPerson.interests.map(i => ( +
+
+
+ +
{i.topic.id} {i.topic.name} {i.topic.color}
+
+
+
level: {i.level}
+
+ ))}
+
+
+
+ ) +} \ No newline at end of file From c14e02ae59675efb0ee4b13447719189d4893507 Mon Sep 17 00:00:00 2001 From: Kimiega Date: Wed, 15 Jan 2025 00:33:38 +0300 Subject: [PATCH 2/8] Fix ssl backend and cors and more small fixes --- backend/config/crypto/ca.cnf | 15 +++++++++++++++ backend/consul/Dockerfile | 2 ++ backend/consul/config/consul.hcl | 4 ++++ backend/consul/run.sh | 3 +-- backend/gateway/build.gradle.kts | 2 +- ...ContextConfig.kt => ClientSSLContextConfig.kt} | 10 +++++----- .../ru/ifmo/se/dating/gateway}/CorsFilter.kt | 2 +- .../gateway/src/main/resources/application.yml | 8 +++++++- .../resources/application-service-discovery.yml | 2 ++ compose.yml | 1 - 10 files changed, 38 insertions(+), 11 deletions(-) rename backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/{SSLContextConfig.kt => ClientSSLContextConfig.kt} (88%) rename backend/{foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api => gateway/src/main/kotlin/ru/ifmo/se/dating/gateway}/CorsFilter.kt (97%) diff --git a/backend/config/crypto/ca.cnf b/backend/config/crypto/ca.cnf index 9545e9f8..e28731f6 100644 --- a/backend/config/crypto/ca.cnf +++ b/backend/config/crypto/ca.cnf @@ -19,3 +19,18 @@ authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign +[req_ext] +subjectAltName = @alt_names + +[alt_names] +DNS.1 = localhost +DNS.2 = authik-0.dating.se.ifmo.ru +DNS.3 = authik-1.dating.se.ifmo.ru +DNS.4 = authik-2.dating.se.ifmo.ru +DNS.5 = matchmaker-0.dating.se.ifmo.ru +DNS.6 = matchmaker-1.dating.se.ifmo.ru +DNS.7 = matchmaker-2.dating.se.ifmo.ru +DNS.8 = people-0.dating.se.ifmo.ru +DNS.9 = people-1.dating.se.ifmo.ru +DNS.10 = people-2.dating.se.ifmo.ru +DNS.11 = server.dc1.consul diff --git a/backend/consul/Dockerfile b/backend/consul/Dockerfile index 2c31c6e3..728ebb62 100644 --- a/backend/consul/Dockerfile +++ b/backend/consul/Dockerfile @@ -12,3 +12,5 @@ RUN chmod -R 755 /consul/config && \ chmod 644 /consul/config/itmo-dating-backend.crt && \ chmod 644 /consul/config/itmo-dating-backend-ca.crt && \ chmod 644 /consul/config/consul.hcl + +CMD ["sh", "./consul/run.sh"] diff --git a/backend/consul/config/consul.hcl b/backend/consul/config/consul.hcl index c7a56c7c..cd23589b 100644 --- a/backend/consul/config/consul.hcl +++ b/backend/consul/config/consul.hcl @@ -14,6 +14,10 @@ acl { enable_token_persistence = true } +limits { + http_max_conns_per_client = 400 +} + data_dir = "/opt/consul/data" ui = true diff --git a/backend/consul/run.sh b/backend/consul/run.sh index fe40436b..f82d7063 100644 --- a/backend/consul/run.sh +++ b/backend/consul/run.sh @@ -1,4 +1,3 @@ #!/bin/sh -consul agent -config-file=/consul/config/consul.hcl -bootstrap-expect=1 \ - | grep -v "This request used the token query parameter which is deprecated and will be removed" +consul agent -config-file=/consul/config/consul.hcl -bootstrap-expect=1 | grep -v "This request used the token query parameter which is deprecated and will be removed" diff --git a/backend/gateway/build.gradle.kts b/backend/gateway/build.gradle.kts index 543ffb79..0a750ae4 100644 --- a/backend/gateway/build.gradle.kts +++ b/backend/gateway/build.gradle.kts @@ -7,7 +7,7 @@ dependencies { implementation(libs.org.springframework.boot.spring.boot) implementation(libs.org.springframework.cloud.spring.cloud.starter.gateway) - + implementation(libs.org.springframework.spring.web) implementation(libs.org.springdoc.springdoc.openapi.starter.webflux.ui) testImplementation(libs.org.springframework.boot.spring.boot.starter.test) diff --git a/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/SSLContextConfig.kt b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/ClientSSLContextConfig.kt similarity index 88% rename from backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/SSLContextConfig.kt rename to backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/ClientSSLContextConfig.kt index ec5abc47..aff268c1 100644 --- a/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/SSLContextConfig.kt +++ b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/ClientSSLContextConfig.kt @@ -12,17 +12,17 @@ import javax.net.ssl.KeyManagerFactory import javax.net.ssl.TrustManagerFactory @Configuration -class SSLContextConfig( - @Value("\${server.ssl.key-store-type}") +class ClientSSLContextConfig( + @Value("\${client.ssl.key-store-type}") private val keyStoreType: String, - @Value("\${server.ssl.key-store}") + @Value("\${client.ssl.key-store}") private val keyStore: Resource, - @Value("\${server.ssl.key-store-password}") + @Value("\${client.ssl.key-store-password}") private val keyStorePassword: String, - @Value("\${server.ssl.protocol}") + @Value("\${client.ssl.protocol}") private val sslProtocol: String, ) { @Bean diff --git a/backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api/CorsFilter.kt b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt similarity index 97% rename from backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api/CorsFilter.kt rename to backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt index 7c8b3dd8..ffd4fe8d 100644 --- a/backend/foundation/src/main/kotlin/ru/ifmo/se/dating/spring/api/CorsFilter.kt +++ b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt @@ -1,4 +1,4 @@ -package ru.ifmo.se.dating.spring.api +package ru.ifmo.se.dating.gateway import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus diff --git a/backend/gateway/src/main/resources/application.yml b/backend/gateway/src/main/resources/application.yml index fb0e6b78..6e083234 100644 --- a/backend/gateway/src/main/resources/application.yml +++ b/backend/gateway/src/main/resources/application.yml @@ -95,10 +95,16 @@ server: ssl: enabled: true key-store-type: PKCS12 - key-store: classpath:keystore/itmo-dating-backend.p12 + key-store: classpath:keystore/keystore.p12 key-store-password: ${KEY_STORE_PASSWORD} protocol: TLSv1.3 enabled-protocols: TLSv1.3 +client: + ssl: + key-store-type: PKCS12 + key-store: classpath:keystore/itmo-dating-backend.p12 + key-store-password: ${KEY_STORE_PASSWORD} + protocol: TLSv1.3 springdoc: swagger-ui: path: /swagger-ui.html diff --git a/backend/starter-service-discovery/src/main/resources/application-service-discovery.yml b/backend/starter-service-discovery/src/main/resources/application-service-discovery.yml index 0786a341..b06406c0 100644 --- a/backend/starter-service-discovery/src/main/resources/application-service-discovery.yml +++ b/backend/starter-service-discovery/src/main/resources/application-service-discovery.yml @@ -16,6 +16,8 @@ spring: instance-id: instance-${HOSTNAME} heartbeat: enabled: true + ttl: 30 + catalog-services-watch-delay: 5000 management: health: consul: diff --git a/compose.yml b/compose.yml index b98dce0b..846d1f60 100644 --- a/compose.yml +++ b/compose.yml @@ -85,7 +85,6 @@ services: image: ghcr.io/secs-dev/itmo-dating-consul:latest build: context: ./backend/consul - command: sh ./consul/run.sh hostname: server.dc1.consul ports: - "127.0.0.1:8500:8500/tcp" From 9da398b3a1cabaed1b1bc7acc7611b72a56fab55 Mon Sep 17 00:00:00 2001 From: Kimiega Date: Wed, 15 Jan 2025 00:45:17 +0300 Subject: [PATCH 3/8] fix ci 1 --- .../kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt index ffd4fe8d..558d6c17 100644 --- a/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt +++ b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt @@ -13,13 +13,16 @@ class CorsFilter : WebFilter { // FIXME override fun filter(ctx: ServerWebExchange, chain: WebFilterChain): Mono { ctx.response.headers.add("Access-Control-Allow-Origin", "*") - ctx.response.headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, PATCH, DELETE, OPTIONS") + ctx.response.headers.add( + "Access-Control-Allow-Methods", + "GET, PUT, POST, PATCH, DELETE, OPTIONS" + ) ctx.response.headers.add( "Access-Control-Allow-Headers", -// "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," + -// "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Authorization" +// "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," + +// "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Authorization" "*" - ) + ) if (ctx.request.method == HttpMethod.OPTIONS) { ctx.response.headers.add("Access-Control-Max-Age", "1728000") ctx.response.statusCode = HttpStatus.NO_CONTENT @@ -28,7 +31,7 @@ class CorsFilter : WebFilter { ctx.response.headers.add( "Access-Control-Expose-Headers", "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," + - "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range" + "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range" ) return chain.filter(ctx) ?: Mono.empty() } From 98e2606c2cdcfd40d2f69cd4109190803b6108a6 Mon Sep 17 00:00:00 2001 From: Kimiega Date: Wed, 15 Jan 2025 00:49:06 +0300 Subject: [PATCH 4/8] fix ci 2 --- .../src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt index 558d6c17..4ada943c 100644 --- a/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt +++ b/backend/gateway/src/main/kotlin/ru/ifmo/se/dating/gateway/CorsFilter.kt @@ -31,7 +31,7 @@ class CorsFilter : WebFilter { ctx.response.headers.add( "Access-Control-Expose-Headers", "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With," + - "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range" + "If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range" ) return chain.filter(ctx) ?: Mono.empty() } From 6e3d38fd96cf27e16bebe5aeed06ecd76ca7ca90 Mon Sep 17 00:00:00 2001 From: Kimiega Date: Wed, 15 Jan 2025 01:54:07 +0300 Subject: [PATCH 5/8] generating external self signed certificate --- backend/config/crypto/keys.bash | 5 +++++ backend/gateway/src/main/resources/application.yml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/config/crypto/keys.bash b/backend/config/crypto/keys.bash index cc83f601..f26afe17 100755 --- a/backend/config/crypto/keys.bash +++ b/backend/config/crypto/keys.bash @@ -7,6 +7,7 @@ ENV="$2" ALIAS="itmo-dating" ALIAS_BACKEND="$ALIAS-backend" +ALIAS_EXTERNAL="$ALIAS-external" VALIDITY=1 PASSWORD="$ITMO_DATING_KEY_STORE_PASSWORD" @@ -71,6 +72,9 @@ function generate() { -deststoretype JKS \ -destkeystore "$ALIAS_BACKEND.jks" \ -deststorepass "$PASSWORD" + + echo "Copying PKCS12 as external certificate" + cp "$ALIAS_BACKEND.p12" "$ALIAS_EXTERNAL.p12" } function copy() { @@ -92,6 +96,7 @@ function distribute() { echo "Copying package to the gateway..." copy "$GATEWAY_INSTALL_PATH" "$ALIAS_BACKEND.p12" + copy "$GATEWAY_INSTALL_PATH" "$ALIAS_EXTERNAL.p12" echo "Copying keys to the consul..." copy "$CONSUL_INSTALL_PATH" "$ALIAS_BACKEND.key" diff --git a/backend/gateway/src/main/resources/application.yml b/backend/gateway/src/main/resources/application.yml index 6e083234..bc15ae80 100644 --- a/backend/gateway/src/main/resources/application.yml +++ b/backend/gateway/src/main/resources/application.yml @@ -95,7 +95,7 @@ server: ssl: enabled: true key-store-type: PKCS12 - key-store: classpath:keystore/keystore.p12 + key-store: classpath:keystore/itmo-dating-external.p12 key-store-password: ${KEY_STORE_PASSWORD} protocol: TLSv1.3 enabled-protocols: TLSv1.3 From ca80f020ae66876f9f091e7ccf58fe8c58f2f5d5 Mon Sep 17 00:00:00 2001 From: Kimiega Date: Wed, 15 Jan 2025 02:04:57 +0300 Subject: [PATCH 6/8] fix ci 3 --- .../test/kotlin/ru/ifmo/se/dating/gateway/SecurityInitializer.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/gateway/src/test/kotlin/ru/ifmo/se/dating/gateway/SecurityInitializer.kt b/backend/gateway/src/test/kotlin/ru/ifmo/se/dating/gateway/SecurityInitializer.kt index fb81269f..1a38353c 100644 --- a/backend/gateway/src/test/kotlin/ru/ifmo/se/dating/gateway/SecurityInitializer.kt +++ b/backend/gateway/src/test/kotlin/ru/ifmo/se/dating/gateway/SecurityInitializer.kt @@ -12,6 +12,7 @@ class SecurityInitializer : override fun initialize(ctx: ConfigurableApplicationContext) { TestPropertyValues.of( "server.ssl.key-store-password=$keyStorePassword", + "client.ssl.key-store-password=$keyStorePassword", ).applyTo(ctx.environment) } } From 56813bd136b982be07f1dcbfd7b33a7ccf9f6510 Mon Sep 17 00:00:00 2001 From: Kimiega Date: Wed, 15 Jan 2025 05:34:14 +0300 Subject: [PATCH 7/8] fix ci 4 --- frontend/.eslintrc.cjs | 9 +++++++++ frontend/src/features/patch-person/api/patchPerson.ts | 3 ++- frontend/src/pages/registration/ui/Registration.tsx | 2 +- frontend/src/pages/welcome/ui/Welcome.tsx | 2 +- frontend/src/shared/model/error.ts | 5 +++-- .../ui/RegistrationCommonInfo.tsx | 4 ++-- frontend/src/widgets/swiper/ui/SwiperMenu.tsx | 4 ++-- 7 files changed, 20 insertions(+), 9 deletions(-) diff --git a/frontend/.eslintrc.cjs b/frontend/.eslintrc.cjs index 3488ffcf..9eaf91ff 100644 --- a/frontend/.eslintrc.cjs +++ b/frontend/.eslintrc.cjs @@ -27,5 +27,14 @@ module.exports = { plugins: ['@typescript-eslint', 'react'], rules: { 'react/react-in-jsx-scope': 0, + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ + 'warn', // or "error" + { + 'argsIgnorePattern': '^_', + "varsIgnorePattern": '^_', + 'caughtErrorsIgnorePattern': '^_' + } + ] }, } diff --git a/frontend/src/features/patch-person/api/patchPerson.ts b/frontend/src/features/patch-person/api/patchPerson.ts index ab45db62..3c755dbd 100644 --- a/frontend/src/features/patch-person/api/patchPerson.ts +++ b/frontend/src/features/patch-person/api/patchPerson.ts @@ -3,8 +3,9 @@ import { backendPeopleUrl } from '@/shared/api' import { RegistrationData } from '@/entities' import { $authStore, $userIdStore } from '@/features/authentication/api/authFx.ts' import { PersonPatch } from '@/entities/person-patch/model/PersonPatch.ts' +import {IError} from "@/shared/model"; -export function patchPerson(registartionData: RegistrationData, status: string): Promise> { +export function patchPerson(registartionData: RegistrationData, status: string): Promise> { const url = `${backendPeopleUrl}/api/people/${$userIdStore.getState()}`; const config = { method: 'PATCH', diff --git a/frontend/src/pages/registration/ui/Registration.tsx b/frontend/src/pages/registration/ui/Registration.tsx index fa272f08..0361c4a6 100644 --- a/frontend/src/pages/registration/ui/Registration.tsx +++ b/frontend/src/pages/registration/ui/Registration.tsx @@ -30,7 +30,7 @@ export const Registration = () => { { tgId: tgUser?.id?.toString() || null, name: tgUser?.firstName || null, - surname: tgUser?.lastName!! || null, + surname: tgUser?.lastName || null, height: 175, facultyId: null, birthday: null, diff --git a/frontend/src/pages/welcome/ui/Welcome.tsx b/frontend/src/pages/welcome/ui/Welcome.tsx index 994f795b..0538b635 100644 --- a/frontend/src/pages/welcome/ui/Welcome.tsx +++ b/frontend/src/pages/welcome/ui/Welcome.tsx @@ -13,7 +13,7 @@ export const Welcome = () => { redirect({clock: userRegisteredFx.doneData, route: routes.main}) redirect({clock: userRegisteredFx.failData, route: routes.registration}) useEffect(() => { - const userId: string = JSON.parse(atob($authStore.getState().token!!.split(".")[1])).user_id; + const userId: string = JSON.parse(atob(($authStore.getState().token || '').split(".")[1])).user_id; userIdFx(Number(userId)) getUser(Number(userId)).then((x) => { if (x.data.status == 'ready') diff --git a/frontend/src/shared/model/error.ts b/frontend/src/shared/model/error.ts index aa6d8567..9dad3d72 100644 --- a/frontend/src/shared/model/error.ts +++ b/frontend/src/shared/model/error.ts @@ -1,4 +1,5 @@ export interface IError { - code?: number | null - message: string + code: number | null + status: string | null + message: string | null } diff --git a/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx b/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx index 9cbad1ff..5725c3d9 100644 --- a/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx +++ b/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx @@ -56,7 +56,7 @@ export const RegistrationCommonInfo = ({
{/*
*/} @@ -93,7 +93,7 @@ export const RegistrationCommonInfo = ({
diff --git a/frontend/src/widgets/swiper/ui/SwiperMenu.tsx b/frontend/src/widgets/swiper/ui/SwiperMenu.tsx index 53ff0fb9..0103724a 100644 --- a/frontend/src/widgets/swiper/ui/SwiperMenu.tsx +++ b/frontend/src/widgets/swiper/ui/SwiperMenu.tsx @@ -175,7 +175,7 @@ export const SwiperMenu = () => { }) useEffect(() => { - for (let personId of personIdArray) { + for (const personId of personIdArray) { getUser(personId).then(personResponse => { const person = personResponse.data const newUser: Person = { @@ -302,7 +302,7 @@ export const SwiperMenu = () => {
id: {actualPerson.id}
zodiac sign: {actualPerson.zodiac}
interests: {actualPerson.interests.map(i => ( -
+
From 379c6fd37057de32dd71f504b21109bd98fe64c4 Mon Sep 17 00:00:00 2001 From: Kimiega Date: Wed, 15 Jan 2025 05:42:40 +0300 Subject: [PATCH 8/8] frontend format fix --- frontend/.eslintrc.cjs | 10 +- frontend/src/app/routes/ui/index.tsx | 12 +- .../person-patch/model/PersonPatch.ts | 20 +- frontend/src/entities/person/model/Person.ts | 20 +- .../registration-data/model/Coordinates.ts | 6 +- .../registration-data/model/Location.ts | 9 +- .../model/RegistartionData.ts | 20 +- .../registration-data/model/faculty.ts | 4 +- .../src/features/authentication/api/authFx.ts | 111 ++-- .../features/edit-profile/api/editProfile.ts | 58 +- .../get-faculties/api/getFaculties.ts | 41 +- .../get-locations/api/getLocations.ts | 49 +- .../get-suggestions/api/getSuggestions.ts | 42 +- .../src/features/get-topics/api/getTopics.ts | 38 +- frontend/src/features/get_user/api/getUser.ts | 24 +- .../features/patch-person/api/patchPerson.ts | 54 +- frontend/src/pages/Home.tsx | 26 +- .../pages/registration/ui/Registration.tsx | 240 ++++--- frontend/src/pages/welcome/ui/Welcome.tsx | 52 +- .../ui/RegistrationCommonInfo.tsx | 208 +++--- frontend/src/widgets/swiper/ui/SwiperMenu.tsx | 606 ++++++++++-------- 21 files changed, 872 insertions(+), 778 deletions(-) diff --git a/frontend/.eslintrc.cjs b/frontend/.eslintrc.cjs index 9eaf91ff..5aa7e3e5 100644 --- a/frontend/.eslintrc.cjs +++ b/frontend/.eslintrc.cjs @@ -31,10 +31,10 @@ module.exports = { '@typescript-eslint/no-unused-vars': [ 'warn', // or "error" { - 'argsIgnorePattern': '^_', - "varsIgnorePattern": '^_', - 'caughtErrorsIgnorePattern': '^_' - } - ] + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], }, } diff --git a/frontend/src/app/routes/ui/index.tsx b/frontend/src/app/routes/ui/index.tsx index 47996bfa..13e997b2 100644 --- a/frontend/src/app/routes/ui/index.tsx +++ b/frontend/src/app/routes/ui/index.tsx @@ -4,9 +4,9 @@ import { Registration, Main } from '@/pages' import { Welcome } from '@/pages/welcome/ui/Welcome.tsx' export const Routes = () => ( - <> - - - - -); \ No newline at end of file + <> + + + + +) diff --git a/frontend/src/entities/person-patch/model/PersonPatch.ts b/frontend/src/entities/person-patch/model/PersonPatch.ts index 0871343b..e02eb682 100644 --- a/frontend/src/entities/person-patch/model/PersonPatch.ts +++ b/frontend/src/entities/person-patch/model/PersonPatch.ts @@ -1,15 +1,15 @@ export interface PersonPatch { - status: string | null, - firstName: string | null, - lastName: string | null, - interests: Topic[] | null, - height: number | null, - birthday: string | null, - facultyId: number | null, - locationId: number | null + status: string | null + firstName: string | null + lastName: string | null + interests: Topic[] | null + height: number | null + birthday: string | null + facultyId: number | null + locationId: number | null } export interface Topic { - topicId: number, - level: number + topicId: number + level: number } diff --git a/frontend/src/entities/person/model/Person.ts b/frontend/src/entities/person/model/Person.ts index 84d58b58..b6eaf995 100644 --- a/frontend/src/entities/person/model/Person.ts +++ b/frontend/src/entities/person/model/Person.ts @@ -17,14 +17,14 @@ export interface Person { } export interface PersonLegacy { - status: string, - userId: number, - firstName: string, - zodiac: string, - lastName: string, - interests: Interest[], - height: number, - birthday: Date, - facultyId: number, - locationId: number + status: string + userId: number + firstName: string + zodiac: string + lastName: string + interests: Interest[] + height: number + birthday: Date + facultyId: number + locationId: number } diff --git a/frontend/src/entities/registration-data/model/Coordinates.ts b/frontend/src/entities/registration-data/model/Coordinates.ts index 5c3788e1..747e43cb 100644 --- a/frontend/src/entities/registration-data/model/Coordinates.ts +++ b/frontend/src/entities/registration-data/model/Coordinates.ts @@ -1,4 +1,4 @@ export interface Coordinates { - latitude: number, - longitude: number -} \ No newline at end of file + latitude: number + longitude: number +} diff --git a/frontend/src/entities/registration-data/model/Location.ts b/frontend/src/entities/registration-data/model/Location.ts index 37f4cd30..3a00971b 100644 --- a/frontend/src/entities/registration-data/model/Location.ts +++ b/frontend/src/entities/registration-data/model/Location.ts @@ -1,8 +1,7 @@ import { Coordinates } from './Coordinates.ts' export interface Location { - id: number, - name: string, - coordinates: Coordinates - -} \ No newline at end of file + id: number + name: string + coordinates: Coordinates +} diff --git a/frontend/src/entities/registration-data/model/RegistartionData.ts b/frontend/src/entities/registration-data/model/RegistartionData.ts index 0f5a88a5..c63eb9ab 100644 --- a/frontend/src/entities/registration-data/model/RegistartionData.ts +++ b/frontend/src/entities/registration-data/model/RegistartionData.ts @@ -2,13 +2,13 @@ import { Interest } from './interest.ts' import { Picture } from './picture.ts' export type RegistrationData = { - tgId: string | null; - name: string | null; - surname: string | null; - height: number | null; - facultyId: number | null; - birthday: Date | null; - pictures: Picture[] | null; - interests: Interest[] | null; - locationId: number | null; -}; + tgId: string | null + name: string | null + surname: string | null + height: number | null + facultyId: number | null + birthday: Date | null + pictures: Picture[] | null + interests: Interest[] | null + locationId: number | null +} diff --git a/frontend/src/entities/registration-data/model/faculty.ts b/frontend/src/entities/registration-data/model/faculty.ts index 0ecfdfb1..92198098 100644 --- a/frontend/src/entities/registration-data/model/faculty.ts +++ b/frontend/src/entities/registration-data/model/faculty.ts @@ -1,4 +1,4 @@ export interface Faculty { - id: number, - longName: string + id: number + longName: string } diff --git a/frontend/src/features/authentication/api/authFx.ts b/frontend/src/features/authentication/api/authFx.ts index 2bdab358..5d245e15 100644 --- a/frontend/src/features/authentication/api/authFx.ts +++ b/frontend/src/features/authentication/api/authFx.ts @@ -1,80 +1,79 @@ -import {createEffect, createStore} from 'effector' -import {persist} from 'effector-storage/session' -import {AuthRequest} from '../model/AuthRequest.ts' -import {AuthResponse} from '../model/AuthResponse.ts' +import { createEffect, createStore } from 'effector' +import { persist } from 'effector-storage/session' +import { AuthRequest } from '../model/AuthRequest.ts' +import { AuthResponse } from '../model/AuthResponse.ts' import axios from 'axios' -import {AuthState, initialAuthState} from '@/entities' -import {backendAuthikUrl} from '@/shared/api' +import { AuthState, initialAuthState } from '@/entities' +import { backendAuthikUrl } from '@/shared/api' export const $authStore = createStore(initialAuthState) -export const $userIdStore = createStore(null); +export const $userIdStore = createStore(null) -export const $userRegisteredStore = createStore(false); +export const $userRegisteredStore = createStore(false) - -persist({store: $authStore, key: 'authStore'}) -persist({store: $userIdStore, key: 'userIdStore'}) -persist({store: $userRegisteredStore, key: 'userRegisteredStore'}) +persist({ store: $authStore, key: 'authStore' }) +persist({ store: $userIdStore, key: 'userIdStore' }) +persist({ store: $userRegisteredStore, key: 'userRegisteredStore' }) export const authFx = createEffect({ - handler: async (authReq) => { - try { - const response = await axios.put( - `${backendAuthikUrl}/api/auth/telegram/web-app`, - JSON.stringify(authReq), - { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - }, - ) - return fillAuthState(response.data) - } catch (error) { - console.error(error) - throw new Error('Auth failed') - } - }, + handler: async (authReq) => { + try { + const response = await axios.put( + `${backendAuthikUrl}/api/auth/telegram/web-app`, + JSON.stringify(authReq), + { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + }, + ) + return fillAuthState(response.data) + } catch (error) { + console.error(error) + throw new Error('Auth failed') + } + }, }) const fillAuthState = (response: AuthResponse): AuthState => { - return { - token: response.access, - loading: false, - tgId: '-1', - isAuthenticated: true, - error: null - }; + return { + token: response.access, + loading: false, + tgId: '-1', + isAuthenticated: true, + error: null, + } } -export const $isAuthenticated = $authStore.map(state => state.isAuthenticated) +export const $isAuthenticated = $authStore.map((state) => state.isAuthenticated) -$authStore.on(authFx.doneData, (_, result) => result); -$authStore.on(authFx.failData, (_, error) => ({...initialAuthState, loading: false, error: error.message})); +$authStore.on(authFx.doneData, (_, result) => result) +$authStore.on(authFx.failData, (_, error) => ({ + ...initialAuthState, + loading: false, + error: error.message, +})) export const userIdFx = createEffect({ - handler: async (x) => { - if (x == null) - throw Error("x is null") - return x - } - } -) + handler: async (x) => { + if (x == null) throw Error('x is null') + return x + }, +}) export const userRegisteredFx = createEffect({ - handler: async (x) => { - if (!x) - throw Error("user not registered") - return x - } - } -) + handler: async (x) => { + if (!x) throw Error('user not registered') + return x + }, +}) $userIdStore.on(userIdFx.doneData, (_, result) => result) $userIdStore.on(userIdFx.failData, (_, __) => { - return null + return null }) $userRegisteredStore.on(userRegisteredFx.doneData, (_, result) => result) $userRegisteredStore.on(userRegisteredFx.failData, (_, __) => { - return false + return false }) diff --git a/frontend/src/features/edit-profile/api/editProfile.ts b/frontend/src/features/edit-profile/api/editProfile.ts index 49aca01e..31740b80 100644 --- a/frontend/src/features/edit-profile/api/editProfile.ts +++ b/frontend/src/features/edit-profile/api/editProfile.ts @@ -6,33 +6,33 @@ import { PersonPatch } from '@/entities/person-patch/model/PersonPatch.ts' export function editProfile(profile: Person) { const url = `${backendPeopleUrl}/api/people/${profile.id}` - // FIXME jwt token - const basicAuth = 'test basic auth' - const config = { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': +basicAuth, - }, - } - const profilePatch: PersonPatch = { - status: 'ready', - firstName: profile.firstName, - lastName: profile.lastName, - interests: profile.interests.map((interest) => { - return { topicId: interest.topic.id, level: interest.level } - }), - height: profile.height, - birthday: `${profile.birthday.getFullYear()}-${profile.birthday.getMonth()}-${profile.birthday.getDay()}`, - facultyId: 1, - locationId: 1, - } - axios - .post(url, profilePatch, config) - .then((response) => { - console.log(response.data); - }) - .catch((error) => { - console.error('Error patching: ', error) - }) + // FIXME jwt token + const basicAuth = 'test basic auth' + const config = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: +basicAuth, + }, + } + const profilePatch: PersonPatch = { + status: 'ready', + firstName: profile.firstName, + lastName: profile.lastName, + interests: profile.interests.map((interest) => { + return { topicId: interest.topic.id, level: interest.level } + }), + height: profile.height, + birthday: `${profile.birthday.getFullYear()}-${profile.birthday.getMonth()}-${profile.birthday.getDay()}`, + facultyId: 1, + locationId: 1, + } + axios + .post(url, profilePatch, config) + .then((response) => { + console.log(response.data) + }) + .catch((error) => { + console.error('Error patching: ', error) + }) } diff --git a/frontend/src/features/get-faculties/api/getFaculties.ts b/frontend/src/features/get-faculties/api/getFaculties.ts index 8086943e..77cbffc7 100644 --- a/frontend/src/features/get-faculties/api/getFaculties.ts +++ b/frontend/src/features/get-faculties/api/getFaculties.ts @@ -1,22 +1,23 @@ -import axios from "axios"; -import React from "react"; -import {backendPeopleUrl} from "@/shared/api"; -import {Faculty} from "@/entities/registration-data/model/faculty.ts"; +import axios from 'axios' +import React from 'react' +import { backendPeopleUrl } from '@/shared/api' +import { Faculty } from '@/entities/registration-data/model/faculty.ts' -export function getFaculties(setFaculties: React.Dispatch>>) { - const url = `${backendPeopleUrl}/api/faculties`; +export function getFaculties( + setFaculties: React.Dispatch>>, +) { + const url = `${backendPeopleUrl}/api/faculties` - axios.get(url) - .then((response) => { - console.log(response.data); - //FIXME after integration with backend - setFaculties(response.data) - }) - .catch((error) => { - console.error("Error getting faculties: ", error); - //TODO remove after integration with backend - setFaculties([ - {id: 1, longName: "piict"} - ]) - }) -} \ No newline at end of file + axios + .get(url) + .then((response) => { + console.log(response.data) + //FIXME after integration with backend + setFaculties(response.data) + }) + .catch((error) => { + console.error('Error getting faculties: ', error) + //TODO remove after integration with backend + setFaculties([{ id: 1, longName: 'piict' }]) + }) +} diff --git a/frontend/src/features/get-locations/api/getLocations.ts b/frontend/src/features/get-locations/api/getLocations.ts index e08594d4..42acb2eb 100644 --- a/frontend/src/features/get-locations/api/getLocations.ts +++ b/frontend/src/features/get-locations/api/getLocations.ts @@ -3,27 +3,30 @@ import React from 'react' import { backendPeopleUrl } from '@/shared/api' import { Location } from '@/entities/registration-data/model/Location.ts' -export function getLocations(setLocations: React.Dispatch>>) { - const url = `${backendPeopleUrl}/api/locations`; +export function getLocations( + setLocations: React.Dispatch>>, +) { + const url = `${backendPeopleUrl}/api/locations` - axios.get(url) - .then((response) => { - console.log(response.data); - //FIXME after integration with backend - setLocations(response.data) - }) - .catch((error) => { - console.error("Error getting locations: ", error); - //TODO remove after integration with backend - setLocations([ - { - "id": 1, - "name": "ITMO University, Kronverkskiy Avenue", - "coordinates": { - "latitude": 59.957478, - "longitude": 30.308014 - } - } - ]) - }) -} \ No newline at end of file + axios + .get(url) + .then((response) => { + console.log(response.data) + //FIXME after integration with backend + setLocations(response.data) + }) + .catch((error) => { + console.error('Error getting locations: ', error) + //TODO remove after integration with backend + setLocations([ + { + id: 1, + name: 'ITMO University, Kronverkskiy Avenue', + coordinates: { + latitude: 59.957478, + longitude: 30.308014, + }, + }, + ]) + }) +} diff --git a/frontend/src/features/get-suggestions/api/getSuggestions.ts b/frontend/src/features/get-suggestions/api/getSuggestions.ts index a5d92a1c..df6cdfa9 100644 --- a/frontend/src/features/get-suggestions/api/getSuggestions.ts +++ b/frontend/src/features/get-suggestions/api/getSuggestions.ts @@ -3,22 +3,26 @@ import React from 'react' import { backendMatchmakerUrl } from '@/shared/api' import { $authStore } from '@/features/authentication/api/authFx.ts' -export function getSuggestions(setPersonIdArray: React.Dispatch>>, limit: number) { - const url = `${backendMatchmakerUrl}/api/suggestions?limit=${limit}`; - const config = { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${$authStore.getState().token}` - } - } - axios.get(url, config) - .then((response) => { - console.log(response.data); - setPersonIdArray(response.data) - }) - .catch((error) => { - console.error("Error getting suggestions: ", error); - setPersonIdArray([]) - }) -} \ No newline at end of file +export function getSuggestions( + setPersonIdArray: React.Dispatch>>, + limit: number, +) { + const url = `${backendMatchmakerUrl}/api/suggestions?limit=${limit}` + const config = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${$authStore.getState().token}`, + }, + } + axios + .get(url, config) + .then((response) => { + console.log(response.data) + setPersonIdArray(response.data) + }) + .catch((error) => { + console.error('Error getting suggestions: ', error) + setPersonIdArray([]) + }) +} diff --git a/frontend/src/features/get-topics/api/getTopics.ts b/frontend/src/features/get-topics/api/getTopics.ts index c1dfde3b..9db59ef7 100644 --- a/frontend/src/features/get-topics/api/getTopics.ts +++ b/frontend/src/features/get-topics/api/getTopics.ts @@ -4,24 +4,24 @@ import React from 'react' import { backendPeopleUrl } from '@/shared/api' export function getTopics( - setTopics: React.Dispatch>>, - ) { - const url = `${backendPeopleUrl}/api/topics` + setTopics: React.Dispatch>>, +) { + const url = `${backendPeopleUrl}/api/topics` - axios - .get(url) - .then((response) => { - console.log(response.data); - //FIXME after integration with backend - setTopics(response.data) - }) - .catch((error) => { - console.error('Error getting topics: ', error); - //TODO remove after integration with backend - setTopics([ - {id: 1, name: 'programming', color: undefined, icon: undefined}, - {id: 2, name: 'eating', color: undefined, icon: undefined}, - {id: 3, name: 'sleeping', color: undefined, icon: undefined} - ]) - }) + axios + .get(url) + .then((response) => { + console.log(response.data) + //FIXME after integration with backend + setTopics(response.data) + }) + .catch((error) => { + console.error('Error getting topics: ', error) + //TODO remove after integration with backend + setTopics([ + { id: 1, name: 'programming', color: undefined, icon: undefined }, + { id: 2, name: 'eating', color: undefined, icon: undefined }, + { id: 3, name: 'sleeping', color: undefined, icon: undefined }, + ]) + }) } diff --git a/frontend/src/features/get_user/api/getUser.ts b/frontend/src/features/get_user/api/getUser.ts index 529ad876..2bbd33f2 100644 --- a/frontend/src/features/get_user/api/getUser.ts +++ b/frontend/src/features/get_user/api/getUser.ts @@ -4,17 +4,17 @@ import axios, { AxiosResponse } from 'axios' import { $authStore } from '@/features/authentication/api/authFx.ts' export function getUser(userId: number): Promise> { - const url = `${backendPeopleUrl}/api/people/${userId}`; + const url = `${backendPeopleUrl}/api/people/${userId}` - // FIXME jwt token - const basicAuth = `Bearer ${$authStore.getState().token}` - const config = { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'Authorization': basicAuth - }, - } + // FIXME jwt token + const basicAuth = `Bearer ${$authStore.getState().token}` + const config = { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: basicAuth, + }, + } - return axios.get(url, config) -} \ No newline at end of file + return axios.get(url, config) +} diff --git a/frontend/src/features/patch-person/api/patchPerson.ts b/frontend/src/features/patch-person/api/patchPerson.ts index 3c755dbd..7d1e8994 100644 --- a/frontend/src/features/patch-person/api/patchPerson.ts +++ b/frontend/src/features/patch-person/api/patchPerson.ts @@ -1,30 +1,36 @@ import axios, { AxiosResponse } from 'axios' import { backendPeopleUrl } from '@/shared/api' import { RegistrationData } from '@/entities' -import { $authStore, $userIdStore } from '@/features/authentication/api/authFx.ts' +import { + $authStore, + $userIdStore, +} from '@/features/authentication/api/authFx.ts' import { PersonPatch } from '@/entities/person-patch/model/PersonPatch.ts' -import {IError} from "@/shared/model"; +import { IError } from '@/shared/model' -export function patchPerson(registartionData: RegistrationData, status: string): Promise> { - const url = `${backendPeopleUrl}/api/people/${$userIdStore.getState()}`; - const config = { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${$authStore.getState().token}` - } - } - const birthday = registartionData.birthday || new Date() - const patchData: PersonPatch = { - status: status, - firstName: registartionData.name, - lastName: registartionData.surname, - interests: registartionData.interests, - height: registartionData.height, - birthday: birthday.toISOString().split('T')[0], - facultyId: registartionData.facultyId, - locationId: registartionData.locationId - } +export function patchPerson( + registartionData: RegistrationData, + status: string, +): Promise> { + const url = `${backendPeopleUrl}/api/people/${$userIdStore.getState()}` + const config = { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${$authStore.getState().token}`, + }, + } + const birthday = registartionData.birthday || new Date() + const patchData: PersonPatch = { + status: status, + firstName: registartionData.name, + lastName: registartionData.surname, + interests: registartionData.interests, + height: registartionData.height, + birthday: birthday.toISOString().split('T')[0], + facultyId: registartionData.facultyId, + locationId: registartionData.locationId, + } - return axios.patch(url, JSON.stringify(patchData), config) -} \ No newline at end of file + return axios.patch(url, JSON.stringify(patchData), config) +} diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 32d5398a..e97f713d 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -2,17 +2,17 @@ import { Link } from 'atomic-router-react' import { Text } from '@telegram-apps/telegram-ui' import { AuthTest } from '@/widgets' export const Home = () => { - return ( - <> - - TEXT - -
- -
- - Main - - - ) + return ( + <> + + TEXT + +
+ +
+ + Main + + + ) } diff --git a/frontend/src/pages/registration/ui/Registration.tsx b/frontend/src/pages/registration/ui/Registration.tsx index 0361c4a6..39e5dec2 100644 --- a/frontend/src/pages/registration/ui/Registration.tsx +++ b/frontend/src/pages/registration/ui/Registration.tsx @@ -4,8 +4,8 @@ import { useEffect, useState } from 'react' import { fetchTgUser } from '@/features/fetch-tg-user/api/fetchTgUser.ts' import { RegistrationData } from '@/entities' import { - setMainButtonParams, - setMainButtonVisible, + setMainButtonParams, + setMainButtonVisible, } from '@/entities/main-button' import { setMainButtonOnClick } from '@/entities/main-button/api/mainButtonOnClick.ts' import { RegistrationPictures } from '@/widgets/registration-pictures' @@ -17,136 +17,130 @@ import { useEffectOnce } from '@/shared/api' import { patchPerson } from '@/features/patch-person/api/patchPerson.ts' export const Registration = () => { - const registrationOrder = [ - 'registration-common', - 'registration-pictures', - 'registration-interests', - ] + const registrationOrder = [ + 'registration-common', + 'registration-pictures', + 'registration-interests', + ] - const [key, changeKey] = useState(0) + const [key, changeKey] = useState(0) - const tgUser = fetchTgUser() - const [registrationData, changeRD] = useState( - { - tgId: tgUser?.id?.toString() || null, - name: tgUser?.firstName || null, - surname: tgUser?.lastName || null, - height: 175, - facultyId: null, - birthday: null, - pictures: [], - interests: [], - locationId: null - }) + const tgUser = fetchTgUser() + const [registrationData, changeRD] = useState({ + tgId: tgUser?.id?.toString() || null, + name: tgUser?.firstName || null, + surname: tgUser?.lastName || null, + height: 175, + facultyId: null, + birthday: null, + pictures: [], + interests: [], + locationId: null, + }) - const mainButtonFun = () => { - changeKey((prev) => prev + 1) - } - const backButtonFun = () => { - changeKey((prev) => prev - 1) - } + const mainButtonFun = () => { + changeKey((prev) => prev + 1) + } + const backButtonFun = () => { + changeKey((prev) => prev - 1) + } - const backButtonHomeFun = () => { - changeKey(0) - setBackButtonVisible(false) - setMainButtonVisible(false) - router.back() - } + const backButtonHomeFun = () => { + changeKey(0) + setBackButtonVisible(false) + setMainButtonVisible(false) + router.back() + } - useEffectOnce(() => { - setMainButtonParams('Next', false, true) - setMainButtonVisible(true) - setBackButtonVisible(true) - }) + useEffectOnce(() => { + setMainButtonParams('Next', false, true) + setMainButtonVisible(true) + setBackButtonVisible(true) + }) - function setButtons(localKey: number) { - if (localKey == 0) { - const offBack = setBackButtonOnClick(() => { - backButtonHomeFun() - offBack() - offMain() - }) - const offMain = setMainButtonOnClick(() => { - mainButtonFun() - offMain() - offBack() - }) - } else { - const offBack = setBackButtonOnClick(() => { - backButtonFun() - offBack() - offMain() - }) - const offMain = setMainButtonOnClick(() => { - mainButtonFun() - offMain() - offBack() - }) - } + function setButtons(localKey: number) { + if (localKey == 0) { + const offBack = setBackButtonOnClick(() => { + backButtonHomeFun() + offBack() + offMain() + }) + const offMain = setMainButtonOnClick(() => { + mainButtonFun() + offMain() + offBack() + }) + } else { + const offBack = setBackButtonOnClick(() => { + backButtonFun() + offBack() + offMain() + }) + const offMain = setMainButtonOnClick(() => { + mainButtonFun() + offMain() + offBack() + }) } + } - useEffect(() => { - setButtons(key) - if (key === registrationOrder.length) { - patchPerson(registrationData, 'ready') - .then((_) => - { - router.back() - }) - .catch((e) => console.log(e)) - } - else - patchPerson(registrationData, 'draft') - .then((x) => console.log(x)) - .catch((e) => console.log(e)) - }, [key]); + useEffect(() => { + setButtons(key) + if (key === registrationOrder.length) { + patchPerson(registrationData, 'ready') + .then((_) => { + router.back() + }) + .catch((e) => console.log(e)) + } else + patchPerson(registrationData, 'draft') + .then((x) => console.log(x)) + .catch((e) => console.log(e)) + }, [key]) - function renderSwitchWidget(key: number) { - switch (registrationOrder[key]) { - case 'registration-common': { - return ( - - ) - } - case 'registration-pictures': { - return ( - - ) - } - case 'registration-interests': { - return ( - - ) - } - default: - return ( - - Telegram sticker - - ) - } + function renderSwitchWidget(key: number) { + switch (registrationOrder[key]) { + case 'registration-common': { + return ( + + ) + } + case 'registration-pictures': { + return ( + + ) + } + case 'registration-interests': { + return ( + + ) + } + default: + return ( + + Telegram sticker + + ) } + } - return ( -
- {renderSwitchWidget(key)} -
- ) + return ( +
+ {renderSwitchWidget(key)} +
+ ) } diff --git a/frontend/src/pages/welcome/ui/Welcome.tsx b/frontend/src/pages/welcome/ui/Welcome.tsx index 0538b635..844e1b8c 100644 --- a/frontend/src/pages/welcome/ui/Welcome.tsx +++ b/frontend/src/pages/welcome/ui/Welcome.tsx @@ -1,34 +1,36 @@ import { useEffectOnce } from '@/shared/api' import { authenticate } from '@/widgets/auth-test/api/authenticate.ts' import { redirect } from 'atomic-router' -import { $authStore, $isAuthenticated, userIdFx, userRegisteredFx } from '@/features/authentication/api/authFx.ts' +import { + $authStore, + $isAuthenticated, + userIdFx, + userRegisteredFx, +} from '@/features/authentication/api/authFx.ts' import { routes } from '@/app/routes/api' import { useEffect } from 'react' import { getUser } from '@/features/get_user/api/getUser.ts' export const Welcome = () => { - useEffectOnce(() => { - authenticate() - }) - redirect({clock: userRegisteredFx.doneData, route: routes.main}) - redirect({clock: userRegisteredFx.failData, route: routes.registration}) - useEffect(() => { - const userId: string = JSON.parse(atob(($authStore.getState().token || '').split(".")[1])).user_id; - userIdFx(Number(userId)) - getUser(Number(userId)).then((x) => { - if (x.data.status == 'ready') - userRegisteredFx(true) - else - userRegisteredFx(false) - } - ).catch(() => { - userRegisteredFx(false) - }) - }, [$isAuthenticated]) + useEffectOnce(() => { + authenticate() + }) + redirect({ clock: userRegisteredFx.doneData, route: routes.main }) + redirect({ clock: userRegisteredFx.failData, route: routes.registration }) + useEffect(() => { + const userId: string = JSON.parse( + atob(($authStore.getState().token || '').split('.')[1]), + ).user_id + userIdFx(Number(userId)) + getUser(Number(userId)) + .then((x) => { + if (x.data.status == 'ready') userRegisteredFx(true) + else userRegisteredFx(false) + }) + .catch(() => { + userRegisteredFx(false) + }) + }, [$isAuthenticated]) - return ( -
- Wait please... :) -
- ) -} \ No newline at end of file + return
Wait please... :)
+} diff --git a/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx b/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx index 5725c3d9..45d28b11 100644 --- a/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx +++ b/frontend/src/widgets/registration-common-info/ui/RegistrationCommonInfo.tsx @@ -1,9 +1,9 @@ import { - Input, - List, - Section, - Select, - Slider, + Input, + List, + Section, + Select, + Slider, } from '@telegram-apps/telegram-ui' import { RegistrationData } from '@/entities' import { getAmountOfDays, useEffectOnce } from '@/shared/api' @@ -14,88 +14,134 @@ import { Location } from '@/entities/registration-data/model/Location.ts' import { getLocations } from '@/features/get-locations/api/getLocations.ts' interface RegistrationCommonInfoProps { - registrationData: RegistrationData, - changeRD: React.Dispatch> + registrationData: RegistrationData + changeRD: React.Dispatch> } export const RegistrationCommonInfo = ({ - registrationData, - changeRD, + registrationData, + changeRD, }: RegistrationCommonInfoProps) => { - const actualDate = new Date() - const [day, setDay] = useState(actualDate.getDay()) - const [month, setMonth] = useState(actualDate.getMonth()) - const [year, setYear] = useState(actualDate.getFullYear()) - const [faculties, setFaculties] = useState>([]) - const [locations, setLocations] = useState>([]) + const actualDate = new Date() + const [day, setDay] = useState(actualDate.getDay()) + const [month, setMonth] = useState(actualDate.getMonth()) + const [year, setYear] = useState(actualDate.getFullYear()) + const [faculties, setFaculties] = useState>([]) + const [locations, setLocations] = useState>([]) + useEffectOnce(() => { + getFaculties(setFaculties) + getLocations(setLocations) + }) - useEffectOnce(() => { - getFaculties(setFaculties) - getLocations(setLocations) - }) + useEffect(() => { + changeRD((previous) => ({ + ...previous, + birthday: new Date(year, month, day), + })) + }, [day, month, year]) - useEffect(() => { - changeRD((previous) => ({ - ...previous, - birthday: new Date(year, month, day), - })) - }, [day, month, year]) - - return ( -
- - changeRD((previous) => ({...previous, name: e.target.value}))}/> - changeRD((previous) => ({...previous, surname: e.target.value}))}/> -
- changeRD((previous) => ({...previous, height: e}))} min={50} max={300}/> -
- -
- {/*
*/} - - - - {/*
*/} -
- -
+ return ( +
+ + + changeRD((previous) => ({ ...previous, name: e.target.value })) + } + /> + + changeRD((previous) => ({ ...previous, surname: e.target.value })) + } + /> +
+ + changeRD((previous) => ({ ...previous, height: e })) + } + min={50} + max={300} + /> +
+ +
+ {/*
*/} + + + + {/*
*/}
- ) + +
+
+ ) } diff --git a/frontend/src/widgets/swiper/ui/SwiperMenu.tsx b/frontend/src/widgets/swiper/ui/SwiperMenu.tsx index 0103724a..7d121404 100644 --- a/frontend/src/widgets/swiper/ui/SwiperMenu.tsx +++ b/frontend/src/widgets/swiper/ui/SwiperMenu.tsx @@ -15,305 +15,345 @@ import { getUser } from '@/features/get_user/api/getUser.ts' //src={"https://avatars.githubusercontent.com/u/93886405"} - const actP: Person = { - id: 1234567, - zodiac: 'aries', - updateMoment: new Date(), - firstName: 'Ivan', - lastName: 'Ivan', - pictures: [ - { - id: 1, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' + id: 1234567, + zodiac: 'aries', + updateMoment: new Date(), + firstName: 'Ivan', + lastName: 'Ivan', + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', }, - { - id: 2, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - } - ], - interests: [ - { - topic: { - id: 123, - name: 'programming', - icon: { - id: 123, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - }, - color: '#dasda' - }, - level: 5 - } - ], - height: 111, - birthday: new Date(), - faculty: 'piict', - location: { - name: 'nameLoc', - coordinates: { - latitude: 321, - longitude: 321 - } - } + color: '#dasda', + }, + level: 5, + }, + ], + height: 111, + birthday: new Date(), + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321, + }, + }, } const actP2: Person = { - id: 1234567, - zodiac: 'aries', - updateMoment: new Date(), - firstName: 'Vitya', - lastName: 'Vitya', - pictures: [ - { - id: 1, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' + id: 1234567, + zodiac: 'aries', + updateMoment: new Date(), + firstName: 'Vitya', + lastName: 'Vitya', + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', }, - { - id: 2, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - } - ], - interests: [ - { - topic: { - id: 123, - name: 'programming', - icon: { - id: 123, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - }, - color: '#dasda' - }, - level: 5 - } - ], - height: 111, - birthday: new Date(), - faculty: 'piict', - location: { - name: 'nameLoc', - coordinates: { - latitude: 321, - longitude: 321 - } - } + color: '#dasda', + }, + level: 5, + }, + ], + height: 111, + birthday: new Date(), + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321, + }, + }, } const actP3: Person = { - id: 1234567, - zodiac: 'aries', - updateMoment: new Date(), - firstName: 'Dima', - lastName: 'Dima', - pictures: [ - { - id: 1, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' + id: 1234567, + zodiac: 'aries', + updateMoment: new Date(), + firstName: 'Dima', + lastName: 'Dima', + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', }, - { - id: 2, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - } - ], - interests: [ - { - topic: { - id: 123, - name: 'programming', - icon: { - id: 123, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - }, - color: '#dasda' - }, - level: 5 - } - ], - height: 111, - birthday: new Date(), - faculty: 'piict', - location: { - name: 'nameLoc', - coordinates: { - latitude: 321, - longitude: 321 - } - } + color: '#dasda', + }, + level: 5, + }, + ], + height: 111, + birthday: new Date(), + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321, + }, + }, } const personArrayOld = [actP, actP2, actP3] -personArrayOld.map(()=>{}) +personArrayOld.map(() => {}) export const SwiperMenu = () => { - const [_, setSwiperRef] = useState() - const [iter, setIter] = useState(0) - const [actualPerson, setActualPerson] = useState(actP) - const [attitudeGotten, setAttitudeGotten] = useState(false) - const [personArray, setPersonArray] = useState>([]) - const [personIdArray, setPersonIdArray] = useState>([]) + const [_, setSwiperRef] = useState() + const [iter, setIter] = useState(0) + const [actualPerson, setActualPerson] = useState(actP) + const [attitudeGotten, setAttitudeGotten] = useState(false) + const [personArray, setPersonArray] = useState>([]) + const [personIdArray, setPersonIdArray] = useState>([]) - useEffectOnce(() => { - getSuggestions(setPersonIdArray, 20) - }) + useEffectOnce(() => { + getSuggestions(setPersonIdArray, 20) + }) - useEffect(() => { - for (const personId of personIdArray) { - getUser(personId).then(personResponse => { - const person = personResponse.data - const newUser: Person = { - id: person.userId, - zodiac: person.zodiac, - updateMoment: new Date(), - firstName: person.firstName, - lastName: person.lastName, - pictures: [ - { - id: 1, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - }, - { - id: 2, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - } - ], - interests: [ - { - topic: { - id: 123, - name: 'programming', - icon: { - id: 123, - small: 'https://avatars.githubusercontent.com/u/93886405', - medium: 'https://avatars.githubusercontent.com/u/93886405', - large: 'https://avatars.githubusercontent.com/u/93886405' - }, - color: '#dasda' - }, - level: 5 - } - ], - height: person.height, - birthday: person.birthday, - faculty: 'piict', - location: { - name: 'nameLoc', - coordinates: { - latitude: 321, - longitude: 321 - } - } - } - setPersonArray((prevState) => [...prevState, newUser] - ) - }) + useEffect(() => { + for (const personId of personIdArray) { + getUser(personId).then((personResponse) => { + const person = personResponse.data + const newUser: Person = { + id: person.userId, + zodiac: person.zodiac, + updateMoment: new Date(), + firstName: person.firstName, + lastName: person.lastName, + pictures: [ + { + id: 1, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + { + id: 2, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + ], + interests: [ + { + topic: { + id: 123, + name: 'programming', + icon: { + id: 123, + small: 'https://avatars.githubusercontent.com/u/93886405', + medium: 'https://avatars.githubusercontent.com/u/93886405', + large: 'https://avatars.githubusercontent.com/u/93886405', + }, + color: '#dasda', + }, + level: 5, + }, + ], + height: person.height, + birthday: person.birthday, + faculty: 'piict', + location: { + name: 'nameLoc', + coordinates: { + latitude: 321, + longitude: 321, + }, + }, } - }, [personIdArray]); + setPersonArray((prevState) => [...prevState, newUser]) + }) + } + }, [personIdArray]) - useEffect(() => { - if (attitudeGotten) { - setActualPerson(personArray[(iter + 1) % personArray.length]) - setIter((prevState) => (prevState + 1) % personArray.length) - setAttitudeGotten(false) - } - }, [attitudeGotten]); + useEffect(() => { + if (attitudeGotten) { + setActualPerson(personArray[(iter + 1) % personArray.length]) + setIter((prevState) => (prevState + 1) % personArray.length) + setAttitudeGotten(false) + } + }, [attitudeGotten]) - return ( -
- - { - setAttitude(actualPerson.id, 'skip'); - setAttitudeGotten(true) - }} style={{ - left: '7%', - marginTop: '75%', - width: '35%', - height: '7%', - zIndex: '2', - textAlign: 'center', - backgroundColor: 'red' - }}> - Skip - - { - setAttitude(actualPerson.id, 'like'); - setAttitudeGotten(true) - }} style={{ - right: '7%', - marginTop: '75%', - width: '35%', - height: '7%', - zIndex: '2', - textAlign: 'center', - backgroundColor: 'green' - }}> - Like - - - {actualPerson.pictures.map((p, index) => ( - - {`Picture - - ))} - - -
{actualPerson.firstName} {actualPerson.lastName}
-
height: {actualPerson.height}
-
location: {JSON.stringify(actualPerson.location)}
-
faculty: {actualPerson.faculty}
-
birthday: {actualPerson.birthday.toDateString()}
-
lastUpdate: {actualPerson.updateMoment.toString()}
-
id: {actualPerson.id}
-
zodiac sign: {actualPerson.zodiac}
-
interests: {actualPerson.interests.map(i => ( -
-
-
- -
{i.topic.id} {i.topic.name} {i.topic.color}
-
-
-
level: {i.level}
-
- ))}
-
-
-
- ) -} \ No newline at end of file + return ( +
+ + { + setAttitude(actualPerson.id, 'skip') + setAttitudeGotten(true) + }} + style={{ + left: '7%', + marginTop: '75%', + width: '35%', + height: '7%', + zIndex: '2', + textAlign: 'center', + backgroundColor: 'red', + }} + > + Skip + + { + setAttitude(actualPerson.id, 'like') + setAttitudeGotten(true) + }} + style={{ + right: '7%', + marginTop: '75%', + width: '35%', + height: '7%', + zIndex: '2', + textAlign: 'center', + backgroundColor: 'green', + }} + > + Like + + + {actualPerson.pictures.map((p, index) => ( + + {`Picture + + ))} + + +
+ {actualPerson.firstName} {actualPerson.lastName} +
+
+ height: {actualPerson.height} +
+
+ location: {JSON.stringify(actualPerson.location)} +
+
+ faculty: {actualPerson.faculty} +
+
+ birthday: {actualPerson.birthday.toDateString()} +
+
+ lastUpdate: {actualPerson.updateMoment.toString()} +
+
id: {actualPerson.id}
+
+ zodiac sign: {actualPerson.zodiac} +
+
+ interests:{' '} + {actualPerson.interests.map((i) => ( +
+
+
+ +
+ {i.topic.id} {i.topic.name} {i.topic.color} +
+
+
+
level: {i.level}
+
+ ))} +
+
+
+
+ ) +}