+
} @else {
diff --git a/app/booking-ui/src/app/pages/doctor-details/doctor-details.scss b/app/booking-ui/src/app/pages/doctor-details/doctor-details.scss
index 6f6c8f6..caabad2 100644
--- a/app/booking-ui/src/app/pages/doctor-details/doctor-details.scss
+++ b/app/booking-ui/src/app/pages/doctor-details/doctor-details.scss
@@ -26,8 +26,25 @@ h2 {
.content-grid {
display: grid;
grid-template-columns: 2fr 1fr;
+ grid-template-areas:
+ 'info sidebar'
+ 'reviews sidebar';
gap: 40px;
align-items: start;
+
+ app-doctor-info {
+ grid-area: info;
+ }
+
+ .sidebar {
+ grid-area: sidebar;
+ position: sticky;
+ top: 24px;
+ }
+
+ app-doctor-reviews {
+ grid-area: reviews;
+ }
}
.loading-state,
@@ -54,10 +71,14 @@ h2 {
@media (max-width: 992px) {
.content-grid {
grid-template-columns: 1fr;
+ grid-template-areas:
+ 'info'
+ 'sidebar'
+ 'reviews';
gap: 32px;
}
- .sidebar .booking-card.sticky {
+ .sidebar {
position: static;
}
}
diff --git a/app/booking-ui/src/app/pages/doctor-details/doctor-details.ts b/app/booking-ui/src/app/pages/doctor-details/doctor-details.ts
index 727a82a..63a7c7b 100644
--- a/app/booking-ui/src/app/pages/doctor-details/doctor-details.ts
+++ b/app/booking-ui/src/app/pages/doctor-details/doctor-details.ts
@@ -1,17 +1,12 @@
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
-import { DoctorDetailsDto, ReviewDto } from '@core/models/doctor.model';
-import { Component, OnInit, effect, inject, signal } from '@angular/core';
-import { ActivatedRoute, Router, RouterLink } from '@angular/router';
-import {
- CreateAppointmentRequest,
- CreateReviewRequest,
- TimeSlot,
-} from '@core/models/appointmnet.models';
-import { DoctorService, AppointmentService, AuthService } from '@core/services/index';
+import { Component, OnInit, inject, signal } from '@angular/core';
+import { ActivatedRoute, RouterLink } from '@angular/router';
+import { DoctorService } from '@core/services/index';
import { DoctorInfo } from './components/doctor-info/doctor-info';
import { DoctorReviews } from './components/doctor-reviews/doctor-reviews';
import { DoctorBooking } from './components/doctor-booking/doctor-booking';
+import { DoctorResponse } from '@core/models/doctor.model';
@Component({
selector: 'app-doctor-details',
@@ -22,161 +17,28 @@ import { DoctorBooking } from './components/doctor-booking/doctor-booking';
})
export class DoctorDetails implements OnInit {
private route = inject(ActivatedRoute);
- private router = inject(Router);
private doctorService = inject(DoctorService);
- private appointmentService = inject(AppointmentService);
- private authService = inject(AuthService);
-
- currentUser = this.authService.currentUser;
- userRating = signal(0);
- hoverRating = signal(0);
- reviewText = signal('');
- isSubmittingReview = signal(false);
-
- reviews = signal
([]);
- isLoadingReviews = signal(false);
+ doctor = signal(null);
isLoading = signal(true);
- isLoadingSlots = signal(false);
- isBooking = signal(false);
-
- selectedDate = signal(new Date().toISOString().split('T')[0]);
- selectedSlot = signal(null);
-
- doctor = signal(null);
- availableSlots = signal([]);
-
- constructor() {
- effect(() => {
- const doc = this.doctor();
- const date = this.selectedDate();
-
- if (doc && date) {
- this.loadSlots(doc.id, date);
- }
- });
- }
ngOnInit() {
const id = this.route.snapshot.paramMap.get('id');
- if (id) this.loadDoctor(id);
- }
-
- setHoverRating(stars: number) {
- this.hoverRating.set(stars);
- }
-
- clearHoverRating() {
- this.hoverRating.set(0);
- }
-
- submitReview(event: { rating: number; text: string }) {
- const doc = this.doctor();
- if (!doc) return;
-
- this.isSubmittingReview.set(true);
-
- const request: CreateReviewRequest = {
- doctorId: doc.id,
- rating: event.rating,
- text: event.text,
- };
-
- this.doctorService.addReview(request).subscribe({
- next: () => {
- alert('Thank you for your review!');
- this.isSubmittingReview.set(false);
- this.loadReviews(doc.id);
- },
- error: (err) => {
- this.isSubmittingReview.set(false);
- console.error(err);
- },
- });
- }
-
- loadSlots(doctorId: string, date: string) {
- console.log('1. Запуск loadSlots для:', date);
- this.isLoadingSlots.set(true);
- this.selectedSlot.set(null);
-
- this.doctorService.getDoctorSlots(doctorId, date).subscribe({
- next: (slots) => {
- console.log('2. Ответ сервера (Слоты):', slots);
- this.availableSlots.set(slots);
- this.isLoadingSlots.set(false);
- },
- error: (err) => {
- console.error('Error loading slots', err);
- this.availableSlots.set([]);
- this.isLoadingSlots.set(false);
- },
- });
- }
-
- onDateChange(event: Event) {
- const input = event.target as HTMLInputElement;
- this.selectedDate.set(input.value);
+ if (id) {
+ this.loadDoctor(id);
+ }
}
- loadDoctor(id: string) {
- this.doctorService.getDoctorProfile(id).subscribe({
+ private loadDoctor(id: string) {
+ this.isLoading.set(true);
+ this.doctorService.getDoctorById(id).subscribe({
next: (data) => {
this.doctor.set(data);
this.isLoading.set(false);
- this.loadReviews(data.id);
- },
- error: () => this.isLoading.set(false),
- });
- }
-
- loadReviews(doctorId: string) {
- this.isLoadingReviews.set(true);
- this.doctorService.getDoctorReviews(doctorId).subscribe({
- next: (data) => {
- this.reviews.set(data);
- this.isLoadingReviews.set(false);
},
error: (err) => {
- console.error('Ошибка загрузки отзывов', err);
- this.isLoadingReviews.set(false);
- },
- });
- }
-
- selectSlot(slot: TimeSlot) {
- if (slot.isAvailable) {
- this.selectedSlot.set(slot);
- }
- }
-
- bookAppointment(slot: TimeSlot) {
- const doc = this.doctor();
- if (!doc || !slot) return;
-
- if (!this.authService.currentUser()) {
- alert('Please login');
- this.router.navigate(['/auth/login']);
- return;
- }
-
- this.isBooking.set(true);
-
- const request: CreateAppointmentRequest = {
- doctorId: doc.id,
- startTime: slot.start,
- endTime: slot.end,
- };
-
- this.appointmentService.createAppointment(request).subscribe({
- next: () => {
- alert('Success!');
- this.isBooking.set(false);
- this.loadSlots(doc.id, this.selectedDate());
- },
- error: (err) => {
- alert('Error: ' + err.message);
- this.isBooking.set(false);
+ console.error('Error loading doctor', err);
+ this.isLoading.set(false);
},
});
}
diff --git a/app/booking-ui/src/app/pages/home/home.ts b/app/booking-ui/src/app/pages/home/home.ts
index 1e7a382..c2d9f78 100644
--- a/app/booking-ui/src/app/pages/home/home.ts
+++ b/app/booking-ui/src/app/pages/home/home.ts
@@ -2,7 +2,7 @@ import { Component, OnInit, inject, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DoctorCard, DoctorCardDto } from '@shared/components/doctor-card/doctor-card';
import { DoctorService } from '@core/services/doctor/doctor.service';
-import { DoctorDto } from '@core/models/doctor.model';
+import { DoctorResponse } from '@core/models/doctor.model';
@Component({
selector: 'app-home',
@@ -23,7 +23,7 @@ export class Home implements OnInit {
loadDoctors() {
this.doctorService.getDoctors().subscribe({
- next: (data: DoctorDto[]) => {
+ next: (data: DoctorResponse[]) => {
const mappedDoctors: DoctorCardDto[] = data.slice(0, 4).map((dto) => ({
id: dto.id,
name: `Dr. ${dto.name} ${dto.lastname}`,