diff --git a/package-lock.json b/package-lock.json
index 5e2437a..2b20021 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
"@angular/platform-server": "^20.3.0",
"@angular/router": "^20.3.0",
"@angular/ssr": "^20.3.10",
+ "@popperjs/core": "^2.11.8",
"bootstrap": "^5.3.8",
"bootstrap-icons": "^1.13.1",
"express": "^5.1.0",
@@ -27,6 +28,7 @@
"@angular/build": "^20.3.10",
"@angular/cli": "^20.3.10",
"@angular/compiler-cli": "^20.3.0",
+ "@types/bootstrap": "^5.2.10",
"@types/express": "^5.0.1",
"@types/jasmine": "~5.1.0",
"@types/node": "^20.17.19",
@@ -3587,6 +3589,16 @@
"@types/node": "*"
}
},
+ "node_modules/@types/bootstrap": {
+ "version": "5.2.10",
+ "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz",
+ "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@popperjs/core": "^2.9.2"
+ }
+ },
"node_modules/@types/connect": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
diff --git a/package.json b/package.json
index 35691de..403a9f7 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
"@angular/platform-server": "^20.3.0",
"@angular/router": "^20.3.0",
"@angular/ssr": "^20.3.10",
+ "@popperjs/core": "^2.11.8",
"bootstrap": "^5.3.8",
"bootstrap-icons": "^1.13.1",
"express": "^5.1.0",
@@ -42,6 +43,7 @@
"@angular/build": "^20.3.10",
"@angular/cli": "^20.3.10",
"@angular/compiler-cli": "^20.3.0",
+ "@types/bootstrap": "^5.2.10",
"@types/express": "^5.0.1",
"@types/jasmine": "~5.1.0",
"@types/node": "^20.17.19",
diff --git a/src/app/app.config.ts b/src/app/app.config.ts
index 969812a..e4018c5 100644
--- a/src/app/app.config.ts
+++ b/src/app/app.config.ts
@@ -1,13 +1,26 @@
-import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core';
+import {
+ ApplicationConfig,
+ provideBrowserGlobalErrorListeners,
+ provideZoneChangeDetection
+} from '@angular/core';
import { provideRouter } from '@angular/router';
+import { provideClientHydration, withEventReplay } from '@angular/platform-browser';
+import { provideHttpClient, withFetch, withInterceptors } from '@angular/common/http';
import { routes } from './app.routes';
-import { provideClientHydration, withEventReplay } from '@angular/platform-browser';
+import { authInterceptor } from './interceptors/auth.interceptor';
export const appConfig: ApplicationConfig = {
providers: [
provideBrowserGlobalErrorListeners(),
provideZoneChangeDetection({ eventCoalescing: true }),
- provideRouter(routes), provideClientHydration(withEventReplay())
+ provideRouter(routes),
+ provideClientHydration(withEventReplay()),
+
+ // ✅ HttpClient com fetch + interceptor
+ provideHttpClient(
+ withFetch(),
+ withInterceptors([authInterceptor])
+ ),
]
};
diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts
index 213a3e4..92fc1d4 100644
--- a/src/app/app.routes.ts
+++ b/src/app/app.routes.ts
@@ -2,9 +2,11 @@ import { Routes } from '@angular/router';
import { Home } from './pages/home/home';
import { Register } from './pages/register/register';
import { LoginComponent } from './pages/login/login';
+import { Geral } from './pages/geral/geral';
export const routes: Routes = [
{ path: '', component: Home },
{ path: "register", component: Register },
{ path: "login", component: LoginComponent },
+ { path: "geral", component: Geral },
];
diff --git a/src/app/components/footer/footer.scss b/src/app/components/footer/footer.scss
index fa49a5a..ab19d6c 100644
--- a/src/app/components/footer/footer.scss
+++ b/src/app/components/footer/footer.scss
@@ -8,6 +8,7 @@
background: linear-gradient(90deg, #030FAA 0%, #6066FF 45%, #C91EB5 100%);
padding: 10px 32px; /* bem mais baixo que antes */
box-sizing: border-box;
+ margin-top: -0.5px;
display: flex;
justify-content: space-between;
diff --git a/src/app/interceptors/auth.interceptor.ts b/src/app/interceptors/auth.interceptor.ts
new file mode 100644
index 0000000..a8753c8
--- /dev/null
+++ b/src/app/interceptors/auth.interceptor.ts
@@ -0,0 +1,13 @@
+import { HttpInterceptorFn } from '@angular/common/http';
+
+export const authInterceptor: HttpInterceptorFn = (req, next) => {
+ const token = localStorage.getItem('token');
+
+ if (!token) return next(req);
+
+ const authReq = req.clone({
+ setHeaders: { Authorization: `Bearer ${token}` }
+ });
+
+ return next(authReq);
+};
diff --git a/src/app/pages/geral/geral.html b/src/app/pages/geral/geral.html
new file mode 100644
index 0000000..7f35267
--- /dev/null
+++ b/src/app/pages/geral/geral.html
@@ -0,0 +1 @@
+
geral works!
diff --git a/src/app/pages/geral/geral.scss b/src/app/pages/geral/geral.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/pages/geral/geral.spec.ts b/src/app/pages/geral/geral.spec.ts
new file mode 100644
index 0000000..8cbf6c0
--- /dev/null
+++ b/src/app/pages/geral/geral.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Geral } from './geral';
+
+describe('Geral', () => {
+ let component: Geral;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [Geral]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(Geral);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/geral/geral.ts b/src/app/pages/geral/geral.ts
new file mode 100644
index 0000000..452ad36
--- /dev/null
+++ b/src/app/pages/geral/geral.ts
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-geral',
+ imports: [],
+ templateUrl: './geral.html',
+ styleUrl: './geral.scss',
+})
+export class Geral {
+
+}
diff --git a/src/app/pages/login/login.html b/src/app/pages/login/login.html
index 42ae1e8..394c7b1 100644
--- a/src/app/pages/login/login.html
+++ b/src/app/pages/login/login.html
@@ -36,6 +36,11 @@
+
+
+ {{ apiError }}
+
+