-
⚡
+
⚡
Blazing Fast Hosting
-
NVMe servers & global CDN ensure speed and uptime.
+
NVMe servers & lightning fast deployment pipeline.
-
🌐
-
Custom Domains
-
Use your own domain or get a .portfoliohost.dev address.
+
🌐
+
Free Domains
+
Get a free .portfolio-host.com address.
-
🚀
+
🚀
1-Click Deploy
-
Integrate with GitHub or push manually in seconds.
-
-
-
📱
-
Fully Responsive
-
Mobile-first designs that look great everywhere.
+
Integrate with GitHub (COMING SOON) or push manually in seconds.
Ready to impress recruiters and clients?
- Create your portfolio in minutes — no coding required.
+ Host your portfolio in seconds.
diff --git a/src/app/components/landing/landing.component.ts b/src/app/components/landing/landing.component.ts
index 7fa642c..8500b74 100644
--- a/src/app/components/landing/landing.component.ts
+++ b/src/app/components/landing/landing.component.ts
@@ -1,6 +1,7 @@
-import { Component } from '@angular/core';
-import { Router } from '@angular/router';
+import {Component} from '@angular/core';
+import {Router} from '@angular/router';
import {ApiService} from '../../services/api';
+import {PortfolioService} from '../../services/portfolio.service';
@Component({
selector: 'app-root',
@@ -8,14 +9,24 @@ import {ApiService} from '../../services/api';
})
export class LandingComponent {
- constructor(
- private apiService: ApiService,
- private router: Router,
- ) {
- }
-
- signUp(): void{
- this.router.navigate(['/register']);
+ constructor(
+ private apiService: ApiService,
+ private portfolioService: PortfolioService,
+ private router: Router,
+ ) {
}
+ signUp(): void {
+ this.router.navigate(['/register']);
+ }
+
+ exemple() {
+ this.portfolioService.getRandomPortfolio().subscribe({
+ next: (res) => {
+ window.location.href = 'https://' + res.data.host;
+ }
+
+ }
+ )
+ }
}
diff --git a/src/app/models/portfolio.model.ts b/src/app/models/portfolio.model.ts
index c022cc4..dbd3296 100644
--- a/src/app/models/portfolio.model.ts
+++ b/src/app/models/portfolio.model.ts
@@ -1,4 +1,5 @@
export interface Portfolio {
+ active: boolean;
id: number;
name: string;
domain: string;
diff --git a/src/app/services/api.ts b/src/app/services/api.ts
index abd90b9..917410d 100644
--- a/src/app/services/api.ts
+++ b/src/app/services/api.ts
@@ -1,8 +1,9 @@
-import { Injectable } from '@angular/core';
-import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
-import { Observable, throwError, BehaviorSubject } from 'rxjs';
-import { catchError, tap } from 'rxjs/operators';
-import { environmentProd as env } from '../../environments/environment' ;
+import {Injectable} from '@angular/core';
+import {HttpClient, HttpErrorResponse, HttpHeaders} from '@angular/common/http';
+import {BehaviorSubject, Observable, throwError} from 'rxjs';
+import {catchError, tap} from 'rxjs/operators';
+import {environmentProd as env} from '../../environments/environment';
+import {Router} from '@angular/router';
export interface LoginCredentials {
email: string;
@@ -37,32 +38,7 @@ export class ApiService {
private tokenSubject = new BehaviorSubject(this.getStoredToken());
public token$ = this.tokenSubject.asObservable();
- constructor(protected http: HttpClient) {}
-
- // Get stored token from localStorage
- private getStoredToken(): string | null {
- if (typeof window !== 'undefined') {
- return localStorage.getItem('auth_token');
- }
- return null;
- }
-
- // Set token in localStorage and update subject
- private setToken(token: string): void {
- if (typeof window !== 'undefined') {
- localStorage.setItem('auth_token', token);
- }
- this.tokenSubject.next(token);
- }
-
- // Remove token from localStorage and update subject
- private removeToken(): void {
- if (typeof window !== 'undefined') {
- console.log('?? ?? ??')
- localStorage.removeItem('auth_token');
- }
- this.tokenSubject.next(null);
- }
+ constructor(protected http: HttpClient, private router: Router) {}
// Get current token value
get currentToken(): string | null {
@@ -74,79 +50,6 @@ export class ApiService {
return !!this.currentToken;
}
- // Get HTTP headers with auth token
- private getHeaders(): HttpHeaders {
- let headers = new HttpHeaders({
- //'Content-Type': 'application/json',
- //'Accept': 'application/json'
- });
-
- const token = this.currentToken;
- if (token) {
- headers = headers.set('Authorization', `Bearer ${token}`);
- }
-
- return headers;
- }
-
- // Handle HTTP errors
- private handleError(error: HttpErrorResponse): Observable {
- let errorMessage = 'An unknown error occurred';
-
- if (error.error instanceof ErrorEvent) {
- // Client-side error
- errorMessage = error.error.message;
- } else {
- // Server-side error
- if (error.status === 401) {
- //this.removeToken();
- errorMessage = 'Unauthorized. Please login again.';
- } else if (error.status === 422) {
- errorMessage = 'Validation error';
- } else if (error.error?.message) {
- errorMessage = error.error.message;
- } else {
- errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`;
- }
- }
-
- console.error('API Error:', error);
- return throwError(() => ({ ...error, userMessage: errorMessage }));
- }
-
- // Generic HTTP methods
- protected get(endpoint: string): Observable {
- return this.http.get(`${this.baseUrl}${endpoint}`, {
- headers: this.getHeaders()
- }).pipe(
- catchError(this.handleError.bind(this))
- );
- }
-
- protected post(endpoint: string, data: any): Observable {
- return this.http.post(`${this.baseUrl}${endpoint}`, data, {
- headers: this.getHeaders()
- }).pipe(
- catchError(this.handleError.bind(this))
- );
- }
-
- private put(endpoint: string, data: any): Observable {
- return this.http.put(`${this.baseUrl}${endpoint}`, data, {
- headers: this.getHeaders()
- }).pipe(
- catchError(this.handleError.bind(this))
- );
- }
-
- private delete(endpoint: string): Observable {
- return this.http.delete(`${this.baseUrl}${endpoint}`, {
- headers: this.getHeaders()
- }).pipe(
- catchError(this.handleError.bind(this))
- );
- }
-
// Authentication methods
register(userData: RegisterData): Observable> {
return this.post>('/auth/register', userData).pipe(
@@ -207,4 +110,102 @@ export class ApiService {
deleteData(endpoint: string): Observable {
return this.delete(endpoint);
}
+
+ // Generic HTTP methods
+ protected get(endpoint: string): Observable {
+ return this.http.get(`${this.baseUrl}${endpoint}`, {
+ headers: this.getHeaders()
+ }).pipe(
+ catchError(this.handleError.bind(this))
+ );
+ }
+
+ protected post(endpoint: string, data: any): Observable {
+ return this.http.post(`${this.baseUrl}${endpoint}`, data, {
+ headers: this.getHeaders()
+ }).pipe(
+ catchError(this.handleError.bind(this))
+ );
+ }
+
+ // Get stored token from localStorage
+ private getStoredToken(): string | null {
+ if (typeof window !== 'undefined') {
+ return localStorage.getItem('auth_token');
+ }
+ return null;
+ }
+
+ // Set token in localStorage and update subject
+ private setToken(token: string): void {
+ if (typeof window !== 'undefined') {
+ localStorage.setItem('auth_token', token);
+ }
+ this.tokenSubject.next(token);
+ }
+
+ // Remove token from localStorage and update subject
+ private removeToken(): void {
+ if (typeof window !== 'undefined') {
+ console.log('?? ?? ??')
+ localStorage.removeItem('auth_token');
+ }
+ this.tokenSubject.next(null);
+ }
+
+ // Get HTTP headers with auth token
+ private getHeaders(): HttpHeaders {
+ let headers = new HttpHeaders({
+ //'Content-Type': 'application/json',
+ //'Accept': 'application/json'
+ });
+
+ const token = this.currentToken;
+ if (token) {
+ headers = headers.set('Authorization', `Bearer ${token}`);
+ }
+
+ return headers;
+ }
+
+ // Handle HTTP errors
+ private handleError(error: HttpErrorResponse): Observable {
+ let errorMessage = 'An unknown error occurred';
+
+ if (error.error instanceof ErrorEvent) {
+ // Client-side error
+ errorMessage = error.error.message;
+ } else {
+ // Server-side error
+ if (error.status === 401) {
+ this.removeToken();
+ this.router.navigate(['/login'])
+ } else if (error.status === 422) {
+ errorMessage = 'Validation error';
+ } else if (error.error?.message) {
+ errorMessage = error.error.message;
+ } else {
+ errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`;
+ }
+ }
+
+ console.error('API Error:', error);
+ return throwError(() => ({...error, userMessage: errorMessage}));
+ }
+
+ private put(endpoint: string, data: any): Observable {
+ return this.http.put(`${this.baseUrl}${endpoint}`, data, {
+ headers: this.getHeaders()
+ }).pipe(
+ catchError(this.handleError.bind(this))
+ );
+ }
+
+ private delete(endpoint: string): Observable {
+ return this.http.delete(`${this.baseUrl}${endpoint}`, {
+ headers: this.getHeaders()
+ }).pipe(
+ catchError(this.handleError.bind(this))
+ );
+ }
}
diff --git a/src/app/services/portfolio.service.ts b/src/app/services/portfolio.service.ts
index 6fa2fd5..870607c 100644
--- a/src/app/services/portfolio.service.ts
+++ b/src/app/services/portfolio.service.ts
@@ -27,4 +27,9 @@ export class PortfolioService extends ApiService{
console.log('Deploying portfolio with ID:', portfolioId);
return this.http.post(this.baseUrl + `/portfolios/${portfolioId}/deploy`, {});
}
+
+ getRandomPortfolio() : Observable
+ {
+ return this.http.get(this.baseUrl + `/portfolio/random`, {});
+ }
}