import {Component, OnInit, inject} from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { MatCardModule } from '@angular/material/card';
import { MatButtonModule } from '@angular/material/button';
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
import { MatIconModule } from '@angular/material/icon';
import { MatTableModule } from '@angular/material/table';
import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { DashboardService, AdminStats } from '../../services/dashboard';
import { HttpClient } from '@angular/common/http';
import { environment } from '../../../environments/environment';
import { AuthService } from '../../services/auth';
interface CommunityMember {
userId: string;
firstName: string;
lastName: string;
email: string;
}
interface TariffInvite {
id: string;
producerUserId: string;
consumerUserId: string;
energyCommunityId: string;
code: string;
note: string;
status: string;
expiresAt: string;
acceptedAt: string;
createdAt: string;
}
interface EnergyCommunity {
id: string;
name: string;
}
@Component({
selector: 'app-producer-invites',
standalone: true,
imports: [
CommonModule,
FormsModule,
MatCardModule,
MatButtonModule,
MatInputModule,
MatFormFieldModule,
MatSelectModule,
MatIconModule,
MatTableModule,
MatSnackBarModule,
MatProgressSpinnerModule
],
template: `
Meine Einladungen
Neue Einladung erstellen
Laden Sie einen Consumer ein, einen Spezial-Tarif zu erhalten
@if (communities.length === 0) {
Sie sind noch keiner Energiegemeinschaft beigetreten.
} @else {
Energiegemeinschaft
@for (community of communities; track community.id) {
{{ community.name }}
}
@if (selectedCommunityId) {
Consumer auswählen
@for (member of members; track member.userId) {
{{ member.firstName }} {{ member.lastName }}
}
Notiz (optional)
}
}
Gesendete Einladungen
@if (invites.length === 0) {
Noch keine Einladungen gesendet.
} @else {
| Consumer |
{{ invite.consumerUserId }} |
Code |
{{ invite.code }}
|
Status |
{{ getStatusLabel(invite.status) }}
|
Gültig bis |
{{ invite.expiresAt | date:'dd.MM.yyyy HH:mm' }} |
}
`
})
export class ProducerInvitesComponent implements OnInit {
private http = inject(HttpClient);
private snackBar = inject(MatSnackBar);
private authService = inject(AuthService);
private apiUrl = `${environment.apiUrl}/api`;
communities: EnergyCommunity[] = [];
members: CommunityMember[] = [];
invites: TariffInvite[] = [];
selectedCommunityId: string = '';
selectedConsumerId: string = '';
inviteNote: string = '';
isLoading = false;
displayedColumns = ['consumer', 'code', 'status', 'expiresAt'];
ngOnInit() {
this.loadCommunities();
}
loadCommunities() {
this.http.get(`${this.apiUrl}/community/admin/communities`)
.subscribe({
next: (communities) => this.communities = communities,
error: () => this.snackBar.open('Fehler beim Laden der Energiegemeinschaften', 'Schließen', { duration: 3000 })
});
}
loadMembers() {
if (!this.selectedCommunityId) return;
this.http.get(`${this.apiUrl}/community/admin/communities/${this.selectedCommunityId}/members`)
.subscribe({
next: (members) => {
const currentUserId = this.authService.getCurrentUserId();
this.members = members.filter(m => m.userId !== currentUserId);
},
error: () => this.snackBar.open('Fehler beim Laden der Mitglieder', 'Schließen', { duration: 3000 })
});
this.loadInvites();
}
loadInvites() {
if (!this.selectedCommunityId) return;
this.http.get(`${this.apiUrl}/tariffs/invites/community/${this.selectedCommunityId}`)
.subscribe({
next: (invites) => this.invites = invites,
error: () => this.snackBar.open('Fehler beim Laden der Einladungen', 'Schließen', { duration: 3000 })
});
}
createInvite() {
if (!this.selectedConsumerId || !this.selectedCommunityId) return;
this.isLoading = true;
const request = {
consumerUserId: this.selectedConsumerId,
energyCommunityId: this.selectedCommunityId,
note: this.inviteNote || null
};
this.http.post(`${this.apiUrl}/tariffs/invites`, request)
.subscribe({
next: (invite) => {
this.isLoading = false;
this.snackBar.open('Einladung erfolgreich gesendet!', 'Schließen', { duration: 3000 });
this.inviteNote = '';
this.selectedConsumerId = '';
this.loadInvites();
},
error: (err) => {
this.isLoading = false;
const message = err.error?.message || 'Fehler beim Erstellen der Einladung';
this.snackBar.open(message, 'Schließen', { duration: 5000 });
}
});
}
getStatusClass(status: string): string {
switch (status) {
case 'PENDING': return 'text-yellow-600 bg-yellow-100 px-2 py-1 rounded';
case 'ACCEPTED': return 'text-green-600 bg-green-100 px-2 py-1 rounded';
case 'EXPIRED': return 'text-red-600 bg-red-100 px-2 py-1 rounded';
default: return 'text-slate-600 bg-slate-100 px-2 py-1 rounded';
}
}
getStatusLabel(status: string): string {
switch (status) {
case 'PENDING': return 'Ausstehend';
case 'ACCEPTED': return 'Angenommen';
case 'EXPIRED': return 'Abgelaufen';
default: return status;
}
}
}
interface TariffInviteRequest {
consumerUserId: string;
energyCommunityId: string;
note: string | null;
}