From 92c5e2ba0ef1538c38f1da5a5d26bb5402450470 Mon Sep 17 00:00:00 2001 From: Xavier Damman Date: Tue, 20 Aug 2024 16:00:19 +0200 Subject: [PATCH 1/3] update favicon, metadata, colors lib --- package.json | 3 ++- scripts/setup_dev.ts | 56 +++++++++++++++++++++++++++++++++++++++++++ src/app/favicon.ico | Bin 25931 -> 21354 bytes src/app/layout.tsx | 4 ++-- src/lib/colors.ts | 36 ++++++++++++++++++---------- 5 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 scripts/setup_dev.ts diff --git a/package.json b/package.json index 8eab2b1..1f4a3cd 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "community": "ts-node -r tsconfig-paths/register -P scripts/tsconfig.json scripts/run.ts", + "setup_dev": "ts-node -r tsconfig-paths/register -P scripts/tsconfig.json scripts/setup_dev.ts", "dev": "next dev", "build": "next build", "start": "ts-node -r tsconfig-paths/register -P scripts/tsconfig.json scripts/run_local.ts", @@ -70,4 +71,4 @@ "tsconfig-paths": "^4.2.0", "typescript": "^5" } -} +} \ No newline at end of file diff --git a/scripts/setup_dev.ts b/scripts/setup_dev.ts new file mode 100644 index 0000000..f357e2d --- /dev/null +++ b/scripts/setup_dev.ts @@ -0,0 +1,56 @@ +import { ethers } from "ethers"; +import { encrypt } from "@/utils/encrypt"; +import { generateBase64Key } from "@/utils/random"; +import { terminal as term } from "terminal-kit"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; + +function terminate() { + term.grabInput(false); + setTimeout(function () { + process.exit(); + }, 100); +} + +term.on("key", function (name: string, _: any, __: any) { + if (name === "CTRL_C") { + terminate(); + } +}); + +async function main() { + console.log("Hello"); + term.clear(); + + term.nextLine(2); + term("⏳ Creating .env file...\n"); + + // Read the file + let env = readFileSync(".env.example", "utf8"); + + const dbSecret = generateBase64Key(32); + env = env.replace("", dbSecret); + + // write .env + const filePath = process.cwd() + "/.env.local"; + term("\nWriting .env file...\n"); + + // write the file + writeFileSync(filePath, env); + + term(`✅ Created .env file on ${filePath}.\n`); + + const pk = ethers.Wallet.createRandom().privateKey.replace("0x", ""); + + const b64PK = btoa(pk); + + const encryptedKey = encrypt(b64PK, dbSecret); + + writeFileSync(".community/config/pk", encryptedKey); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/src/app/favicon.ico b/src/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..81fe0b907313e7ca65f66c606ee84219c92b8283 100644 GIT binary patch literal 21354 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

kwaAOl@M1@h*sHCqII+QXvOr*dQvze|gzC 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 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e46139e..70a0f13 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -12,8 +12,8 @@ const fontSans = FontSans({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Citizen Wallet Community Server", + description: "Dashboard for your community token", }; export default function RootLayout({ diff --git a/src/lib/colors.ts b/src/lib/colors.ts index cc19c76..83ce495 100644 --- a/src/lib/colors.ts +++ b/src/lib/colors.ts @@ -1,21 +1,33 @@ -function hexToRgb(hex: string): { r: number; g: number; b: number } { +function rgbToHex(r: number, g: number, b: number): string { + return ( + "#" + + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase() + ); +} + +export function darkenHexColor(hex: string, percent: number): string { + let [r, g, b] = hexToRgb(hex); + r = Math.max(0, Math.min(255, r - (r * percent) / 100)); + g = Math.max(0, Math.min(255, g - (g * percent) / 100)); + b = Math.max(0, Math.min(255, b - (b * percent) / 100)); + return rgbToHex(Math.round(r), Math.round(g), Math.round(b)); +} + +function hexToRgb(hex: string): [number, number, number] { hex = hex.replace(/^#/, ""); const bigint = parseInt(hex, 16); const r = (bigint >> 16) & 255; const g = (bigint >> 8) & 255; const b = bigint & 255; - return { r, g, b }; + return [r, g, b]; +} + +export function hexToRgba(hex: string, alpha?: number) { + const [r, g, b] = hexToRgb(hex); + return `rgba(${r}, ${g}, ${b}, ${alpha || 1})`; } -function getLuminance({ - r, - g, - b, -}: { - r: number; - g: number; - b: number; -}): number { +function getLuminance(r: number, g: number, b: number): number { const [R, G, B] = [r, g, b].map((v) => { v /= 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); @@ -26,7 +38,7 @@ function getLuminance({ // Returns the text color that should be used based on the luminosity of the background color export function getTextColor(hex: string): "black" | "white" { const rgb = hexToRgb(hex); - const luminance = getLuminance(rgb); + const luminance = getLuminance(...rgb); // Use a threshold of 0.5 for luminance return luminance > 0.5 ? "black" : "white"; } From 9ac3e501223f531e44c895ccf954b4bc331038a3 Mon Sep 17 00:00:00 2001 From: Xavier Damman Date: Tue, 20 Aug 2024 16:04:38 +0200 Subject: [PATCH 2/3] adding current version number when update available --- src/containers/Sidebar/index.tsx | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/containers/Sidebar/index.tsx b/src/containers/Sidebar/index.tsx index b14ac33..d4d5647 100644 --- a/src/containers/Sidebar/index.tsx +++ b/src/containers/Sidebar/index.tsx @@ -116,9 +116,14 @@ export default function Sidebar({ confirmText="Update" onConfirm={handleUpdate} > - + <> + + + Dashboard: v{VERSION} + + )} {!newVersion && ( @@ -176,9 +181,15 @@ export default function Sidebar({ confirmText="Update" onConfirm={handleUpdate} > - + <> + + + + Dashboard: v{VERSION} + + )} {!newVersion && ( From 34de4a5a23df81cda44a67f7c9144a28c162a532 Mon Sep 17 00:00:00 2001 From: Xavier Damman Date: Tue, 20 Aug 2024 16:27:04 +0200 Subject: [PATCH 3/3] fix status report for Wallet node process --- src/services/app/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/services/app/index.ts b/src/services/app/index.ts index a2af5aa..38402c2 100644 --- a/src/services/app/index.ts +++ b/src/services/app/index.ts @@ -34,7 +34,11 @@ export const downloadApp = () => { export const appProcessId = (): string | undefined => { try { - const command = "lsof -i :3002 -t"; + // for some reason, lsof -i :3002 doesn't return the node process + // we could use `fuser 3002/tcp` but it's not available on all systems + // the following command works on linux and mac + const command = + "ps -eo pid,args | grep 3002 | head -n 1 | awk '{print $1}'"; const pid = execSync(command).toString().trim(); return pid;