From a8178c562ddfa4154f179d413f04c3526bccb873 Mon Sep 17 00:00:00 2001 From: Dario Anongba Varela Date: Sun, 24 Nov 2024 15:12:31 +0100 Subject: [PATCH 1/2] setup check in handler --- src/application/errors/database_error.rs | 3 ++ src/domains/system/entities/mod.rs | 2 ++ src/domains/system/entities/setup.rs | 9 ++++++ src/domains/system/system_handler.rs | 31 +++++++++++++++---- src/domains/system/system_service.rs | 16 ++++++++-- src/domains/system/system_use_cases.rs | 5 ++- src/domains/wallet/wallet_repository.rs | 1 + .../repositories/sea_orm_wallet_repository.rs | 13 ++++++-- 8 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 src/domains/system/entities/setup.rs diff --git a/src/application/errors/database_error.rs b/src/application/errors/database_error.rs index 197e1c44..6a7ec453 100644 --- a/src/application/errors/database_error.rs +++ b/src/application/errors/database_error.rs @@ -30,6 +30,9 @@ pub enum DatabaseError { #[error("Failed to delete resource: {0}")] Delete(String), + #[error("Failed to count resource: {0}")] + Count(String), + #[error("Failed to perform transaction operation: {0}")] Transaction(String), diff --git a/src/domains/system/entities/mod.rs b/src/domains/system/entities/mod.rs index bffce9f9..1c80e329 100644 --- a/src/domains/system/entities/mod.rs +++ b/src/domains/system/entities/mod.rs @@ -1,5 +1,7 @@ mod health; +mod setup; mod version; pub use health::*; +pub use setup::*; pub use version::*; diff --git a/src/domains/system/entities/setup.rs b/src/domains/system/entities/setup.rs new file mode 100644 index 00000000..1b79faad --- /dev/null +++ b/src/domains/system/entities/setup.rs @@ -0,0 +1,9 @@ +use serde::Serialize; +use utoipa::ToSchema; + +/// App setup info +#[derive(Debug, Serialize, ToSchema)] +pub struct SetupInfo { + /// Whether the app is setup + pub complete: bool, +} diff --git a/src/domains/system/system_handler.rs b/src/domains/system/system_handler.rs index c82b50b1..bc4add25 100644 --- a/src/domains/system/system_handler.rs +++ b/src/domains/system/system_handler.rs @@ -4,11 +4,11 @@ use axum::{extract::State, http::StatusCode, response::IntoResponse, routing::ge use utoipa::OpenApi; use crate::{ - application::errors::ApplicationError, + application::{docs::INTERNAL_EXAMPLE, dtos::ErrorResponse, errors::ApplicationError}, infra::{app::AppState, axum::Json}, }; -use super::{HealthCheck, HealthStatus, VersionInfo}; +use super::{HealthCheck, HealthStatus, SetupInfo, VersionInfo}; #[derive(OpenApi)] #[openapi( @@ -26,6 +26,7 @@ pub fn router() -> Router> { .route("/health", get(health_check)) .route("/ready", get(readiness_check)) .route("/version", get(version_check)) + .route("/setup", get(setup_check)) } /// Readiness Check @@ -79,11 +80,29 @@ async fn health_check(State(app_state): State>) -> impl IntoRespon context_path = CONTEXT_PATH, responses( (status = 200, description = "OK", body = VersionInfo) + + ) +)] +async fn version_check(State(app_state): State>) -> Json { + app_state.services.system.version().into() +} + +/// Setup Status Check +/// +/// Returns whether the application setup is complete. +#[utoipa::path( + get, + path = "/setup", + tag = "System", + context_path = CONTEXT_PATH, + responses( + (status = 200, description = "OK", body = SetupInfo), + (status = 500, description = "Internal Server Error", body = ErrorResponse, example = json!(INTERNAL_EXAMPLE)) ) )] -async fn version_check( +async fn setup_check( State(app_state): State>, -) -> Result, ApplicationError> { - let version = app_state.services.system.version(); - Ok(version.into()) +) -> Result, ApplicationError> { + let info = app_state.services.system.setup_check().await?; + Ok(info.into()) } diff --git a/src/domains/system/system_service.rs b/src/domains/system/system_service.rs index ab1ba6b9..0bd709df 100644 --- a/src/domains/system/system_service.rs +++ b/src/domains/system/system_service.rs @@ -2,9 +2,12 @@ use async_trait::async_trait; use std::sync::Arc; use tracing::{error, trace}; -use crate::{application::entities::AppStore, infra::lightning::LnClient}; +use crate::{ + application::{entities::AppStore, errors::ApplicationError}, + infra::lightning::LnClient, +}; -use super::{HealthCheck, HealthStatus, SystemUseCases, VersionInfo}; +use super::{HealthCheck, HealthStatus, SetupInfo, SystemUseCases, VersionInfo}; pub struct SystemService { store: AppStore, @@ -48,4 +51,13 @@ impl SystemUseCases for SystemService { build_time: env!("BUILD_TIME").to_string(), } } + + async fn setup_check(&self) -> Result { + trace!("Checking system setup"); + let n_wallets: u64 = self.store.wallet.count().await?; + + Ok(SetupInfo { + complete: n_wallets > 0, + }) + } } diff --git a/src/domains/system/system_use_cases.rs b/src/domains/system/system_use_cases.rs index 4e119ed7..6b1a280c 100644 --- a/src/domains/system/system_use_cases.rs +++ b/src/domains/system/system_use_cases.rs @@ -1,9 +1,12 @@ use async_trait::async_trait; -use super::{HealthCheck, VersionInfo}; +use crate::application::errors::ApplicationError; + +use super::{HealthCheck, SetupInfo, VersionInfo}; #[async_trait] pub trait SystemUseCases: Send + Sync { async fn health_check(&self) -> HealthCheck; fn version(&self) -> VersionInfo; + async fn setup_check(&self) -> Result; } diff --git a/src/domains/wallet/wallet_repository.rs b/src/domains/wallet/wallet_repository.rs index baf7ea2b..5a900624 100644 --- a/src/domains/wallet/wallet_repository.rs +++ b/src/domains/wallet/wallet_repository.rs @@ -20,4 +20,5 @@ pub trait WalletRepository: Send + Sync { ) -> Result; async fn find_contacts(&self, id: Uuid) -> Result, DatabaseError>; async fn delete_many(&self, filter: WalletFilter) -> Result; + async fn count(&self) -> Result; } diff --git a/src/infra/database/sea_orm/repositories/sea_orm_wallet_repository.rs b/src/infra/database/sea_orm/repositories/sea_orm_wallet_repository.rs index b9f608d0..c911f172 100644 --- a/src/infra/database/sea_orm/repositories/sea_orm_wallet_repository.rs +++ b/src/infra/database/sea_orm/repositories/sea_orm_wallet_repository.rs @@ -1,8 +1,8 @@ use async_trait::async_trait; use sea_orm::{ ActiveModelTrait, ActiveValue::Set, ColumnTrait, ConnectionTrait, DatabaseConnection, - DatabaseTransaction, EntityTrait, FromQueryResult, ModelTrait, QueryFilter, QueryOrder, - QuerySelect, QueryTrait, Statement, + DatabaseTransaction, EntityTrait, FromQueryResult, ModelTrait, PaginatorTrait, QueryFilter, + QueryOrder, QuerySelect, QueryTrait, Statement, }; use uuid::Uuid; @@ -256,4 +256,13 @@ impl WalletRepository for SeaOrmWalletRepository { Ok(result.rows_affected) } + + async fn count(&self) -> Result { + let count = Entity::find() + .count(&self.db) + .await + .map_err(|e| DatabaseError::Count(e.to_string()))?; + + Ok(count) + } } From 20fdcf327ba8c985ebe5557cccdfc919f4057654 Mon Sep 17 00:00:00 2001 From: Dario Anongba Varela Date: Mon, 30 Dec 2024 18:23:17 +0100 Subject: [PATCH 2/2] all done --- .DS_Store | Bin 8196 -> 6148 bytes .gitignore | 2 +- Cargo.toml | 1 + Makefile | 2 +- config/default.toml | 2 +- dashboard/.env.example | 5 +- dashboard/.env.production | 2 +- dashboard/.eslintignore | 48 - dashboard/.eslintrc.js | 109 - dashboard/.gitattributes | 4 - dashboard/.gitignore | 2 +- dashboard/.yarn/install-state.gz | Bin 1178628 -> 905768 bytes dashboard/eslint.config.mjs | 194 + dashboard/knip.jsonc | 40 + dashboard/next-env.d.ts | 2 +- dashboard/next.config.mjs | 5 +- dashboard/openapi-ts.config.mjs | 25 +- dashboard/package.json | 139 +- dashboard/prettier.config.mjs | 2 +- dashboard/public/assets/cyan-blur.png | Bin 17324 -> 0 bytes .../{ic-pickers.svg => ic-date-pickers.svg} | 2 +- .../assets/icons/components/ic-drawer.svg | 8 + .../icons/components/ic-extra-layout.svg | 59 + .../public/assets/icons/empty/ic-content.svg | 44 +- .../public/assets/icons/flagpack/ad.webp | Bin 362 -> 0 bytes .../public/assets/icons/flagpack/ae.webp | Bin 268 -> 0 bytes .../public/assets/icons/flagpack/af.webp | Bin 478 -> 0 bytes .../public/assets/icons/flagpack/ag.webp | Bin 614 -> 0 bytes .../public/assets/icons/flagpack/ai.webp | Bin 818 -> 0 bytes .../public/assets/icons/flagpack/al.webp | Bin 416 -> 0 bytes .../public/assets/icons/flagpack/am.webp | Bin 264 -> 0 bytes .../public/assets/icons/flagpack/ao.webp | Bin 458 -> 0 bytes .../public/assets/icons/flagpack/aq.webp | Bin 382 -> 0 bytes .../public/assets/icons/flagpack/ar.webp | Bin 458 -> 0 bytes .../public/assets/icons/flagpack/as.webp | Bin 652 -> 0 bytes .../public/assets/icons/flagpack/at.webp | Bin 244 -> 0 bytes .../public/assets/icons/flagpack/au.webp | Bin 908 -> 0 bytes .../public/assets/icons/flagpack/aw.webp | Bin 384 -> 0 bytes .../public/assets/icons/flagpack/ax.webp | Bin 456 -> 0 bytes .../public/assets/icons/flagpack/az.webp | Bin 444 -> 0 bytes .../public/assets/icons/flagpack/ba.webp | Bin 596 -> 0 bytes .../public/assets/icons/flagpack/bb.webp | Bin 468 -> 0 bytes .../public/assets/icons/flagpack/bd.webp | Bin 300 -> 0 bytes .../public/assets/icons/flagpack/be.webp | Bin 244 -> 0 bytes .../public/assets/icons/flagpack/bf.webp | Bin 408 -> 0 bytes .../public/assets/icons/flagpack/bg.webp | Bin 242 -> 0 bytes .../public/assets/icons/flagpack/bh.webp | Bin 392 -> 0 bytes .../public/assets/icons/flagpack/bi.webp | Bin 784 -> 0 bytes .../public/assets/icons/flagpack/bj.webp | Bin 278 -> 0 bytes .../public/assets/icons/flagpack/bl.webp | Bin 244 -> 0 bytes .../public/assets/icons/flagpack/bm.webp | Bin 796 -> 0 bytes .../public/assets/icons/flagpack/bn.webp | Bin 704 -> 0 bytes .../public/assets/icons/flagpack/bo.webp | Bin 414 -> 0 bytes .../public/assets/icons/flagpack/bq-bo.webp | Bin 616 -> 0 bytes .../public/assets/icons/flagpack/bq-sa.webp | Bin 690 -> 0 bytes .../public/assets/icons/flagpack/bq-se.webp | Bin 624 -> 0 bytes .../public/assets/icons/flagpack/br.webp | Bin 576 -> 0 bytes .../public/assets/icons/flagpack/bs.webp | Bin 404 -> 0 bytes .../public/assets/icons/flagpack/bt.webp | Bin 594 -> 0 bytes .../public/assets/icons/flagpack/bv.webp | Bin 438 -> 0 bytes .../public/assets/icons/flagpack/bw.webp | Bin 276 -> 0 bytes .../public/assets/icons/flagpack/by.webp | Bin 524 -> 0 bytes .../public/assets/icons/flagpack/bz.webp | Bin 626 -> 0 bytes .../public/assets/icons/flagpack/ca.webp | Bin 490 -> 0 bytes .../public/assets/icons/flagpack/cc.webp | Bin 498 -> 0 bytes .../public/assets/icons/flagpack/cd.webp | Bin 854 -> 0 bytes .../public/assets/icons/flagpack/cf.webp | Bin 502 -> 0 bytes .../public/assets/icons/flagpack/cg.webp | Bin 476 -> 0 bytes .../public/assets/icons/flagpack/ch.webp | Bin 350 -> 0 bytes .../public/assets/icons/flagpack/ci.webp | Bin 254 -> 0 bytes .../public/assets/icons/flagpack/ck.webp | Bin 832 -> 0 bytes .../public/assets/icons/flagpack/cl.webp | Bin 374 -> 0 bytes .../public/assets/icons/flagpack/cm.webp | Bin 386 -> 0 bytes .../public/assets/icons/flagpack/cn.webp | Bin 440 -> 0 bytes .../public/assets/icons/flagpack/co.webp | Bin 250 -> 0 bytes .../public/assets/icons/flagpack/cr.webp | Bin 282 -> 0 bytes .../public/assets/icons/flagpack/cu.webp | Bin 540 -> 0 bytes .../public/assets/icons/flagpack/cv.webp | Bin 594 -> 0 bytes .../public/assets/icons/flagpack/cw.webp | Bin 402 -> 0 bytes .../public/assets/icons/flagpack/cx.webp | Bin 664 -> 0 bytes .../public/assets/icons/flagpack/cy.webp | Bin 390 -> 0 bytes .../public/assets/icons/flagpack/cz.webp | Bin 362 -> 0 bytes .../public/assets/icons/flagpack/de.webp | Bin 230 -> 0 bytes .../public/assets/icons/flagpack/dj.webp | Bin 428 -> 0 bytes .../public/assets/icons/flagpack/dk.webp | Bin 324 -> 0 bytes .../public/assets/icons/flagpack/dm.webp | Bin 686 -> 0 bytes .../public/assets/icons/flagpack/do.webp | Bin 428 -> 0 bytes .../public/assets/icons/flagpack/dz.webp | Bin 494 -> 0 bytes .../public/assets/icons/flagpack/ec.webp | Bin 630 -> 0 bytes .../public/assets/icons/flagpack/ee.webp | Bin 226 -> 0 bytes .../public/assets/icons/flagpack/eg.webp | Bin 374 -> 0 bytes .../public/assets/icons/flagpack/eh.webp | Bin 516 -> 0 bytes .../public/assets/icons/flagpack/er.webp | Bin 700 -> 0 bytes .../public/assets/icons/flagpack/es.webp | Bin 518 -> 0 bytes .../public/assets/icons/flagpack/et.webp | Bin 506 -> 0 bytes .../public/assets/icons/flagpack/fi.webp | Bin 292 -> 0 bytes .../public/assets/icons/flagpack/fj.webp | Bin 874 -> 0 bytes .../public/assets/icons/flagpack/fk.webp | Bin 740 -> 0 bytes .../public/assets/icons/flagpack/fm.webp | Bin 390 -> 0 bytes .../public/assets/icons/flagpack/fo.webp | Bin 368 -> 0 bytes .../public/assets/icons/flagpack/fr.webp | Bin 244 -> 0 bytes .../public/assets/icons/flagpack/ga.webp | Bin 280 -> 0 bytes .../public/assets/icons/flagpack/gb-eng.webp | Bin 298 -> 0 bytes .../public/assets/icons/flagpack/gb-nir.webp | Bin 1126 -> 0 bytes .../public/assets/icons/flagpack/gb-sct.webp | Bin 738 -> 0 bytes .../public/assets/icons/flagpack/gb-wls.webp | Bin 712 -> 0 bytes .../public/assets/icons/flagpack/gb.webp | Bin 1126 -> 0 bytes .../public/assets/icons/flagpack/gd.webp | Bin 724 -> 0 bytes .../public/assets/icons/flagpack/ge.webp | Bin 702 -> 0 bytes .../public/assets/icons/flagpack/gf.webp | Bin 398 -> 0 bytes .../public/assets/icons/flagpack/gg.webp | Bin 588 -> 0 bytes .../public/assets/icons/flagpack/gh.webp | Bin 410 -> 0 bytes .../public/assets/icons/flagpack/gi.webp | Bin 542 -> 0 bytes .../public/assets/icons/flagpack/gl.webp | Bin 414 -> 0 bytes .../public/assets/icons/flagpack/gm.webp | Bin 284 -> 0 bytes .../public/assets/icons/flagpack/gn.webp | Bin 266 -> 0 bytes .../public/assets/icons/flagpack/gp.webp | Bin 244 -> 0 bytes .../public/assets/icons/flagpack/gq.webp | Bin 440 -> 0 bytes .../public/assets/icons/flagpack/gr.webp | Bin 488 -> 0 bytes .../public/assets/icons/flagpack/gs.webp | Bin 886 -> 0 bytes .../public/assets/icons/flagpack/gt.webp | Bin 418 -> 0 bytes .../public/assets/icons/flagpack/gu.webp | Bin 662 -> 0 bytes .../public/assets/icons/flagpack/gw.webp | Bin 340 -> 0 bytes .../public/assets/icons/flagpack/gy.webp | Bin 652 -> 0 bytes .../public/assets/icons/flagpack/hk.webp | Bin 554 -> 0 bytes .../public/assets/icons/flagpack/hm.webp | Bin 908 -> 0 bytes .../public/assets/icons/flagpack/hn.webp | Bin 478 -> 0 bytes .../public/assets/icons/flagpack/hr.webp | Bin 702 -> 0 bytes .../public/assets/icons/flagpack/ht.webp | Bin 426 -> 0 bytes .../public/assets/icons/flagpack/hu.webp | Bin 266 -> 0 bytes .../public/assets/icons/flagpack/id.webp | Bin 202 -> 0 bytes .../public/assets/icons/flagpack/ie.webp | Bin 268 -> 0 bytes .../public/assets/icons/flagpack/il.webp | Bin 424 -> 0 bytes .../public/assets/icons/flagpack/im.webp | Bin 486 -> 0 bytes .../public/assets/icons/flagpack/in.webp | Bin 416 -> 0 bytes .../public/assets/icons/flagpack/io.webp | Bin 1366 -> 0 bytes .../public/assets/icons/flagpack/iq.webp | Bin 390 -> 0 bytes .../public/assets/icons/flagpack/ir.webp | Bin 574 -> 0 bytes .../public/assets/icons/flagpack/is.webp | Bin 456 -> 0 bytes .../public/assets/icons/flagpack/it.webp | Bin 246 -> 0 bytes .../public/assets/icons/flagpack/je.webp | Bin 748 -> 0 bytes .../public/assets/icons/flagpack/jm.webp | Bin 786 -> 0 bytes .../public/assets/icons/flagpack/jo.webp | Bin 476 -> 0 bytes .../public/assets/icons/flagpack/jp.webp | Bin 356 -> 0 bytes .../public/assets/icons/flagpack/ke.webp | Bin 584 -> 0 bytes .../public/assets/icons/flagpack/kg.webp | Bin 474 -> 0 bytes .../public/assets/icons/flagpack/kh.webp | Bin 474 -> 0 bytes .../public/assets/icons/flagpack/ki.webp | Bin 776 -> 0 bytes .../public/assets/icons/flagpack/km.webp | Bin 494 -> 0 bytes .../public/assets/icons/flagpack/kn.webp | Bin 792 -> 0 bytes .../public/assets/icons/flagpack/kp.webp | Bin 486 -> 0 bytes .../public/assets/icons/flagpack/kr.webp | Bin 718 -> 0 bytes .../public/assets/icons/flagpack/kw.webp | Bin 336 -> 0 bytes .../public/assets/icons/flagpack/ky.webp | Bin 874 -> 0 bytes .../public/assets/icons/flagpack/kz.webp | Bin 632 -> 0 bytes .../public/assets/icons/flagpack/la.webp | Bin 330 -> 0 bytes .../public/assets/icons/flagpack/lb.webp | Bin 414 -> 0 bytes .../public/assets/icons/flagpack/lc.webp | Bin 412 -> 0 bytes .../public/assets/icons/flagpack/li.webp | Bin 416 -> 0 bytes .../public/assets/icons/flagpack/lk.webp | Bin 668 -> 0 bytes .../public/assets/icons/flagpack/lr.webp | Bin 464 -> 0 bytes .../public/assets/icons/flagpack/ls.webp | Bin 378 -> 0 bytes .../public/assets/icons/flagpack/lt.webp | Bin 264 -> 0 bytes .../public/assets/icons/flagpack/lu.webp | Bin 256 -> 0 bytes .../public/assets/icons/flagpack/lv.webp | Bin 220 -> 0 bytes .../public/assets/icons/flagpack/ly.webp | Bin 376 -> 0 bytes .../public/assets/icons/flagpack/ma.webp | Bin 364 -> 0 bytes .../public/assets/icons/flagpack/mc.webp | Bin 204 -> 0 bytes .../public/assets/icons/flagpack/md.webp | Bin 668 -> 0 bytes .../public/assets/icons/flagpack/me.webp | Bin 536 -> 0 bytes .../public/assets/icons/flagpack/mf.webp | Bin 244 -> 0 bytes .../public/assets/icons/flagpack/mg.webp | Bin 254 -> 0 bytes .../public/assets/icons/flagpack/mh.webp | Bin 692 -> 0 bytes .../public/assets/icons/flagpack/mk.webp | Bin 932 -> 0 bytes .../public/assets/icons/flagpack/ml.webp | Bin 262 -> 0 bytes .../public/assets/icons/flagpack/mm.webp | Bin 446 -> 0 bytes .../public/assets/icons/flagpack/mn.webp | Bin 432 -> 0 bytes .../public/assets/icons/flagpack/mo.webp | Bin 574 -> 0 bytes .../public/assets/icons/flagpack/mp.webp | Bin 706 -> 0 bytes .../public/assets/icons/flagpack/mq.webp | Bin 244 -> 0 bytes .../public/assets/icons/flagpack/mr.webp | Bin 426 -> 0 bytes .../public/assets/icons/flagpack/ms.webp | Bin 678 -> 0 bytes .../public/assets/icons/flagpack/mt.webp | Bin 290 -> 0 bytes .../public/assets/icons/flagpack/mu.webp | Bin 294 -> 0 bytes .../public/assets/icons/flagpack/mv.webp | Bin 352 -> 0 bytes .../public/assets/icons/flagpack/mw.webp | Bin 344 -> 0 bytes .../public/assets/icons/flagpack/mx.webp | Bin 404 -> 0 bytes .../public/assets/icons/flagpack/my.webp | Bin 530 -> 0 bytes .../public/assets/icons/flagpack/mz.webp | Bin 554 -> 0 bytes .../public/assets/icons/flagpack/na.webp | Bin 854 -> 0 bytes .../public/assets/icons/flagpack/nc.webp | Bin 238 -> 0 bytes .../public/assets/icons/flagpack/ne.webp | Bin 418 -> 0 bytes .../public/assets/icons/flagpack/nf.webp | Bin 510 -> 0 bytes .../public/assets/icons/flagpack/ng.webp | Bin 256 -> 0 bytes .../public/assets/icons/flagpack/ni.webp | Bin 446 -> 0 bytes .../public/assets/icons/flagpack/nl.webp | Bin 254 -> 0 bytes .../public/assets/icons/flagpack/no.webp | Bin 438 -> 0 bytes .../public/assets/icons/flagpack/np.webp | Bin 544 -> 0 bytes .../public/assets/icons/flagpack/nr.webp | Bin 406 -> 0 bytes .../public/assets/icons/flagpack/nu.webp | Bin 966 -> 0 bytes .../public/assets/icons/flagpack/nz.webp | Bin 954 -> 0 bytes .../public/assets/icons/flagpack/om.webp | Bin 514 -> 0 bytes .../public/assets/icons/flagpack/pa.webp | Bin 402 -> 0 bytes .../public/assets/icons/flagpack/pe.webp | Bin 466 -> 0 bytes .../public/assets/icons/flagpack/pf.webp | Bin 472 -> 0 bytes .../public/assets/icons/flagpack/pg.webp | Bin 672 -> 0 bytes .../public/assets/icons/flagpack/ph.webp | Bin 502 -> 0 bytes .../public/assets/icons/flagpack/pk.webp | Bin 410 -> 0 bytes .../public/assets/icons/flagpack/pl.webp | Bin 196 -> 0 bytes .../public/assets/icons/flagpack/pm.webp | Bin 242 -> 0 bytes .../public/assets/icons/flagpack/pn.webp | Bin 826 -> 0 bytes .../public/assets/icons/flagpack/pr.webp | Bin 484 -> 0 bytes .../public/assets/icons/flagpack/ps.webp | Bin 358 -> 0 bytes .../public/assets/icons/flagpack/pt.webp | Bin 564 -> 0 bytes .../public/assets/icons/flagpack/pw.webp | Bin 340 -> 0 bytes .../public/assets/icons/flagpack/py.webp | Bin 414 -> 0 bytes .../public/assets/icons/flagpack/qa.webp | Bin 382 -> 0 bytes .../public/assets/icons/flagpack/re.webp | Bin 238 -> 0 bytes .../public/assets/icons/flagpack/ro.webp | Bin 272 -> 0 bytes .../public/assets/icons/flagpack/rs.webp | Bin 596 -> 0 bytes .../public/assets/icons/flagpack/ru.webp | Bin 238 -> 0 bytes .../public/assets/icons/flagpack/rw.webp | Bin 456 -> 0 bytes .../public/assets/icons/flagpack/sa.webp | Bin 536 -> 0 bytes .../public/assets/icons/flagpack/sb.webp | Bin 694 -> 0 bytes .../public/assets/icons/flagpack/sc.webp | Bin 694 -> 0 bytes .../public/assets/icons/flagpack/sd.webp | Bin 350 -> 0 bytes .../public/assets/icons/flagpack/se.webp | Bin 374 -> 0 bytes .../public/assets/icons/flagpack/sg.webp | Bin 386 -> 0 bytes .../public/assets/icons/flagpack/sh.webp | Bin 686 -> 0 bytes .../public/assets/icons/flagpack/si.webp | Bin 436 -> 0 bytes .../public/assets/icons/flagpack/sj.webp | Bin 438 -> 0 bytes .../public/assets/icons/flagpack/sk.webp | Bin 504 -> 0 bytes .../public/assets/icons/flagpack/sl.webp | Bin 264 -> 0 bytes .../public/assets/icons/flagpack/sm.webp | Bin 574 -> 0 bytes .../public/assets/icons/flagpack/sn.webp | Bin 410 -> 0 bytes .../public/assets/icons/flagpack/so.webp | Bin 310 -> 0 bytes .../public/assets/icons/flagpack/sr.webp | Bin 436 -> 0 bytes .../public/assets/icons/flagpack/ss.webp | Bin 492 -> 0 bytes .../public/assets/icons/flagpack/st.webp | Bin 512 -> 0 bytes .../public/assets/icons/flagpack/sv.webp | Bin 434 -> 0 bytes .../public/assets/icons/flagpack/sx.webp | Bin 566 -> 0 bytes .../public/assets/icons/flagpack/sy.webp | Bin 368 -> 0 bytes .../public/assets/icons/flagpack/sz.webp | Bin 700 -> 0 bytes .../public/assets/icons/flagpack/tc.webp | Bin 668 -> 0 bytes .../public/assets/icons/flagpack/td.webp | Bin 256 -> 0 bytes .../public/assets/icons/flagpack/tf.webp | Bin 534 -> 0 bytes .../public/assets/icons/flagpack/tg.webp | Bin 454 -> 0 bytes .../public/assets/icons/flagpack/th.webp | Bin 268 -> 0 bytes .../public/assets/icons/flagpack/tj.webp | Bin 392 -> 0 bytes .../public/assets/icons/flagpack/tk.webp | Bin 558 -> 0 bytes .../public/assets/icons/flagpack/tl.webp | Bin 562 -> 0 bytes .../public/assets/icons/flagpack/tm.webp | Bin 638 -> 0 bytes .../public/assets/icons/flagpack/tn.webp | Bin 532 -> 0 bytes .../public/assets/icons/flagpack/to.webp | Bin 408 -> 0 bytes .../public/assets/icons/flagpack/tr.webp | Bin 468 -> 0 bytes .../public/assets/icons/flagpack/tt.webp | Bin 560 -> 0 bytes .../public/assets/icons/flagpack/tv.webp | Bin 916 -> 0 bytes .../public/assets/icons/flagpack/tw.webp | Bin 416 -> 0 bytes .../public/assets/icons/flagpack/tz.webp | Bin 760 -> 0 bytes .../public/assets/icons/flagpack/ua.webp | Bin 256 -> 0 bytes .../public/assets/icons/flagpack/ug.webp | Bin 586 -> 0 bytes .../public/assets/icons/flagpack/um.webp | Bin 668 -> 0 bytes .../public/assets/icons/flagpack/us.webp | Bin 668 -> 0 bytes .../public/assets/icons/flagpack/uy.webp | Bin 488 -> 0 bytes .../public/assets/icons/flagpack/uz.webp | Bin 568 -> 0 bytes .../public/assets/icons/flagpack/va.webp | Bin 490 -> 0 bytes .../public/assets/icons/flagpack/vc.webp | Bin 440 -> 0 bytes .../public/assets/icons/flagpack/ve.webp | Bin 428 -> 0 bytes .../public/assets/icons/flagpack/vg.webp | Bin 678 -> 0 bytes .../public/assets/icons/flagpack/vi.webp | Bin 660 -> 0 bytes .../public/assets/icons/flagpack/vn.webp | Bin 348 -> 0 bytes .../public/assets/icons/flagpack/vu.webp | Bin 722 -> 0 bytes .../public/assets/icons/flagpack/wf.webp | Bin 242 -> 0 bytes .../public/assets/icons/flagpack/ws.webp | Bin 372 -> 0 bytes .../public/assets/icons/flagpack/xk.webp | Bin 466 -> 0 bytes .../public/assets/icons/flagpack/ye.webp | Bin 222 -> 0 bytes .../public/assets/icons/flagpack/yt.webp | Bin 962 -> 0 bytes .../public/assets/icons/flagpack/za.webp | Bin 616 -> 0 bytes .../public/assets/icons/flagpack/zm.webp | Bin 378 -> 0 bytes .../public/assets/icons/flagpack/zw.webp | Bin 652 -> 0 bytes .../assets/icons/platforms/ic-auth0.svg | 5 - .../public/assets/icons/platforms/ic-jwt.svg | 15 - .../assets/icons/platforms/ic-supabase.svg | 99 - .../assets/icons/setting/ic-align-left.svg | 7 - .../assets/icons/setting/ic-collapse.svg | 4 - .../assets/icons/setting/ic-contrast-bold.svg | 4 - .../icons/setting/ic-exit-full-screen.svg | 6 - .../assets/icons/setting/ic-full-screen.svg | 6 - .../assets/icons/setting/ic-sidebar.svg | 4 - .../public/assets/icons/setting/ic-sun.svg | 13 - .../public/assets/icons/setting/ic_moon.svg | 4 - .../assets/icons/setting/ic_setting.svg | 6 - .../public/assets/icons/setting/ic_sun.svg | 13 - .../{setting => settings}/ic-align-right.svg | 0 .../ic-autofit-width.svg | 0 .../{setting => settings}/ic-contrast.svg | 0 .../icons/{setting => settings}/ic-font.svg | 0 .../icons/{setting => settings}/ic-moon.svg | 0 .../icons/settings/ic-nav-horizontal.svg | 17 + .../assets/icons/settings/ic-nav-mini.svg | 17 + .../assets/icons/settings/ic-nav-vertical.svg | 17 + .../ic-sidebar-filled.svg | 0 .../ic-sidebar-outline.svg | 0 .../ic-siderbar-duotone.svg | 0 dashboard/public/assets/placeholder.svg | 8 - dashboard/public/assets/red-blur.png | Bin 12348 -> 0 bytes dashboard/public/assets/transparent.png | Bin 95 -> 0 bytes dashboard/src/actions/api-key.ts | 11 +- dashboard/src/actions/invoices.ts | 20 +- dashboard/src/actions/ln-addresses.ts | 30 +- dashboard/src/actions/ln-node.ts | 52 +- dashboard/src/actions/mempool-space.ts | 18 +- dashboard/src/actions/payments.ts | 20 +- dashboard/src/actions/user-wallet.ts | 286 +- dashboard/src/actions/wallet.ts | 74 +- .../app/(index)/admin/lightning-node/page.tsx | 4 +- dashboard/src/app/(index)/layout.tsx | 2 +- dashboard/src/app/error.tsx | 15 + dashboard/src/app/layout.tsx | 109 +- dashboard/src/app/login/page.tsx | 8 +- dashboard/src/app/not-found.tsx | 8 +- dashboard/src/app/reset-password/page.tsx | 6 +- dashboard/src/app/sign-up/page.tsx | 6 +- dashboard/src/app/update-password/page.tsx | 6 +- dashboard/src/app/verify/page.tsx | 6 +- dashboard/src/assets/data/countries.ts | 1 - .../src/assets/icons/email-inbox-icon.tsx | 69 +- dashboard/src/assets/icons/index.ts | 5 + .../src/assets/icons/new-password-icon.tsx | 58 +- dashboard/src/assets/icons/password-icon.tsx | 52 +- dashboard/src/assets/icons/sent-icon.tsx | 53 +- dashboard/src/assets/icons/social-icons.tsx | 221 + .../src/assets/illustrations/avatar-shape.tsx | 29 +- .../assets/illustrations/background-shape.tsx | 10 +- .../illustrations/forbidden-illustration.tsx | 79 +- dashboard/src/assets/illustrations/index.ts | 5 + .../page-not-found-illustration.tsx | 79 +- .../server-error-illustration.tsx | 160 + .../illustrations/upload-illustration.tsx | 277 +- .../src/auth/components/form-divider.tsx | 28 + dashboard/src/auth/components/form-head.tsx | 47 + .../src/auth/components/form-resend-code.tsx | 46 + .../src/auth/components/form-return-link.tsx | 41 + .../src/auth/components/form-socials.tsx | 46 + .../src/auth/components/sign-up-terms.tsx | 35 + dashboard/src/auth/context/auth-context.tsx | 2 - .../src/auth/context/auth0/auth-provider.tsx | 59 +- dashboard/src/auth/context/jwt/action.ts | 13 +- .../src/auth/context/jwt/auth-provider.tsx | 7 +- dashboard/src/auth/context/jwt/constant.ts | 2 +- dashboard/src/auth/context/jwt/utils.ts | 6 +- .../src/auth/context/supabase/action.tsx | 12 +- .../auth/context/supabase/auth-provider.tsx | 3 +- dashboard/src/auth/guard/auth-guard.tsx | 59 +- dashboard/src/auth/guard/guest-guard.tsx | 9 +- dashboard/src/auth/guard/role-based-guard.tsx | 19 +- dashboard/src/auth/permissions.ts | 6 +- dashboard/src/auth/utils/error-message.ts | 20 + dashboard/src/auth/utils/index.ts | 1 + .../view}/auth0/auth0-sign-in-view.tsx | 6 +- .../auth => auth/view}/auth0/index.ts | 0 .../{sections/auth => auth/view}/jwt/index.ts | 0 .../src/auth/view/jwt/jwt-sign-in-view.tsx | 133 + .../src/auth/view/jwt/jwt-sign-up-view.tsx | 172 + .../auth => auth/view}/supabase/index.ts | 0 .../supabase/supabase-reset-password-view.tsx | 99 + .../view}/supabase/supabase-sign-in-view.tsx | 106 +- .../view/supabase/supabase-sign-up-view.tsx | 168 + .../supabase-update-password-view.tsx | 151 + .../view/supabase/supabase-verify-view.tsx | 24 + .../src/components/analytic/item-analytic.tsx | 16 +- .../src/components/animate/animate-avatar.tsx | 8 +- .../src/components/animate/animate-border.tsx | 360 +- .../components/animate/animate-count-up.tsx | 58 +- .../src/components/animate/animate-logo.tsx | 175 +- .../src/components/animate/animate-text.tsx | 143 +- dashboard/src/components/animate/index.ts | 4 - .../components/animate/motion-container.tsx | 27 +- .../src/components/animate/motion-lazy.tsx | 4 +- .../components/animate/motion-viewport.tsx | 17 +- .../scroll-progress/scroll-progress.tsx | 135 +- .../scroll-progress/use-scroll-progress.ts | 11 +- .../components/animate/variants/actions.ts | 24 +- .../components/animate/variants/background.ts | 83 +- .../src/components/animate/variants/bounce.ts | 118 +- .../components/animate/variants/container.ts | 35 +- .../src/components/animate/variants/fade.ts | 97 +- .../src/components/animate/variants/flip.ts | 41 +- .../src/components/animate/variants/path.ts | 19 +- .../src/components/animate/variants/rotate.ts | 38 +- .../src/components/animate/variants/scale.ts | 46 +- .../src/components/animate/variants/slide.ts | 71 +- .../components/animate/variants/transition.ts | 33 +- .../src/components/animate/variants/zoom.ts | 77 +- .../api-key/create-api-key-form.tsx | 81 +- .../src/components/bitcoin/sats-with-icon.tsx | 8 +- .../src/components/carousel/breakpoints.ts | 9 - .../src/components/carousel/carousel.tsx | 141 +- dashboard/src/components/carousel/classes.ts | 55 +- .../carousel/components/arrow-button.tsx | 83 + .../components/carousel-arrow-buttons.tsx | 228 +- .../components/carousel-dot-buttons.tsx | 146 - .../components/carousel-progress-bar.tsx | 47 - .../carousel/components/carousel-slide.tsx | 101 +- .../carousel/components/carousel-thumbs.tsx | 162 - .../components/carousel/components/index.ts | 5 + .../carousel/hooks/use-carousel-auto-play.ts | 47 - .../hooks/use-carousel-auto-scroll.ts | 47 - .../carousel/hooks/use-carousel-dots.ts | 1 - .../carousel/hooks/use-carousel-parallax.ts | 14 +- .../components/carousel/hooks/use-carousel.ts | 46 +- .../components/carousel/hooks/use-thumbs.ts | 5 +- dashboard/src/components/carousel/index.ts | 14 +- dashboard/src/components/carousel/types.ts | 94 +- dashboard/src/components/carousel/utils.ts | 42 + .../src/components/chart/chart-legends.tsx | 65 - .../src/components/chart/chart-loading.tsx | 48 - .../src/components/chart/chart-select.tsx | 67 - dashboard/src/components/chart/chart.tsx | 70 +- dashboard/src/components/chart/classes.ts | 19 + .../chart/components/chart-loading.tsx | 51 + .../src/components/chart/components/index.ts | 1 + dashboard/src/components/chart/index.ts | 8 +- dashboard/src/components/chart/styles.css | 7 +- dashboard/src/components/chart/types.ts | 24 +- dashboard/src/components/chart/use-chart.ts | 266 +- .../components/color-utils/color-picker.tsx | 107 - .../components/color-utils/color-preview.tsx | 48 - dashboard/src/components/color-utils/index.ts | 5 - dashboard/src/components/color-utils/types.ts | 19 - dashboard/src/components/copy/copy-button.tsx | 3 +- .../src/components/copy/copy-menu-item.tsx | 3 +- .../country-select/country-select.tsx | 196 +- .../src/components/country-select/index.ts | 2 - .../src/components/country-select/utils.ts | 17 - .../custom-breadcrumbs/back-link.tsx | 50 + .../custom-breadcrumbs/breadcrumb-link.tsx | 93 +- .../custom-breadcrumbs/custom-breadcrumbs.tsx | 135 +- .../components/custom-breadcrumbs/index.ts | 2 - .../custom-breadcrumbs/more-links.tsx | 30 + .../components/custom-breadcrumbs/styles.ts | 38 + .../components/custom-breadcrumbs/types.ts | 26 - .../custom-date-range-picker.tsx | 87 - .../custom-date-range-picker/index.ts | 3 - .../custom-date-range-picker/types.ts | 27 - .../use-date-range-picker.ts | 67 - .../custom-dialog/confirm-dialog.tsx | 9 +- .../custom-popover/custom-popover.tsx | 50 +- .../src/components/custom-popover/index.ts | 6 +- .../src/components/custom-popover/styles.tsx | 207 +- .../src/components/custom-popover/types.ts | 10 +- .../components/custom-popover/use-popover.ts | 27 - .../src/components/custom-popover/utils.ts | 4 +- .../components/custom-tabs/custom-tabs.tsx | 87 +- .../src/components/delete/delete-button.tsx | 4 +- .../empty-content/empty-content.tsx | 113 +- .../file-thumbnail/action-buttons.tsx | 65 - .../src/components/file-thumbnail/classes.ts | 9 - .../file-thumbnail/file-thumbnail.tsx | 73 - .../src/components/file-thumbnail/index.ts | 7 - .../src/components/file-thumbnail/types.ts | 25 - .../src/components/file-thumbnail/utils.ts | 156 - .../filters-result/filters-block.tsx | 60 +- .../filters-result/filters-result.tsx | 60 +- dashboard/src/components/flag-icon/classes.ts | 8 + .../src/components/flag-icon/flag-icon.tsx | 60 + dashboard/src/components/flag-icon/index.ts | 3 + dashboard/src/components/hook-form/fields.tsx | 4 +- .../src/components/hook-form/help-text.tsx | 38 + dashboard/src/components/hook-form/index.ts | 8 +- .../components/hook-form/rhf-autocomplete.tsx | 39 +- .../src/components/hook-form/rhf-checkbox.tsx | 92 +- .../src/components/hook-form/rhf-code.tsx | 74 +- .../hook-form/rhf-country-select.tsx | 12 +- .../components/hook-form/rhf-date-picker.tsx | 14 +- .../components/hook-form/rhf-number-input.tsx | 31 + .../components/hook-form/rhf-phone-input.tsx | 33 - .../components/hook-form/rhf-radio-group.tsx | 58 +- .../src/components/hook-form/rhf-rating.tsx | 38 +- .../src/components/hook-form/rhf-select.tsx | 180 +- .../src/components/hook-form/rhf-slider.tsx | 25 +- .../src/components/hook-form/rhf-switch.tsx | 82 +- .../components/hook-form/rhf-text-field.tsx | 43 +- .../hook-form/rhf-wallet-select.tsx | 50 - .../src/components/hook-form/schema-helper.ts | 126 - dashboard/src/components/iconify/classes.ts | 6 +- .../src/components/iconify/flag-icon.tsx | 46 - dashboard/src/components/iconify/iconify.tsx | 39 +- dashboard/src/components/iconify/index.ts | 6 - .../src/components/iconify/social-icon.tsx | 118 - dashboard/src/components/iconify/types.ts | 6 - dashboard/src/components/image/classes.ts | 7 - dashboard/src/components/image/image.tsx | 104 - dashboard/src/components/image/index.ts | 5 - dashboard/src/components/image/styles.css | 1 - dashboard/src/components/image/types.ts | 18 - dashboard/src/components/image/utils.ts | 15 - dashboard/src/components/label/classes.ts | 7 +- dashboard/src/components/label/label.tsx | 81 +- dashboard/src/components/label/styles.ts | 113 - dashboard/src/components/label/styles.tsx | 117 + dashboard/src/components/label/types.ts | 19 +- .../ln-address/register-ln-address-form.tsx | 45 +- .../loading-screen/loading-screen.tsx | 38 +- .../loading-screen/splash-screen.tsx | 51 +- dashboard/src/components/logo/classes.ts | 6 +- dashboard/src/components/logo/logo.tsx | 118 +- dashboard/src/components/markdown/classes.ts | 12 - .../markdown/code-highlight-block.css | 82 - .../src/components/markdown/html-tags.ts | 172 - .../components/markdown/html-to-markdown.ts | 62 - dashboard/src/components/markdown/index.ts | 3 - .../src/components/markdown/markdown.tsx | 87 - dashboard/src/components/markdown/styles.ts | 165 - dashboard/src/components/markdown/types.ts | 9 - dashboard/src/components/nav-basic/classes.ts | 10 - .../src/components/nav-basic/css-vars.ts | 81 - .../src/components/nav-basic/desktop/index.ts | 3 - .../nav-basic/desktop/nav-basic-desktop.tsx | 38 - .../components/nav-basic/desktop/nav-item.tsx | 207 - .../components/nav-basic/desktop/nav-list.tsx | 138 - dashboard/src/components/nav-basic/index.ts | 9 - .../src/components/nav-basic/mobile/index.ts | 3 - .../nav-basic/mobile/nav-basic-mobile.tsx | 30 - .../components/nav-basic/mobile/nav-item.tsx | 235 - .../components/nav-basic/mobile/nav-list.tsx | 122 - dashboard/src/components/nav-basic/types.ts | 68 - .../src/components/nav-section/classes.ts | 31 - .../nav-section/components/index.ts | 7 + .../nav-section/components/nav-collapse.tsx | 38 + .../nav-section/components/nav-dropdown.tsx | 25 + .../nav-section/components/nav-elements.tsx | 33 + .../nav-section/components/nav-subheader.tsx | 55 + .../nav-section/horizontal/nav-item.tsx | 388 +- .../nav-section/horizontal/nav-list.tsx | 195 +- .../horizontal/nav-section-horizontal.tsx | 68 +- dashboard/src/components/nav-section/index.ts | 10 +- .../components/nav-section/mini/nav-item.tsx | 424 +- .../components/nav-section/mini/nav-list.tsx | 183 +- .../nav-section/mini/nav-section-mini.tsx | 44 +- .../src/components/nav-section/styles.tsx | 211 - .../components/nav-section/styles/classes.ts | 31 + .../nav-section/{ => styles}/css-vars.ts | 45 +- .../components/nav-section/styles/index.ts | 5 + .../nav-section/styles/nav-item-styles.ts | 58 + dashboard/src/components/nav-section/types.ts | 81 +- .../{hooks.tsx => utils/create-nav-item.ts} | 25 +- .../src/components/nav-section/utils/index.ts | 1 + .../nav-section/vertical/nav-item.tsx | 431 +- .../nav-section/vertical/nav-list.tsx | 119 +- .../vertical/nav-section-vertical.tsx | 89 +- .../src/components/number-input/index.ts | 1 + .../components/number-input/number-input.tsx | 184 + .../src/components/number-input/styles.ts | 68 + dashboard/src/components/phone-input/index.ts | 3 - dashboard/src/components/phone-input/list.tsx | 133 - .../components/phone-input/phone-input.tsx | 53 - dashboard/src/components/phone-input/types.ts | 16 - dashboard/src/components/phone-input/utils.ts | 46 - .../components/progress-bar/progress-bar.tsx | 69 +- dashboard/src/components/qr/qr-dialog.tsx | 3 +- dashboard/src/components/scrollbar/classes.ts | 6 +- .../src/components/scrollbar/scrollbar.tsx | 68 +- dashboard/src/components/scrollbar/types.ts | 7 +- .../search-not-found/search-not-found.tsx | 40 +- .../components/settings/config-settings.ts | 19 - .../src/components/settings/context/index.ts | 2 + .../settings/context/settings-context.ts | 9 + .../settings/context/settings-provider.tsx | 56 +- .../settings/context/use-settings-context.ts | 2 +- .../settings/drawer/base-option.tsx | 113 +- .../settings/drawer/font-options.tsx | 159 +- .../settings/drawer/fullscreen-button.tsx | 26 +- .../settings/drawer/nav-layout-option.tsx | 113 + .../settings/drawer/nav-options.tsx | 258 - .../settings/drawer/presets-options.tsx | 88 +- .../settings/drawer/settings-drawer.tsx | 280 +- .../src/components/settings/drawer/styles.tsx | 199 +- dashboard/src/components/settings/index.ts | 4 +- dashboard/src/components/settings/server.ts | 10 +- .../components/settings/settings-config.ts | 16 + dashboard/src/components/settings/types.ts | 48 +- dashboard/src/components/snackbar/classes.ts | 40 +- .../src/components/snackbar/snackbar.tsx | 46 +- dashboard/src/components/snackbar/styles.tsx | 117 +- dashboard/src/components/svg-color/classes.ts | 6 +- .../src/components/svg-color/svg-color.tsx | 51 +- dashboard/src/components/svg-color/types.ts | 5 +- dashboard/src/components/table/index.ts | 4 - .../src/components/table/table-empty-rows.tsx | 16 +- .../components/table/table-head-custom.tsx | 39 +- .../src/components/table/table-no-data.tsx | 2 +- .../table/table-pagination-custom.tsx | 13 +- .../table/table-selected-action.tsx | 60 +- .../src/components/table/table-skeleton.tsx | 32 - dashboard/src/components/table/types.ts | 28 - dashboard/src/components/table/use-table.ts | 53 +- dashboard/src/components/table/utils.ts | 63 +- .../clean-transactions-button.tsx | 23 +- .../transactions/confirm-payment-dialog.tsx | 72 +- .../transactions/new-invoice-card.tsx | 10 +- .../transactions/new-invoice-form.tsx | 78 +- .../transactions/new-payment-form.tsx | 98 +- dashboard/src/components/wallet/index.ts | 1 + .../wallet/register-wallet-form.tsx | 14 +- .../src/components/wallet/select-wallet.tsx | 39 + .../{config-global.ts => global-config.ts} | 34 +- dashboard/src/global.css | 17 +- dashboard/src/hooks/use-boolean.ts | 42 - dashboard/src/hooks/use-client-rect.ts | 76 - dashboard/src/hooks/use-cookies.ts | 137 - dashboard/src/hooks/use-copy-to-clipboard.ts | 40 - dashboard/src/hooks/use-countdown.ts | 96 - dashboard/src/hooks/use-debounce.ts | 27 - dashboard/src/hooks/use-double-click.ts | 41 - dashboard/src/hooks/use-event-listener.ts | 68 - dashboard/src/hooks/use-local-storage.ts | 109 - dashboard/src/hooks/use-negative-logo.ts | 7 - dashboard/src/hooks/use-responsive.ts | 56 - dashboard/src/hooks/use-scroll-offset-top.ts | 57 - dashboard/src/hooks/use-set-state.ts | 47 - dashboard/src/hooks/use-tabs.ts | 47 - .../src/layouts/auth-centered/content.tsx | 43 + dashboard/src/layouts/auth-centered/index.ts | 4 +- .../src/layouts/auth-centered/layout.tsx | 202 +- dashboard/src/layouts/auth-centered/main.tsx | 60 - dashboard/src/layouts/auth-split/content.tsx | 54 + dashboard/src/layouts/auth-split/index.ts | 4 +- dashboard/src/layouts/auth-split/layout.tsx | 210 +- dashboard/src/layouts/auth-split/main.tsx | 78 - dashboard/src/layouts/auth-split/section.tsx | 90 +- dashboard/src/layouts/classes.ts | 9 - .../src/layouts/components/account-button.tsx | 57 +- .../src/layouts/components/account-drawer.tsx | 196 +- .../layouts/components/account-popover.tsx | 146 +- .../layouts/components/contacts-popover.tsx | 91 +- .../layouts/components/currency-popover.tsx | 61 +- .../layouts/components/language-popover.tsx | 70 +- .../src/layouts/components/menu-button.tsx | 2 - .../layouts/components/nav-toggle-button.tsx | 63 +- .../components/notifications-drawer/index.tsx | 58 +- .../notification-item.tsx | 210 +- .../layouts/components/searchbar/index.tsx | 231 +- .../components/searchbar/result-item.tsx | 83 +- .../src/layouts/components/searchbar/utils.ts | 125 +- .../layouts/components/settings-button.tsx | 15 +- .../src/layouts/components/sign-in-button.tsx | 10 +- .../layouts/components/sign-out-button.tsx | 13 +- .../layouts/components/workspaces-popover.tsx | 165 +- .../src/layouts/config-nav-workspace.tsx | 12 - dashboard/src/layouts/core/classes.ts | 17 + dashboard/src/layouts/core/css-vars.ts | 14 + dashboard/src/layouts/core/header-base.tsx | 227 - dashboard/src/layouts/core/header-section.tsx | 206 +- dashboard/src/layouts/core/index.ts | 9 + dashboard/src/layouts/core/layout-section.tsx | 57 +- dashboard/src/layouts/core/main-section.tsx | 27 + dashboard/src/layouts/dashboard/content.tsx | 94 + dashboard/src/layouts/dashboard/css-vars.ts | 87 + dashboard/src/layouts/dashboard/index.ts | 4 +- dashboard/src/layouts/dashboard/layout.tsx | 393 +- dashboard/src/layouts/dashboard/main.tsx | 84 - .../src/layouts/dashboard/nav-horizontal.tsx | 46 +- .../src/layouts/dashboard/nav-mobile.tsx | 26 +- .../src/layouts/dashboard/nav-vertical.tsx | 121 +- ...nav-account.tsx => nav-config-account.tsx} | 10 +- ...dashboard.tsx => nav-config-dashboard.tsx} | 24 +- .../src/layouts/nav-config-workspace.tsx | 14 + dashboard/src/layouts/simple/content.tsx | 48 + dashboard/src/layouts/simple/index.ts | 4 +- dashboard/src/layouts/simple/layout.tsx | 137 +- dashboard/src/layouts/simple/main.tsx | 50 - dashboard/src/lib/openapi.json | 2 +- dashboard/src/lib/supabase.ts | 6 +- dashboard/src/lib/swissknife/index.ts | 3 +- dashboard/src/lib/swissknife/schemas.gen.ts | 862 --- .../{services.gen.ts => sdk.gen.ts} | 1091 ++-- .../src/lib/swissknife/transformers.gen.ts | 310 ++ dashboard/src/lib/swissknife/types.gen.ts | 2858 +++++++--- dashboard/src/lib/swissknife/zod.gen.ts | 301 ++ dashboard/src/locales/i18n-provider.tsx | 13 +- dashboard/src/locales/index.ts | 2 +- .../{config-locales.ts => locales-config.ts} | 19 +- .../src/locales/localization-provider.tsx | 2 - dashboard/src/locales/server.ts | 34 +- dashboard/src/locales/use-locales.ts | 10 +- .../src/locales/utils/number-format-locale.ts | 2 +- dashboard/src/routes/hooks/index.ts | 3 - dashboard/src/routes/hooks/use-active-link.ts | 55 - dashboard/src/routes/paths.ts | 6 +- dashboard/src/routes/utils.ts | 43 - .../src/sections/api-key/api-key-list.tsx | 57 +- .../api-key/api-key-table-filters-result.tsx | 15 +- .../sections/api-key/api-key-table-row.tsx | 20 +- .../api-key/api-key-table-toolbar.tsx | 4 +- .../api-key/view/api-key-list-view.tsx | 11 +- .../sections/auth/jwt/jwt-sign-in-view.tsx | 122 - .../sections/auth/jwt/jwt-sign-up-view.tsx | 179 - .../supabase/supabase-reset-password-view.tsx | 104 - .../auth/supabase/supabase-sign-up-view.tsx | 175 - .../supabase-update-password-view.tsx | 143 - .../auth/supabase/supabase-verify-view.tsx | 47 - .../src/sections/contact/contact-list.tsx | 25 +- .../error/{403-view.tsx => 500-view.tsx} | 22 +- dashboard/src/sections/error/index.ts | 2 +- .../src/sections/error/not-found-view.tsx | 24 +- .../ln-address/ln-address-details.tsx | 19 +- .../sections/ln-address/ln-address-list.tsx | 81 +- .../ln-address-table-filters-result.tsx | 22 +- .../ln-address/ln-address-table-row.tsx | 16 +- .../ln-address/ln-address-table-toolbar.tsx | 4 +- .../view/admin-ln-address-details-view.tsx | 2 +- .../view/ln-address-details-view.tsx | 22 +- .../ln-address/view/ln-address-list-view.tsx | 11 +- .../src/sections/node/current-balance.tsx | 41 +- dashboard/src/sections/node/ln-addresses.tsx | 5 +- dashboard/src/sections/node/lsp-list.tsx | 62 +- dashboard/src/sections/node/sign-message.tsx | 34 +- .../src/sections/node/verify-message.tsx | 39 +- .../sections/node/view/breez-node-view.tsx | 73 +- .../src/sections/node/view/node-view.tsx | 43 +- .../src/sections/nostr/nostr-details.tsx | 18 +- .../nostr/view/nostr-details-view.tsx | 16 +- .../sections/settings/settings-api-key.tsx | 39 +- .../sections/settings/settings-ln-address.tsx | 68 +- .../sections/settings/view/settings-view.tsx | 31 +- .../sections/transaction/invoice-details.tsx | 27 +- .../sections/transaction/payment-details.tsx | 23 +- .../transaction/recent-transactions.tsx | 35 +- .../sections/transaction/transaction-list.tsx | 94 +- .../transaction-table-filters-result.tsx | 22 +- .../transaction/transaction-table-row.tsx | 45 +- .../transaction/transaction-table-toolbar.tsx | 20 +- .../transaction/transaction-toolbar.tsx | 11 +- .../view/admin-invoice-details-view.tsx | 2 +- .../view/admin-invoice-list-view.tsx | 11 +- .../view/admin-payment-details-view.tsx | 2 +- .../view/admin-payment-list-view.tsx | 11 +- .../transaction/view/invoice-list-view.tsx | 13 +- .../transaction/view/payment-list-view.tsx | 19 +- .../src/sections/wallet/balance-overview.tsx | 57 +- dashboard/src/sections/wallet/contacts.tsx | 8 +- .../src/sections/wallet/current-balance.tsx | 35 +- .../sections/wallet/view/wallet-list-view.tsx | 16 +- .../src/sections/wallet/view/wallet-view.tsx | 38 +- dashboard/src/sections/wallet/wallet-list.tsx | 62 +- .../wallet/wallet-table-filters-result.tsx | 15 +- .../src/sections/wallet/wallet-table-row.tsx | 49 +- .../sections/wallet/wallet-table-toolbar.tsx | 5 +- dashboard/src/theme/color-scheme-script.ts | 14 - dashboard/src/theme/core/colors.json | 66 - .../src/theme/core/components/accordion.tsx | 2 +- dashboard/src/theme/core/components/alert.tsx | 20 +- .../theme/core/components/autocomplete.tsx | 8 +- .../src/theme/core/components/avatar.tsx | 47 +- .../src/theme/core/components/backdrop.tsx | 2 +- dashboard/src/theme/core/components/badge.tsx | 131 +- .../src/theme/core/components/breadcrumbs.tsx | 1 - .../src/theme/core/components/button-fab.tsx | 99 +- .../theme/core/components/button-group.tsx | 54 +- .../theme/core/components/button-toggle.tsx | 22 +- .../src/theme/core/components/button.tsx | 65 +- dashboard/src/theme/core/components/card.tsx | 8 +- .../src/theme/core/components/checkbox.tsx | 6 +- dashboard/src/theme/core/components/chip.tsx | 57 +- .../src/theme/core/components/dialog.tsx | 12 +- .../src/theme/core/components/drawer.tsx | 14 +- dashboard/src/theme/core/components/list.tsx | 6 +- dashboard/src/theme/core/components/menu.tsx | 4 +- .../theme/core/components/mui-x-data-grid.tsx | 196 +- .../core/components/mui-x-date-picker.tsx | 18 +- .../src/theme/core/components/pagination.tsx | 61 +- dashboard/src/theme/core/components/paper.tsx | 2 +- .../src/theme/core/components/popover.tsx | 4 +- .../src/theme/core/components/progress.tsx | 6 +- dashboard/src/theme/core/components/radio.tsx | 10 +- .../src/theme/core/components/rating.tsx | 6 +- .../src/theme/core/components/skeleton.tsx | 2 +- .../src/theme/core/components/slider.tsx | 93 +- .../src/theme/core/components/switch.tsx | 15 +- dashboard/src/theme/core/components/table.tsx | 8 +- dashboard/src/theme/core/components/tabs.tsx | 10 +- .../src/theme/core/components/textfield.tsx | 27 +- .../src/theme/core/components/tooltip.tsx | 10 +- .../src/theme/core/components/typography.tsx | 5 +- dashboard/src/theme/core/custom-shadows.ts | 37 +- dashboard/src/theme/core/index.ts | 2 + dashboard/src/theme/core/mixins/background.ts | 92 + dashboard/src/theme/core/mixins/border.ts | 42 + .../core/mixins/global-styles-components.ts | 93 + .../theme/{styles => core/mixins}/index.ts | 2 - dashboard/src/theme/core/mixins/mixins.ts | 46 + dashboard/src/theme/core/mixins/text.ts | 104 + dashboard/src/theme/core/palette.ts | 188 +- dashboard/src/theme/core/shadows.ts | 12 +- dashboard/src/theme/core/typography.ts | 67 +- dashboard/src/theme/create-classes.ts | 7 + dashboard/src/theme/create-theme.ts | 133 +- dashboard/src/theme/extend-theme-types.d.ts | 193 + dashboard/src/theme/index.ts | 7 + dashboard/src/theme/overrides-theme.ts | 26 - dashboard/src/theme/styles/mixins.ts | 247 - dashboard/src/theme/styles/utils.ts | 98 - dashboard/src/theme/theme-config.ts | 118 + dashboard/src/theme/theme-overrides.ts | 36 + dashboard/src/theme/theme-provider.tsx | 39 +- dashboard/src/theme/types.ts | 44 +- .../src/theme/with-settings/color-presets.ts | 107 + dashboard/src/theme/with-settings/index.ts | 7 + .../theme/with-settings/primary-color.json | 42 - .../src/theme/with-settings/right-to-left.tsx | 14 +- .../theme/with-settings/update-components.ts | 68 + .../src/theme/with-settings/update-core.ts | 85 + .../src/theme/with-settings/update-theme.ts | 110 - dashboard/src/types/apikey.ts | 1 - dashboard/src/types/common.ts | 2 - dashboard/src/types/ln-address.ts | 1 - dashboard/src/types/transaction.ts | 1 - dashboard/src/types/wallet.ts | 1 - dashboard/src/utils/ajv.ts | 5 - dashboard/src/utils/change-case.ts | 23 - dashboard/src/utils/errors.ts | 26 +- dashboard/src/utils/fiat.ts | 6 +- dashboard/src/utils/format-number.ts | 33 - dashboard/src/utils/format-string.ts | 4 +- dashboard/src/utils/format-time.ts | 201 +- dashboard/src/utils/helper.ts | 130 - dashboard/src/utils/lnurl.ts | 6 +- dashboard/src/utils/storage-available.ts | 24 - dashboard/src/utils/transactions.ts | 24 +- dashboard/src/utils/with-loading-props.tsx | 19 - dashboard/tsconfig.json | 44 +- dashboard/yarn.lock | 4650 +++++------------ src/application/dtos/ln_address.rs | 10 +- src/application/errors/database_error.rs | 3 - src/application/errors/lightning_error.rs | 4 +- src/domains/invoice/invoice_repository.rs | 13 +- src/domains/invoice/invoice_service.rs | 4 +- src/domains/ln_node/ln_events_service.rs | 2 +- src/domains/lnurl/lnurl_service.rs | 2 +- src/domains/payment/payments_service.rs | 54 +- src/domains/system/system_handler.rs | 4 +- src/domains/wallet/entities/balance.rs | 11 + src/domains/wallet/entities/wallet.rs | 6 +- src/domains/wallet/user_wallet_handler.rs | 15 +- src/infra/database/sea_orm/models/balance.rs | 8 - src/infra/database/sea_orm/models/mod.rs | 1 - .../sea_orm/models/wallet_overview.rs | 17 +- .../sea_orm_api_key_repository.rs | 8 +- .../sea_orm_invoice_repository.rs | 51 +- .../repositories/sea_orm_wallet_repository.rs | 170 +- src/infra/database/sea_orm/types.rs | 32 +- src/infra/lightning/lnd/lnd_rest_client.rs | 81 +- 853 files changed, 19300 insertions(+), 21113 deletions(-) delete mode 100644 dashboard/.eslintignore delete mode 100644 dashboard/.eslintrc.js delete mode 100644 dashboard/.gitattributes create mode 100644 dashboard/eslint.config.mjs create mode 100644 dashboard/knip.jsonc delete mode 100644 dashboard/public/assets/cyan-blur.png rename dashboard/public/assets/icons/components/{ic-pickers.svg => ic-date-pickers.svg} (98%) create mode 100644 dashboard/public/assets/icons/components/ic-drawer.svg create mode 100644 dashboard/public/assets/icons/components/ic-extra-layout.svg delete mode 100644 dashboard/public/assets/icons/flagpack/ad.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ae.webp delete mode 100644 dashboard/public/assets/icons/flagpack/af.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ag.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ai.webp delete mode 100644 dashboard/public/assets/icons/flagpack/al.webp delete mode 100644 dashboard/public/assets/icons/flagpack/am.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ao.webp delete mode 100644 dashboard/public/assets/icons/flagpack/aq.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ar.webp delete mode 100644 dashboard/public/assets/icons/flagpack/as.webp delete mode 100644 dashboard/public/assets/icons/flagpack/at.webp delete mode 100644 dashboard/public/assets/icons/flagpack/au.webp delete mode 100644 dashboard/public/assets/icons/flagpack/aw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ax.webp delete mode 100644 dashboard/public/assets/icons/flagpack/az.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ba.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bb.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bd.webp delete mode 100644 dashboard/public/assets/icons/flagpack/be.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bh.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bi.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bj.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bl.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bo.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bq-bo.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bq-sa.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bq-se.webp delete mode 100644 dashboard/public/assets/icons/flagpack/br.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bs.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bt.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bv.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/by.webp delete mode 100644 dashboard/public/assets/icons/flagpack/bz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ca.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cc.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cd.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ch.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ci.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ck.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cl.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/co.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cu.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cv.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cx.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cy.webp delete mode 100644 dashboard/public/assets/icons/flagpack/cz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/de.webp delete mode 100644 dashboard/public/assets/icons/flagpack/dj.webp delete mode 100644 dashboard/public/assets/icons/flagpack/dk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/dm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/do.webp delete mode 100644 dashboard/public/assets/icons/flagpack/dz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ec.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ee.webp delete mode 100644 dashboard/public/assets/icons/flagpack/eg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/eh.webp delete mode 100644 dashboard/public/assets/icons/flagpack/er.webp delete mode 100644 dashboard/public/assets/icons/flagpack/es.webp delete mode 100644 dashboard/public/assets/icons/flagpack/et.webp delete mode 100644 dashboard/public/assets/icons/flagpack/fi.webp delete mode 100644 dashboard/public/assets/icons/flagpack/fj.webp delete mode 100644 dashboard/public/assets/icons/flagpack/fk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/fm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/fo.webp delete mode 100644 dashboard/public/assets/icons/flagpack/fr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ga.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gb-eng.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gb-nir.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gb-sct.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gb-wls.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gb.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gd.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ge.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gh.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gi.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gl.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gp.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gq.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gs.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gt.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gu.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/gy.webp delete mode 100644 dashboard/public/assets/icons/flagpack/hk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/hm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/hn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/hr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ht.webp delete mode 100644 dashboard/public/assets/icons/flagpack/hu.webp delete mode 100644 dashboard/public/assets/icons/flagpack/id.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ie.webp delete mode 100644 dashboard/public/assets/icons/flagpack/il.webp delete mode 100644 dashboard/public/assets/icons/flagpack/im.webp delete mode 100644 dashboard/public/assets/icons/flagpack/in.webp delete mode 100644 dashboard/public/assets/icons/flagpack/io.webp delete mode 100644 dashboard/public/assets/icons/flagpack/iq.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ir.webp delete mode 100644 dashboard/public/assets/icons/flagpack/is.webp delete mode 100644 dashboard/public/assets/icons/flagpack/it.webp delete mode 100644 dashboard/public/assets/icons/flagpack/je.webp delete mode 100644 dashboard/public/assets/icons/flagpack/jm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/jo.webp delete mode 100644 dashboard/public/assets/icons/flagpack/jp.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ke.webp delete mode 100644 dashboard/public/assets/icons/flagpack/kg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/kh.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ki.webp delete mode 100644 dashboard/public/assets/icons/flagpack/km.webp delete mode 100644 dashboard/public/assets/icons/flagpack/kn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/kp.webp delete mode 100644 dashboard/public/assets/icons/flagpack/kr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/kw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ky.webp delete mode 100644 dashboard/public/assets/icons/flagpack/kz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/la.webp delete mode 100644 dashboard/public/assets/icons/flagpack/lb.webp delete mode 100644 dashboard/public/assets/icons/flagpack/lc.webp delete mode 100644 dashboard/public/assets/icons/flagpack/li.webp delete mode 100644 dashboard/public/assets/icons/flagpack/lk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/lr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ls.webp delete mode 100644 dashboard/public/assets/icons/flagpack/lt.webp delete mode 100644 dashboard/public/assets/icons/flagpack/lu.webp delete mode 100644 dashboard/public/assets/icons/flagpack/lv.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ly.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ma.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mc.webp delete mode 100644 dashboard/public/assets/icons/flagpack/md.webp delete mode 100644 dashboard/public/assets/icons/flagpack/me.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mh.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ml.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mo.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mp.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mq.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ms.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mt.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mu.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mv.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mx.webp delete mode 100644 dashboard/public/assets/icons/flagpack/my.webp delete mode 100644 dashboard/public/assets/icons/flagpack/mz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/na.webp delete mode 100644 dashboard/public/assets/icons/flagpack/nc.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ne.webp delete mode 100644 dashboard/public/assets/icons/flagpack/nf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ng.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ni.webp delete mode 100644 dashboard/public/assets/icons/flagpack/nl.webp delete mode 100644 dashboard/public/assets/icons/flagpack/no.webp delete mode 100644 dashboard/public/assets/icons/flagpack/np.webp delete mode 100644 dashboard/public/assets/icons/flagpack/nr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/nu.webp delete mode 100644 dashboard/public/assets/icons/flagpack/nz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/om.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pa.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pe.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ph.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pl.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ps.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pt.webp delete mode 100644 dashboard/public/assets/icons/flagpack/pw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/py.webp delete mode 100644 dashboard/public/assets/icons/flagpack/qa.webp delete mode 100644 dashboard/public/assets/icons/flagpack/re.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ro.webp delete mode 100644 dashboard/public/assets/icons/flagpack/rs.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ru.webp delete mode 100644 dashboard/public/assets/icons/flagpack/rw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sa.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sb.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sc.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sd.webp delete mode 100644 dashboard/public/assets/icons/flagpack/se.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sh.webp delete mode 100644 dashboard/public/assets/icons/flagpack/si.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sj.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sl.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/so.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ss.webp delete mode 100644 dashboard/public/assets/icons/flagpack/st.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sv.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sx.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sy.webp delete mode 100644 dashboard/public/assets/icons/flagpack/sz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tc.webp delete mode 100644 dashboard/public/assets/icons/flagpack/td.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/th.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tj.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tl.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/to.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tr.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tt.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tv.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tw.webp delete mode 100644 dashboard/public/assets/icons/flagpack/tz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ua.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ug.webp delete mode 100644 dashboard/public/assets/icons/flagpack/um.webp delete mode 100644 dashboard/public/assets/icons/flagpack/us.webp delete mode 100644 dashboard/public/assets/icons/flagpack/uy.webp delete mode 100644 dashboard/public/assets/icons/flagpack/uz.webp delete mode 100644 dashboard/public/assets/icons/flagpack/va.webp delete mode 100644 dashboard/public/assets/icons/flagpack/vc.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ve.webp delete mode 100644 dashboard/public/assets/icons/flagpack/vg.webp delete mode 100644 dashboard/public/assets/icons/flagpack/vi.webp delete mode 100644 dashboard/public/assets/icons/flagpack/vn.webp delete mode 100644 dashboard/public/assets/icons/flagpack/vu.webp delete mode 100644 dashboard/public/assets/icons/flagpack/wf.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ws.webp delete mode 100644 dashboard/public/assets/icons/flagpack/xk.webp delete mode 100644 dashboard/public/assets/icons/flagpack/ye.webp delete mode 100644 dashboard/public/assets/icons/flagpack/yt.webp delete mode 100644 dashboard/public/assets/icons/flagpack/za.webp delete mode 100644 dashboard/public/assets/icons/flagpack/zm.webp delete mode 100644 dashboard/public/assets/icons/flagpack/zw.webp delete mode 100644 dashboard/public/assets/icons/platforms/ic-auth0.svg delete mode 100644 dashboard/public/assets/icons/platforms/ic-jwt.svg delete mode 100644 dashboard/public/assets/icons/platforms/ic-supabase.svg delete mode 100644 dashboard/public/assets/icons/setting/ic-align-left.svg delete mode 100644 dashboard/public/assets/icons/setting/ic-collapse.svg delete mode 100644 dashboard/public/assets/icons/setting/ic-contrast-bold.svg delete mode 100644 dashboard/public/assets/icons/setting/ic-exit-full-screen.svg delete mode 100644 dashboard/public/assets/icons/setting/ic-full-screen.svg delete mode 100644 dashboard/public/assets/icons/setting/ic-sidebar.svg delete mode 100644 dashboard/public/assets/icons/setting/ic-sun.svg delete mode 100644 dashboard/public/assets/icons/setting/ic_moon.svg delete mode 100644 dashboard/public/assets/icons/setting/ic_setting.svg delete mode 100644 dashboard/public/assets/icons/setting/ic_sun.svg rename dashboard/public/assets/icons/{setting => settings}/ic-align-right.svg (100%) rename dashboard/public/assets/icons/{setting => settings}/ic-autofit-width.svg (100%) rename dashboard/public/assets/icons/{setting => settings}/ic-contrast.svg (100%) rename dashboard/public/assets/icons/{setting => settings}/ic-font.svg (100%) rename dashboard/public/assets/icons/{setting => settings}/ic-moon.svg (100%) create mode 100644 dashboard/public/assets/icons/settings/ic-nav-horizontal.svg create mode 100644 dashboard/public/assets/icons/settings/ic-nav-mini.svg create mode 100644 dashboard/public/assets/icons/settings/ic-nav-vertical.svg rename dashboard/public/assets/icons/{setting => settings}/ic-sidebar-filled.svg (100%) rename dashboard/public/assets/icons/{setting => settings}/ic-sidebar-outline.svg (100%) rename dashboard/public/assets/icons/{setting => settings}/ic-siderbar-duotone.svg (100%) delete mode 100644 dashboard/public/assets/placeholder.svg delete mode 100644 dashboard/public/assets/red-blur.png delete mode 100644 dashboard/public/assets/transparent.png create mode 100644 dashboard/src/app/error.tsx create mode 100644 dashboard/src/assets/icons/social-icons.tsx create mode 100644 dashboard/src/assets/illustrations/server-error-illustration.tsx create mode 100644 dashboard/src/auth/components/form-divider.tsx create mode 100644 dashboard/src/auth/components/form-head.tsx create mode 100644 dashboard/src/auth/components/form-resend-code.tsx create mode 100644 dashboard/src/auth/components/form-return-link.tsx create mode 100644 dashboard/src/auth/components/form-socials.tsx create mode 100644 dashboard/src/auth/components/sign-up-terms.tsx create mode 100644 dashboard/src/auth/utils/error-message.ts create mode 100644 dashboard/src/auth/utils/index.ts rename dashboard/src/{sections/auth => auth/view}/auth0/auth0-sign-in-view.tsx (84%) rename dashboard/src/{sections/auth => auth/view}/auth0/index.ts (100%) rename dashboard/src/{sections/auth => auth/view}/jwt/index.ts (100%) create mode 100644 dashboard/src/auth/view/jwt/jwt-sign-in-view.tsx create mode 100644 dashboard/src/auth/view/jwt/jwt-sign-up-view.tsx rename dashboard/src/{sections/auth => auth/view}/supabase/index.ts (100%) create mode 100644 dashboard/src/auth/view/supabase/supabase-reset-password-view.tsx rename dashboard/src/{sections/auth => auth/view}/supabase/supabase-sign-in-view.tsx (52%) create mode 100644 dashboard/src/auth/view/supabase/supabase-sign-up-view.tsx create mode 100644 dashboard/src/auth/view/supabase/supabase-update-password-view.tsx create mode 100644 dashboard/src/auth/view/supabase/supabase-verify-view.tsx delete mode 100644 dashboard/src/components/carousel/breakpoints.ts create mode 100644 dashboard/src/components/carousel/components/arrow-button.tsx delete mode 100644 dashboard/src/components/carousel/components/carousel-dot-buttons.tsx delete mode 100644 dashboard/src/components/carousel/components/carousel-progress-bar.tsx delete mode 100644 dashboard/src/components/carousel/components/carousel-thumbs.tsx create mode 100644 dashboard/src/components/carousel/components/index.ts delete mode 100644 dashboard/src/components/carousel/hooks/use-carousel-auto-play.ts delete mode 100644 dashboard/src/components/carousel/hooks/use-carousel-auto-scroll.ts create mode 100644 dashboard/src/components/carousel/utils.ts delete mode 100644 dashboard/src/components/chart/chart-legends.tsx delete mode 100644 dashboard/src/components/chart/chart-loading.tsx delete mode 100644 dashboard/src/components/chart/chart-select.tsx create mode 100644 dashboard/src/components/chart/classes.ts create mode 100644 dashboard/src/components/chart/components/chart-loading.tsx create mode 100644 dashboard/src/components/chart/components/index.ts delete mode 100644 dashboard/src/components/color-utils/color-picker.tsx delete mode 100644 dashboard/src/components/color-utils/color-preview.tsx delete mode 100644 dashboard/src/components/color-utils/index.ts delete mode 100644 dashboard/src/components/color-utils/types.ts delete mode 100644 dashboard/src/components/country-select/utils.ts create mode 100644 dashboard/src/components/custom-breadcrumbs/back-link.tsx create mode 100644 dashboard/src/components/custom-breadcrumbs/more-links.tsx create mode 100644 dashboard/src/components/custom-breadcrumbs/styles.ts delete mode 100644 dashboard/src/components/custom-breadcrumbs/types.ts delete mode 100644 dashboard/src/components/custom-date-range-picker/custom-date-range-picker.tsx delete mode 100644 dashboard/src/components/custom-date-range-picker/index.ts delete mode 100644 dashboard/src/components/custom-date-range-picker/types.ts delete mode 100644 dashboard/src/components/custom-date-range-picker/use-date-range-picker.ts delete mode 100644 dashboard/src/components/custom-popover/use-popover.ts delete mode 100644 dashboard/src/components/file-thumbnail/action-buttons.tsx delete mode 100644 dashboard/src/components/file-thumbnail/classes.ts delete mode 100644 dashboard/src/components/file-thumbnail/file-thumbnail.tsx delete mode 100644 dashboard/src/components/file-thumbnail/index.ts delete mode 100644 dashboard/src/components/file-thumbnail/types.ts delete mode 100644 dashboard/src/components/file-thumbnail/utils.ts create mode 100644 dashboard/src/components/flag-icon/classes.ts create mode 100644 dashboard/src/components/flag-icon/flag-icon.tsx create mode 100644 dashboard/src/components/flag-icon/index.ts create mode 100644 dashboard/src/components/hook-form/help-text.tsx create mode 100644 dashboard/src/components/hook-form/rhf-number-input.tsx delete mode 100644 dashboard/src/components/hook-form/rhf-phone-input.tsx delete mode 100644 dashboard/src/components/hook-form/rhf-wallet-select.tsx delete mode 100644 dashboard/src/components/hook-form/schema-helper.ts delete mode 100644 dashboard/src/components/iconify/flag-icon.tsx delete mode 100644 dashboard/src/components/iconify/social-icon.tsx delete mode 100644 dashboard/src/components/iconify/types.ts delete mode 100644 dashboard/src/components/image/classes.ts delete mode 100644 dashboard/src/components/image/image.tsx delete mode 100644 dashboard/src/components/image/index.ts delete mode 100644 dashboard/src/components/image/styles.css delete mode 100644 dashboard/src/components/image/types.ts delete mode 100644 dashboard/src/components/image/utils.ts delete mode 100644 dashboard/src/components/label/styles.ts create mode 100644 dashboard/src/components/label/styles.tsx delete mode 100644 dashboard/src/components/markdown/classes.ts delete mode 100644 dashboard/src/components/markdown/code-highlight-block.css delete mode 100644 dashboard/src/components/markdown/html-tags.ts delete mode 100644 dashboard/src/components/markdown/html-to-markdown.ts delete mode 100644 dashboard/src/components/markdown/index.ts delete mode 100644 dashboard/src/components/markdown/markdown.tsx delete mode 100644 dashboard/src/components/markdown/styles.ts delete mode 100644 dashboard/src/components/markdown/types.ts delete mode 100644 dashboard/src/components/nav-basic/classes.ts delete mode 100644 dashboard/src/components/nav-basic/css-vars.ts delete mode 100644 dashboard/src/components/nav-basic/desktop/index.ts delete mode 100644 dashboard/src/components/nav-basic/desktop/nav-basic-desktop.tsx delete mode 100644 dashboard/src/components/nav-basic/desktop/nav-item.tsx delete mode 100644 dashboard/src/components/nav-basic/desktop/nav-list.tsx delete mode 100644 dashboard/src/components/nav-basic/index.ts delete mode 100644 dashboard/src/components/nav-basic/mobile/index.ts delete mode 100644 dashboard/src/components/nav-basic/mobile/nav-basic-mobile.tsx delete mode 100644 dashboard/src/components/nav-basic/mobile/nav-item.tsx delete mode 100644 dashboard/src/components/nav-basic/mobile/nav-list.tsx delete mode 100644 dashboard/src/components/nav-basic/types.ts delete mode 100644 dashboard/src/components/nav-section/classes.ts create mode 100644 dashboard/src/components/nav-section/components/index.ts create mode 100644 dashboard/src/components/nav-section/components/nav-collapse.tsx create mode 100644 dashboard/src/components/nav-section/components/nav-dropdown.tsx create mode 100644 dashboard/src/components/nav-section/components/nav-elements.tsx create mode 100644 dashboard/src/components/nav-section/components/nav-subheader.tsx delete mode 100644 dashboard/src/components/nav-section/styles.tsx create mode 100644 dashboard/src/components/nav-section/styles/classes.ts rename dashboard/src/components/nav-section/{ => styles}/css-vars.ts (74%) create mode 100644 dashboard/src/components/nav-section/styles/index.ts create mode 100644 dashboard/src/components/nav-section/styles/nav-item-styles.ts rename dashboard/src/components/nav-section/{hooks.tsx => utils/create-nav-item.ts} (66%) create mode 100644 dashboard/src/components/nav-section/utils/index.ts create mode 100644 dashboard/src/components/number-input/index.ts create mode 100644 dashboard/src/components/number-input/number-input.tsx create mode 100644 dashboard/src/components/number-input/styles.ts delete mode 100644 dashboard/src/components/phone-input/index.ts delete mode 100644 dashboard/src/components/phone-input/list.tsx delete mode 100644 dashboard/src/components/phone-input/phone-input.tsx delete mode 100644 dashboard/src/components/phone-input/types.ts delete mode 100644 dashboard/src/components/phone-input/utils.ts delete mode 100644 dashboard/src/components/settings/config-settings.ts create mode 100644 dashboard/src/components/settings/context/settings-context.ts create mode 100644 dashboard/src/components/settings/drawer/nav-layout-option.tsx delete mode 100644 dashboard/src/components/settings/drawer/nav-options.tsx create mode 100644 dashboard/src/components/settings/settings-config.ts delete mode 100644 dashboard/src/components/table/table-skeleton.tsx delete mode 100644 dashboard/src/components/table/types.ts create mode 100644 dashboard/src/components/wallet/select-wallet.tsx rename dashboard/src/{config-global.ts => global-config.ts} (67%) delete mode 100644 dashboard/src/hooks/use-boolean.ts delete mode 100644 dashboard/src/hooks/use-client-rect.ts delete mode 100644 dashboard/src/hooks/use-cookies.ts delete mode 100644 dashboard/src/hooks/use-copy-to-clipboard.ts delete mode 100644 dashboard/src/hooks/use-countdown.ts delete mode 100644 dashboard/src/hooks/use-debounce.ts delete mode 100644 dashboard/src/hooks/use-double-click.ts delete mode 100644 dashboard/src/hooks/use-event-listener.ts delete mode 100644 dashboard/src/hooks/use-local-storage.ts delete mode 100644 dashboard/src/hooks/use-negative-logo.ts delete mode 100644 dashboard/src/hooks/use-responsive.ts delete mode 100644 dashboard/src/hooks/use-scroll-offset-top.ts delete mode 100644 dashboard/src/hooks/use-set-state.ts delete mode 100644 dashboard/src/hooks/use-tabs.ts create mode 100644 dashboard/src/layouts/auth-centered/content.tsx delete mode 100644 dashboard/src/layouts/auth-centered/main.tsx create mode 100644 dashboard/src/layouts/auth-split/content.tsx delete mode 100644 dashboard/src/layouts/auth-split/main.tsx delete mode 100644 dashboard/src/layouts/classes.ts delete mode 100644 dashboard/src/layouts/config-nav-workspace.tsx create mode 100644 dashboard/src/layouts/core/classes.ts create mode 100644 dashboard/src/layouts/core/css-vars.ts delete mode 100644 dashboard/src/layouts/core/header-base.tsx create mode 100644 dashboard/src/layouts/core/index.ts create mode 100644 dashboard/src/layouts/core/main-section.tsx create mode 100644 dashboard/src/layouts/dashboard/content.tsx create mode 100644 dashboard/src/layouts/dashboard/css-vars.ts delete mode 100644 dashboard/src/layouts/dashboard/main.tsx rename dashboard/src/layouts/{config-nav-account.tsx => nav-config-account.tsx} (77%) rename dashboard/src/layouts/{config-nav-dashboard.tsx => nav-config-dashboard.tsx} (80%) create mode 100644 dashboard/src/layouts/nav-config-workspace.tsx create mode 100644 dashboard/src/layouts/simple/content.tsx delete mode 100644 dashboard/src/layouts/simple/main.tsx delete mode 100644 dashboard/src/lib/swissknife/schemas.gen.ts rename dashboard/src/lib/swissknife/{services.gen.ts => sdk.gen.ts} (54%) create mode 100644 dashboard/src/lib/swissknife/transformers.gen.ts create mode 100644 dashboard/src/lib/swissknife/zod.gen.ts rename dashboard/src/locales/{config-locales.ts => locales-config.ts} (50%) delete mode 100644 dashboard/src/routes/hooks/use-active-link.ts delete mode 100644 dashboard/src/routes/utils.ts delete mode 100644 dashboard/src/sections/auth/jwt/jwt-sign-in-view.tsx delete mode 100644 dashboard/src/sections/auth/jwt/jwt-sign-up-view.tsx delete mode 100644 dashboard/src/sections/auth/supabase/supabase-reset-password-view.tsx delete mode 100644 dashboard/src/sections/auth/supabase/supabase-sign-up-view.tsx delete mode 100644 dashboard/src/sections/auth/supabase/supabase-update-password-view.tsx delete mode 100644 dashboard/src/sections/auth/supabase/supabase-verify-view.tsx rename dashboard/src/sections/error/{403-view.tsx => 500-view.tsx} (64%) delete mode 100644 dashboard/src/theme/color-scheme-script.ts delete mode 100644 dashboard/src/theme/core/colors.json create mode 100644 dashboard/src/theme/core/mixins/background.ts create mode 100644 dashboard/src/theme/core/mixins/border.ts create mode 100644 dashboard/src/theme/core/mixins/global-styles-components.ts rename dashboard/src/theme/{styles => core/mixins}/index.ts (50%) create mode 100644 dashboard/src/theme/core/mixins/mixins.ts create mode 100644 dashboard/src/theme/core/mixins/text.ts create mode 100644 dashboard/src/theme/create-classes.ts create mode 100644 dashboard/src/theme/extend-theme-types.d.ts create mode 100644 dashboard/src/theme/index.ts delete mode 100644 dashboard/src/theme/overrides-theme.ts delete mode 100644 dashboard/src/theme/styles/mixins.ts delete mode 100644 dashboard/src/theme/styles/utils.ts create mode 100644 dashboard/src/theme/theme-config.ts create mode 100644 dashboard/src/theme/theme-overrides.ts create mode 100644 dashboard/src/theme/with-settings/color-presets.ts create mode 100644 dashboard/src/theme/with-settings/index.ts delete mode 100644 dashboard/src/theme/with-settings/primary-color.json create mode 100644 dashboard/src/theme/with-settings/update-components.ts create mode 100644 dashboard/src/theme/with-settings/update-core.ts delete mode 100644 dashboard/src/theme/with-settings/update-theme.ts delete mode 100644 dashboard/src/utils/ajv.ts delete mode 100644 dashboard/src/utils/change-case.ts delete mode 100644 dashboard/src/utils/helper.ts delete mode 100644 dashboard/src/utils/storage-available.ts delete mode 100644 dashboard/src/utils/with-loading-props.tsx delete mode 100644 src/infra/database/sea_orm/models/balance.rs diff --git a/.DS_Store b/.DS_Store index bbf79e00e6e0972333602a2fa1e02eba075f2972..c03b753a9e0fe50e2c4b00ea23fe801b505e1710 100644 GIT binary patch delta 107 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5sJ6q~50$SAupU^g?P>|`E+>dn&yLzpKf t>nvvH;1Fa6DgpulZXn?bQok|rJM(0I8BdUI1}2C}Aj26p$Mei#1^~}U5itM& delta 387 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8FDWo2aMAsJby=H}hr%jz7$c**Q2S7O*g? zPUc~$u4iY^V<=-NW=LkpXGmd4%}F;5PR`FQ0BQvSMoA!nrXn}r#U&{xKM5$q!Jz$m z4#)hXj@VSC5TU9dqaN8h0iZbytU#xvG88eCFchOYM(`G@EV4tMif=q&@)7J1B>lPh z2uEO7QNWjh>;Qw!%`6ejOpFd26Q!61nL*A01|v6+a0LbBWo6TL1t6 diff --git a/.gitignore b/.gitignore index 6a49bfed..87675098 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,4 @@ certs/ # Local storage files storage/* -deps/lightningd/data +deps/lightningd diff --git a/Cargo.toml b/Cargo.toml index b672a4eb..022bb8a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ sea-orm = { version = "1.0", features = [ "macros", "with-chrono", "with-uuid", + "debug-print", ] } strum = "0.26" strum_macros = "0.26" diff --git a/Makefile b/Makefile index 8a84d8c2..d1edff07 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ install-tools: @cargo install cargo-outdated generate-models: - @sea-orm-cli generate entity --output-dir src/infra/database/sea_orm/models + @sea-orm-cli generate entity --output-dir src/infra/database/sea_orm/models2 generate-certs: @mkdir -p certs diff --git a/config/default.toml b/config/default.toml index 4b66d776..3919e828 100644 --- a/config/default.toml +++ b/config/default.toml @@ -92,4 +92,4 @@ max_connections = 10 min_connections = 0 acquire_timeout = "5s" connect_timeout = "30s" -sqlx_logging = true +sqlx_logging = false diff --git a/dashboard/.env.example b/dashboard/.env.example index 14cf53fe..09423801 100755 --- a/dashboard/.env.example +++ b/dashboard/.env.example @@ -1,11 +1,10 @@ LN_PROVIDER=breez # App -NEXT_PUBLIC_BASE_PATH= NEXT_PUBLIC_SERVER_URL= -NEXT_PUBLIC_ASSET_URL= +NEXT_PUBLIC_ASSETS_DIR= NEXT_PUBLIC_AUTH_METHOD= -NEXT_PUBLIC_SITENAME= +NEXT_PUBLIC_APPNAME= # Auth0 NEXT_PUBLIC_AUTH0_DOMAIN= diff --git a/dashboard/.env.production b/dashboard/.env.production index b015dcca..2bc8ccac 100755 --- a/dashboard/.env.production +++ b/dashboard/.env.production @@ -3,7 +3,7 @@ LN_PROVIDER=cln # App NEXT_PUBLIC_SERVER_URL=https://api.numeraire.tech NEXT_PUBLIC_AUTH_METHOD=auth0 -NEXT_PUBLIC_SITENAME="Numeraire Dashboard" +NEXT_PUBLIC_APPNAME="Numeraire Dashboard" # Auth0 NEXT_PUBLIC_AUTH0_DOMAIN=auth.numeraire.tech diff --git a/dashboard/.eslintignore b/dashboard/.eslintignore deleted file mode 100644 index d0cc6ac4..00000000 --- a/dashboard/.eslintignore +++ /dev/null @@ -1,48 +0,0 @@ -# Build directories - -build/_ -dist/_ -public/_ -\*\*/out/_ -**/.next/\* -**/node_modules/\* - -# src/ - -**/reportWebVitals.\* -**/service-worker._ -\*\*/serviceWorkerRegistration._ \*_/setupTests._ - -# eslintrc - -\*_/.eslintrc._ - -# prettier - -**/.prettier.\* -**/prettier.config.\* - -# next - -\*_/next.config._ - -# vite - -\*_/vite.config._ - -# tailwind - -**/postcss.config.\* -**/tailwind.config.\* - -# craco - -\*_/craco.config._ - -# misc - -\*\*/jsconfig.json - -# openapi - -src/lib/swissknife/types.gen.ts diff --git a/dashboard/.eslintrc.js b/dashboard/.eslintrc.js deleted file mode 100644 index 270ed58b..00000000 --- a/dashboard/.eslintrc.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @type {import('eslint').ESLint.ConfigData} - */ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - plugins: ['perfectionist', 'unused-imports', '@typescript-eslint', 'prettier'], - extends: ['airbnb', 'airbnb-typescript', 'airbnb/hooks', 'prettier'], - parserOptions: { - sourceType: 'module', - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - project: './tsconfig.json', - }, - settings: { - 'import/resolver': { - typescript: { - project: './tsconfig.json', - }, - }, - }, - /** - * 0 ~ 'off' - * 1 ~ 'warn' - * 2 ~ 'error' - */ - rules: { - // general - 'no-alert': 0, - camelcase: 0, - 'no-console': 0, - 'no-unused-vars': 0, - 'no-nested-ternary': 0, - 'no-param-reassign': 0, - 'no-underscore-dangle': 0, - 'no-restricted-exports': 0, - 'no-promise-executor-return': 0, - 'import/prefer-default-export': 0, - 'prefer-destructuring': [1, { object: true, array: false }], - // typescript - '@typescript-eslint/naming-convention': 0, - '@typescript-eslint/no-use-before-define': 0, - '@typescript-eslint/consistent-type-exports': 1, - '@typescript-eslint/consistent-type-imports': 1, - '@typescript-eslint/no-unused-vars': [1, { args: 'none' }], - // react - 'react/no-children-prop': 0, - 'react/react-in-jsx-scope': 0, - 'react/no-array-index-key': 0, - 'react/require-default-props': 0, - 'react/jsx-props-no-spreading': 0, - 'react/function-component-definition': 0, - 'react/jsx-no-useless-fragment': [1, { allowExpressions: true }], - 'react/no-unstable-nested-components': [1, { allowAsProps: true }], - 'react/jsx-no-duplicate-props': [1, { ignoreCase: false }], - // jsx-a11y - 'jsx-a11y/anchor-is-valid': 0, - 'jsx-a11y/control-has-associated-label': 0, - // unused imports - 'unused-imports/no-unused-imports': 1, - 'unused-imports/no-unused-vars': [ - 0, - { vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_' }, - ], - // perfectionist - 'perfectionist/sort-exports': [1, { order: 'asc', type: 'line-length' }], - 'perfectionist/sort-named-imports': [1, { order: 'asc', type: 'line-length' }], - 'perfectionist/sort-named-exports': [1, { order: 'asc', type: 'line-length' }], - 'perfectionist/sort-imports': [ - 1, - { - order: 'asc', - type: 'line-length', - 'newlines-between': 'always', - groups: [ - 'style', - 'type', - ['builtin', 'external'], - 'custom-mui', - 'custom-routes', - 'custom-hooks', - 'custom-utils', - 'internal', - 'custom-components', - 'custom-sections', - 'custom-auth', - 'custom-types', - ['parent', 'sibling', 'index'], - ['parent-type', 'sibling-type', 'index-type'], - 'object', - 'unknown', - ], - 'custom-groups': { - value: { - ['custom-mui']: '@mui/**', - ['custom-auth']: 'src/auth/**', - ['custom-hooks']: 'src/hooks/**', - ['custom-utils']: 'src/utils/**', - ['custom-types']: 'src/types/**', - ['custom-routes']: 'src/routes/**', - ['custom-sections']: 'src/sections/**', - ['custom-components']: 'src/components/**', - }, - }, - 'internal-pattern': ['src/**'], - }, - ], - }, -}; diff --git a/dashboard/.gitattributes b/dashboard/.gitattributes deleted file mode 100644 index af3ad128..00000000 --- a/dashboard/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -/.yarn/** linguist-vendored -/.yarn/releases/* binary -/.yarn/plugins/**/* binary -/.pnp.* binary linguist-generated diff --git a/dashboard/.gitignore b/dashboard/.gitignore index a177fa8b..e357f129 100644 --- a/dashboard/.gitignore +++ b/dashboard/.gitignore @@ -35,4 +35,4 @@ tsconfig.tsbuildinfo # Exclude PWA service worker and workbox files public/sw.js -public/workbox-*.js \ No newline at end of file +public/workbox-*.js diff --git a/dashboard/.yarn/install-state.gz b/dashboard/.yarn/install-state.gz index a0a65bf2e164bb60cdb7a4f8d458eaf9d87a4c3d..44cf410ede25f3a4a7d4483bfb3be000d35b2335 100644 GIT binary patch literal 905768 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�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