refactor: remove turborepo
@ -1,44 +0,0 @@
|
|||||||
# Dependencies
|
|
||||||
**/node_modules
|
|
||||||
.pnp
|
|
||||||
.pnp.js
|
|
||||||
|
|
||||||
# Local env files
|
|
||||||
.env
|
|
||||||
.env.local
|
|
||||||
.env.development.local
|
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
|
|
||||||
# Testing
|
|
||||||
coverage
|
|
||||||
|
|
||||||
# Turbo
|
|
||||||
.turbo
|
|
||||||
|
|
||||||
# Vercel
|
|
||||||
.vercel
|
|
||||||
|
|
||||||
# Build Outputs
|
|
||||||
**/.next/
|
|
||||||
**/out/
|
|
||||||
**/build
|
|
||||||
**/dist
|
|
||||||
**/target
|
|
||||||
|
|
||||||
|
|
||||||
# Debug
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
|
|
||||||
# Misc
|
|
||||||
.DS_Store
|
|
||||||
*.pem
|
|
||||||
|
|
||||||
# Unnecessary files
|
|
||||||
**/.git/
|
|
||||||
.github/
|
|
||||||
flatpak/*.xml
|
|
||||||
flatpak/*.desktop
|
|
||||||
flatpak/*.yml
|
|
56
.gitignore
vendored
@ -1,38 +1,26 @@
|
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
# Dependencies
|
|
||||||
node_modules
|
node_modules
|
||||||
.pnp
|
dist
|
||||||
.pnp.js
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
# Local env files
|
# Editor directories and files
|
||||||
.env
|
.vscode/*
|
||||||
.env.local
|
!.vscode/extensions.json
|
||||||
.env.development.local
|
.idea
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
|
|
||||||
# Testing
|
|
||||||
coverage/
|
|
||||||
|
|
||||||
# Turbo
|
|
||||||
.turbo/
|
|
||||||
|
|
||||||
# Vercel
|
|
||||||
.vercel/
|
|
||||||
|
|
||||||
# Build Outputs
|
|
||||||
.next/
|
|
||||||
out/
|
|
||||||
build/
|
|
||||||
dist/
|
|
||||||
|
|
||||||
|
|
||||||
# Debug
|
|
||||||
*.log.*
|
|
||||||
|
|
||||||
# Misc
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.pem
|
*.suo
|
||||||
.vscode/
|
*.ntvs*
|
||||||
.idea/
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
src/router.gen.ts
|
||||||
|
26
apps/desktop2/.gitignore
vendored
@ -1,26 +0,0 @@
|
|||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
pnpm-debug.log*
|
|
||||||
lerna-debug.log*
|
|
||||||
|
|
||||||
node_modules
|
|
||||||
dist
|
|
||||||
dist-ssr
|
|
||||||
*.local
|
|
||||||
|
|
||||||
# Editor directories and files
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/extensions.json
|
|
||||||
.idea
|
|
||||||
.DS_Store
|
|
||||||
*.suo
|
|
||||||
*.ntvs*
|
|
||||||
*.njsproj
|
|
||||||
*.sln
|
|
||||||
*.sw?
|
|
||||||
|
|
||||||
src/router.gen.ts
|
|
@ -1,60 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/desktop2",
|
|
||||||
"private": true,
|
|
||||||
"version": "0.0.0",
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "vite",
|
|
||||||
"build": "vite build",
|
|
||||||
"preview": "vite preview"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@getalby/bitcoin-connect-react": "^3.6.1",
|
|
||||||
"@lume/icons": "workspace:^",
|
|
||||||
"@lume/system": "workspace:^",
|
|
||||||
"@lume/ui": "workspace:^",
|
|
||||||
"@lume/utils": "workspace:^",
|
|
||||||
"@radix-ui/react-avatar": "^1.1.0",
|
|
||||||
"@radix-ui/react-checkbox": "^1.1.1",
|
|
||||||
"@radix-ui/react-popover": "^1.1.1",
|
|
||||||
"@radix-ui/react-scroll-area": "^1.1.0",
|
|
||||||
"@radix-ui/react-switch": "^1.1.0",
|
|
||||||
"@radix-ui/react-tabs": "^1.1.0",
|
|
||||||
"@radix-ui/react-tooltip": "^1.1.2",
|
|
||||||
"@tanstack/query-persist-client-core": "^5.51.21",
|
|
||||||
"@tanstack/react-query": "^5.51.23",
|
|
||||||
"@tanstack/react-router": "^1.47.1",
|
|
||||||
"embla-carousel-react": "^8.1.8",
|
|
||||||
"i18next": "^23.12.2",
|
|
||||||
"i18next-resources-to-backend": "^1.2.1",
|
|
||||||
"minidenticons": "^4.2.1",
|
|
||||||
"nanoid": "^5.0.7",
|
|
||||||
"nostr-tools": "^2.7.2",
|
|
||||||
"react": "^18.3.1",
|
|
||||||
"react-currency-input-field": "^3.8.0",
|
|
||||||
"react-dom": "^18.3.1",
|
|
||||||
"react-hook-form": "^7.52.2",
|
|
||||||
"react-i18next": "^15.0.1",
|
|
||||||
"react-string-replace": "^1.1.1",
|
|
||||||
"slate": "^0.103.0",
|
|
||||||
"slate-react": "^0.107.1",
|
|
||||||
"use-debounce": "^10.0.2",
|
|
||||||
"virtua": "^0.33.4"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@lume/tailwindcss": "workspace:^",
|
|
||||||
"@lume/tsconfig": "workspace:^",
|
|
||||||
"@lume/types": "workspace:^",
|
|
||||||
"@tanstack/router-devtools": "^1.47.1",
|
|
||||||
"@tanstack/router-vite-plugin": "^1.47.0",
|
|
||||||
"@types/react": "^18.3.3",
|
|
||||||
"@types/react-dom": "^18.3.0",
|
|
||||||
"@vitejs/plugin-react-swc": "^3.7.0",
|
|
||||||
"autoprefixer": "^10.4.20",
|
|
||||||
"postcss": "^8.4.41",
|
|
||||||
"tailwindcss": "^3.4.9",
|
|
||||||
"typescript": "^5.5.4",
|
|
||||||
"vite": "^5.4.0",
|
|
||||||
"vite-tsconfig-paths": "^5.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
|
|
||||||
import preset from "@lume/tailwindcss";
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
content: [
|
|
||||||
"./src/**/*.{js,ts,jsx,tsx}",
|
|
||||||
"../../packages/@columns/**/*{.js,.ts,.jsx,.tsx}",
|
|
||||||
"../../packages/ark/**/*{.js,.ts,.jsx,.tsx}",
|
|
||||||
"../../packages/ui/**/*{.js,.ts,.jsx,.tsx}",
|
|
||||||
"index.html",
|
|
||||||
],
|
|
||||||
presets: [preset],
|
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "@lume/tsconfig/base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"outDir": "dist",
|
|
||||||
"baseUrl": "./",
|
|
||||||
"paths": {
|
|
||||||
"@/*": ["./src/*"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"include": ["src"],
|
|
||||||
"exclude": ["node_modules", "dist"]
|
|
||||||
}
|
|
21
apps/web/.gitignore
vendored
@ -1,21 +0,0 @@
|
|||||||
# build output
|
|
||||||
dist/
|
|
||||||
# generated types
|
|
||||||
.astro/
|
|
||||||
|
|
||||||
# dependencies
|
|
||||||
node_modules/
|
|
||||||
|
|
||||||
# logs
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
pnpm-debug.log*
|
|
||||||
|
|
||||||
|
|
||||||
# environment variables
|
|
||||||
.env
|
|
||||||
.env.production
|
|
||||||
|
|
||||||
# macOS-specific files
|
|
||||||
.DS_Store
|
|
@ -1,47 +0,0 @@
|
|||||||
# Astro Starter Kit: Minimal
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm create astro@latest -- --template minimal
|
|
||||||
```
|
|
||||||
|
|
||||||
[](https://stackblitz.com/github/withastro/astro/tree/latest/examples/minimal)
|
|
||||||
[](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/minimal)
|
|
||||||
[](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/minimal/devcontainer.json)
|
|
||||||
|
|
||||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
|
||||||
|
|
||||||
## 🚀 Project Structure
|
|
||||||
|
|
||||||
Inside of your Astro project, you'll see the following folders and files:
|
|
||||||
|
|
||||||
```text
|
|
||||||
/
|
|
||||||
├── public/
|
|
||||||
├── src/
|
|
||||||
│ └── pages/
|
|
||||||
│ └── index.astro
|
|
||||||
└── package.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
|
||||||
|
|
||||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
|
|
||||||
|
|
||||||
Any static assets, like images, can be placed in the `public/` directory.
|
|
||||||
|
|
||||||
## 🧞 Commands
|
|
||||||
|
|
||||||
All commands are run from the root of the project, from a terminal:
|
|
||||||
|
|
||||||
| Command | Action |
|
|
||||||
| :------------------------ | :----------------------------------------------- |
|
|
||||||
| `npm install` | Installs dependencies |
|
|
||||||
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
|
||||||
| `npm run build` | Build your production site to `./dist/` |
|
|
||||||
| `npm run preview` | Preview your build locally, before deploying |
|
|
||||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
|
||||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
|
||||||
|
|
||||||
## 👀 Want to learn more?
|
|
||||||
|
|
||||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
|
|
@ -1,8 +0,0 @@
|
|||||||
import { defineConfig } from "astro/config";
|
|
||||||
|
|
||||||
import tailwind from "@astrojs/tailwind";
|
|
||||||
|
|
||||||
// https://astro.build/config
|
|
||||||
export default defineConfig({
|
|
||||||
integrations: [tailwind()],
|
|
||||||
});
|
|
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/web",
|
|
||||||
"type": "module",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "astro dev",
|
|
||||||
"start": "astro dev",
|
|
||||||
"build": "astro check && astro build",
|
|
||||||
"preview": "astro preview",
|
|
||||||
"astro": "astro"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@astrojs/check": "^0.9.2",
|
|
||||||
"@astrojs/tailwind": "^5.1.0",
|
|
||||||
"@fontsource/alice": "^5.0.13",
|
|
||||||
"astro": "^4.13.3",
|
|
||||||
"astro-seo-meta": "^4.1.1",
|
|
||||||
"astro-seo-schema": "^4.0.2",
|
|
||||||
"schema-dts": "^1.1.2",
|
|
||||||
"tailwindcss": "^3.4.9",
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@tailwindcss/typography": "^0.5.14"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 889 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 714 KiB |
Before Width: | Height: | Size: 318 KiB |
1
apps/web/src/env.d.ts
vendored
@ -1 +0,0 @@
|
|||||||
/// <reference types="astro/client" />
|
|
@ -1,98 +0,0 @@
|
|||||||
---
|
|
||||||
import { Seo } from "astro-seo-meta";
|
|
||||||
---
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
|
|
||||||
<meta name="viewport" content="width=device-width" />
|
|
||||||
<meta name="generator" content={Astro.generator} />
|
|
||||||
<title>Lume: The nostr client for desktop</title>
|
|
||||||
<Seo
|
|
||||||
title="Lume"
|
|
||||||
description="A friendly and scalable Nostr desktop client."
|
|
||||||
keywords={[
|
|
||||||
"nostr",
|
|
||||||
"nostr client",
|
|
||||||
"social network",
|
|
||||||
"desktop app",
|
|
||||||
"timeline",
|
|
||||||
"application",
|
|
||||||
"columns",
|
|
||||||
"tweetdeck",
|
|
||||||
]}
|
|
||||||
themeColor="#fafafa"
|
|
||||||
colorScheme="light"
|
|
||||||
facebook={{
|
|
||||||
image: "/og-image.jpg",
|
|
||||||
url: "https://lume.nu",
|
|
||||||
type: "website",
|
|
||||||
}}
|
|
||||||
twitter={{
|
|
||||||
image: "/og-image.jpg",
|
|
||||||
card: "summary",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</head>
|
|
||||||
<body
|
|
||||||
class="w-full h-full antialiased bg-neutral-50 dark:bg-neutral-950 text-neutral-950 dark:text-neutral-50"
|
|
||||||
>
|
|
||||||
<div class="py-10 flex flex-col gap-10">
|
|
||||||
<div class="mx-auto max-w-xl w-full flex flex-col gap-2">
|
|
||||||
<div class="mb-5">
|
|
||||||
<img
|
|
||||||
src="/icon.png"
|
|
||||||
alt="App Icon"
|
|
||||||
class="size-14 shadow-md shadow-neutral-500/50 rounded-xl object-cover transform-gpu -rotate-6 hover:animate-spin"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<h1 class="text-xl font-serif font-semibold">
|
|
||||||
A friendly and scalable Nostr desktop client.
|
|
||||||
</h1>
|
|
||||||
<p class="text-sm font-medium text-neutral-700">
|
|
||||||
Lume is a <b>Nostr client</b> for desktop, including Linux, Windows, and
|
|
||||||
macOS. It is free and open-source; you can look at the source code on <a
|
|
||||||
href="https://github.com/lumehq/lume">GitHub</a
|
|
||||||
>. Lume is actively improving the app and adding new features; you can
|
|
||||||
expect a new update every month.
|
|
||||||
</p>
|
|
||||||
<p class="text-sm font-medium text-neutral-700">
|
|
||||||
<b>Latest version</b>: 4.0.4
|
|
||||||
</p>
|
|
||||||
<div
|
|
||||||
class="w-full h-[120px] sm:h-[80px] flex flex-col sm:flex-row sm:items-center sm:justify-start justify-center gap-2"
|
|
||||||
>
|
|
||||||
<a
|
|
||||||
href="https://github.com/lumehq/lume/releases/latest"
|
|
||||||
class="inline-flex items-center justify-center w-44 h-11 rounded-full bg-black hover:ring-2 ring-blue-500 ring-offset-2 text-white font-medium text-sm"
|
|
||||||
>Download for macOS</a
|
|
||||||
>
|
|
||||||
<span class="italic text-xs text-neutral-700"
|
|
||||||
>(Windows & Linux are coming later)</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="text-sm italic text-neutral-600">
|
|
||||||
* If you still need to use Lume on Windows and Linux, you can try v3 <a
|
|
||||||
href="https://github.com/lumehq/lume/releases/tag/v3.0.2"
|
|
||||||
class="text-blue-500">here</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="sm:max-w-3xl w-full mx-auto px-3 sm:px-0">
|
|
||||||
<video
|
|
||||||
class="aspect-video w-full h-auto rounded-xl"
|
|
||||||
autoplay
|
|
||||||
muted
|
|
||||||
controls
|
|
||||||
>
|
|
||||||
<source
|
|
||||||
src="https://video.nostr.build/4cc4df88caeb861b62e3f73bddbb5e0b5cf63617472a97d22f427e273ee0e127.mp4"
|
|
||||||
type="video/mp4"
|
|
||||||
/>
|
|
||||||
Your browser does not support the video tag.
|
|
||||||
</video>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,15 +0,0 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
|
|
||||||
const defaultTheme = require("tailwindcss/defaultTheme");
|
|
||||||
|
|
||||||
export default {
|
|
||||||
content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"],
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
serif: ["Alice", ...defaultTheme.fontFamily.serif],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
plugins: [require("@tailwindcss/typography")],
|
|
||||||
};
|
|
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "astro/tsconfigs/strict"
|
|
||||||
}
|
|
130
flake.lock
generated
@ -1,130 +0,0 @@
|
|||||||
{
|
|
||||||
"nodes": {
|
|
||||||
"flake-utils": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1694529238,
|
|
||||||
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flake-utils_2": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems_2"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681202837,
|
|
||||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1697723726,
|
|
||||||
"narHash": "sha256-SaTWPkI8a5xSHX/rrKzUe+/uVNy6zCGMXgoeMb7T9rg=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "7c9cc5a6e5d38010801741ac830a3f8fd667a7a0",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixos-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681358109,
|
|
||||||
"narHash": "sha256-eKyxW4OohHQx9Urxi7TQlFBTDWII+F+x2hklDOQPB50=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "96ba1c52e54e74c3197f4d43026b3f3d92e83ff9",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixpkgs-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": {
|
|
||||||
"inputs": {
|
|
||||||
"flake-utils": "flake-utils",
|
|
||||||
"nixpkgs": "nixpkgs",
|
|
||||||
"rust-overlay": "rust-overlay"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rust-overlay": {
|
|
||||||
"inputs": {
|
|
||||||
"flake-utils": "flake-utils_2",
|
|
||||||
"nixpkgs": "nixpkgs_2"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1697940838,
|
|
||||||
"narHash": "sha256-eyk92QqAoRNC0V99KOcKcBZjLPixxNBS0PRc4KlSQVs=",
|
|
||||||
"owner": "oxalica",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"rev": "a3e829c06eadf848f13d109c7648570ce37ebccd",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "oxalica",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": "root",
|
|
||||||
"version": 7
|
|
||||||
}
|
|
72
flake.nix
@ -1,72 +0,0 @@
|
|||||||
# Nix.flake to build Lume based on Tauri's Guides:
|
|
||||||
# Prerequisites -> Installing -> Setting Up Linux -> NixOS
|
|
||||||
# https://tauri.app/v1/guides/getting-started/prerequisites/#1-system-dependencies
|
|
||||||
#
|
|
||||||
# To build Rust backend of Tauri `rust-overlay` is used
|
|
||||||
# https://github.com/oxalica/rust-overlay
|
|
||||||
|
|
||||||
{
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
||||||
flake-utils.url = "github:numtide/flake-utils";
|
|
||||||
rust-overlay.url = "github:oxalica/rust-overlay";
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs = { self, nixpkgs, flake-utils, rust-overlay }:
|
|
||||||
flake-utils.lib.eachDefaultSystem (system:
|
|
||||||
let
|
|
||||||
overlays = [ (import rust-overlay) ];
|
|
||||||
pkgs = import nixpkgs {
|
|
||||||
inherit system overlays;
|
|
||||||
};
|
|
||||||
|
|
||||||
libraries = with pkgs;[
|
|
||||||
webkitgtk
|
|
||||||
gtk3
|
|
||||||
cairo
|
|
||||||
gdk-pixbuf
|
|
||||||
glib
|
|
||||||
dbus
|
|
||||||
openssl_3
|
|
||||||
librsvg
|
|
||||||
libappindicator-gtk3
|
|
||||||
];
|
|
||||||
|
|
||||||
packages = with pkgs; [
|
|
||||||
curl
|
|
||||||
wget
|
|
||||||
pkg-config
|
|
||||||
dbus
|
|
||||||
openssl_3
|
|
||||||
glib
|
|
||||||
gtk3
|
|
||||||
libsoup
|
|
||||||
webkitgtk
|
|
||||||
librsvg
|
|
||||||
];
|
|
||||||
|
|
||||||
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
|
|
||||||
extensions = [ "rust-src" ]; # needed by rust-analyzer
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
devShells.default = pkgs.mkShell {
|
|
||||||
buildInputs = [
|
|
||||||
rustToolchain
|
|
||||||
pkgs.nodejs
|
|
||||||
pkgs.nodePackages.pnpm
|
|
||||||
pkgs.bun # experimental in Lume
|
|
||||||
] ++ packages;
|
|
||||||
|
|
||||||
shellHook =
|
|
||||||
''
|
|
||||||
export LD_LIBRARY_PATH=${pkgs.lib.makeLibraryPath libraries}:$LD_LIBRARY_PATH
|
|
||||||
export XDG_DATA_DIRS=${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Avoid white screen running with Nix
|
|
||||||
# https://github.com/tauri-apps/tauri/issues/4315#issuecomment-1207755694
|
|
||||||
WEBKIT_DISABLE_COMPOSITING_MODE = 1;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
|
|
||||||
index 21f5d9a5..9a46f36d 100644
|
|
||||||
--- a/src-tauri/tauri.conf.json
|
|
||||||
+++ b/src-tauri/tauri.conf.json
|
|
||||||
@@ -64,7 +64,7 @@
|
|
||||||
"shortDescription": "",
|
|
||||||
"targets": "all",
|
|
||||||
"updater": {
|
|
||||||
- "active": true,
|
|
||||||
+ "active": false,
|
|
||||||
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEU3OTdCMkM3RjU5QzE2NzkKUldSNUZwejF4N0tYNTVHYjMrU0JkL090SlEyNUVLYU5TM2hTU3RXSWtEWngrZWJ4a0pydUhXZHEK",
|
|
||||||
"windows": {
|
|
||||||
"installMode": "quiet"
|
|
@ -1,52 +0,0 @@
|
|||||||
FROM node:20-slim as prepare
|
|
||||||
|
|
||||||
RUN apt update && apt install -y git
|
|
||||||
|
|
||||||
# Taken from tauri docs https://beta.tauri.app/guides/prerequisites/#rust
|
|
||||||
RUN apt install libwebkit2gtk-4.1-dev -y \
|
|
||||||
build-essential \
|
|
||||||
curl \
|
|
||||||
wget \
|
|
||||||
file \
|
|
||||||
libssl-dev \
|
|
||||||
libayatana-appindicator3-dev \
|
|
||||||
protobuf-compiler \
|
|
||||||
librsvg2-dev
|
|
||||||
|
|
||||||
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
|
||||||
|
|
||||||
|
|
||||||
FROM prepare as build
|
|
||||||
|
|
||||||
ENV PNPM_HOME="/pnpm"
|
|
||||||
ENV PATH="$PNPM_HOME:$PATH"
|
|
||||||
ENV PATH="/root/.cargo/bin:${PATH}"
|
|
||||||
|
|
||||||
#RUN corepack prepare pnpm@latest --activate
|
|
||||||
|
|
||||||
RUN corepack enable
|
|
||||||
|
|
||||||
ADD . /lume/.
|
|
||||||
|
|
||||||
WORKDIR /lume
|
|
||||||
|
|
||||||
RUN pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
# Path for disable updater
|
|
||||||
#ADD flatpak/0001-disable-tauri-updater.patch .
|
|
||||||
#RUN patch -p1 -t -i flatpak/0001-disable-tauri-updater.patch
|
|
||||||
|
|
||||||
#ENV VITE_FLATPAK_RESOURCE="/app/lib/lume/resources/config.toml"
|
|
||||||
|
|
||||||
# debian build
|
|
||||||
RUN pnpm tauri build -b deb
|
|
||||||
|
|
||||||
ARG VERSION=3.0.1
|
|
||||||
ARG ARCH=amd64
|
|
||||||
|
|
||||||
RUN cp -r ./src-tauri/target/release/bundle/deb/lume_${VERSION}_${ARCH}/data lume-package
|
|
||||||
|
|
||||||
FROM scratch as final
|
|
||||||
|
|
||||||
COPY --from=build lume/lume-package prepare-dist
|
|
||||||
#ADD flatpak/*.xml flatpak/*.desktop flatpak/*.yml prepare-dist
|
|
@ -1,78 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<component type="desktop-application">
|
|
||||||
<id>
|
|
||||||
nu.lume.Lume
|
|
||||||
</id>
|
|
||||||
<launchable type="desktop-id">
|
|
||||||
nu.lume.Lume.desktop
|
|
||||||
</launchable>
|
|
||||||
<name>
|
|
||||||
Lume
|
|
||||||
</name>
|
|
||||||
<summary>
|
|
||||||
A cross-platform desktop nostr client
|
|
||||||
</summary>
|
|
||||||
<developer_name>
|
|
||||||
Ren Amamiya
|
|
||||||
</developer_name>
|
|
||||||
<metadata_license>
|
|
||||||
CC0-1.0
|
|
||||||
</metadata_license>
|
|
||||||
<project_license>
|
|
||||||
GPL-3.0-only
|
|
||||||
</project_license>
|
|
||||||
<url type="homepage">
|
|
||||||
https://lume.nu
|
|
||||||
</url>
|
|
||||||
<url type="bugtracker">
|
|
||||||
https://github.com/lumehq/lume/issues
|
|
||||||
</url>
|
|
||||||
<url type="donation">
|
|
||||||
https://nostree.me/npub1zfss807aer0j26mwp2la0ume0jqde3823rmu97ra6sgyyg956e0s6xw445
|
|
||||||
</url>
|
|
||||||
<supports>
|
|
||||||
<control>
|
|
||||||
pointing
|
|
||||||
</control>
|
|
||||||
<control>
|
|
||||||
keyboard
|
|
||||||
</control>
|
|
||||||
<control>
|
|
||||||
touch
|
|
||||||
</control>
|
|
||||||
</supports>
|
|
||||||
<description>
|
|
||||||
<p>
|
|
||||||
Lume a cross-platform nostr client, supported nsecbunker, chats and notifications
|
|
||||||
</p>
|
|
||||||
</description>
|
|
||||||
<custom>
|
|
||||||
<value key="Purism::form_factor">
|
|
||||||
workstation
|
|
||||||
</value>
|
|
||||||
<value key="Purism::form_factor">
|
|
||||||
mobile
|
|
||||||
</value>
|
|
||||||
</custom>
|
|
||||||
<screenshots>
|
|
||||||
<screenshot type="default">
|
|
||||||
<image>
|
|
||||||
https://raw.githubusercontent.com/lumehq/lume/flatpak/screenshots/login-screen.png
|
|
||||||
</image>
|
|
||||||
</screenshot>
|
|
||||||
<screenshot>
|
|
||||||
<image>
|
|
||||||
https://raw.githubusercontent.com/lumehq/lume/flatpak/screenshots/collumns.png
|
|
||||||
</image>
|
|
||||||
</screenshot>
|
|
||||||
<screenshot>
|
|
||||||
<image>
|
|
||||||
https://raw.githubusercontent.com/lumehq/lume/flatpak/screenshots/home-screen.png
|
|
||||||
</image>
|
|
||||||
</screenshot>
|
|
||||||
</screenshots>
|
|
||||||
<releases>
|
|
||||||
<release version="3.0.1" date="2024-02-02" />
|
|
||||||
</releases>
|
|
||||||
<content_rating type="oars-1.1" />
|
|
||||||
</component>
|
|
@ -1,12 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Version=1.0
|
|
||||||
Type=Application
|
|
||||||
|
|
||||||
Name=Lume
|
|
||||||
Comment=A cross-platform desktop nostr client
|
|
||||||
Icon=lume
|
|
||||||
Exec=lume
|
|
||||||
Terminal=false
|
|
||||||
Categories=Network;InstantMessaging;
|
|
||||||
Keywords=nostr;client;chat;
|
|
||||||
X-Purism-FormFactor=Workstation;
|
|
@ -1,40 +0,0 @@
|
|||||||
id: nu.lume.Lume
|
|
||||||
runtime: org.gnome.Platform
|
|
||||||
runtime-version: '45'
|
|
||||||
sdk: org.gnome.Sdk
|
|
||||||
command: lume
|
|
||||||
rename-icon: lume
|
|
||||||
|
|
||||||
finish-args:
|
|
||||||
- --socket=wayland
|
|
||||||
- --socket=fallback-x11
|
|
||||||
- --socket=pulseaudio
|
|
||||||
- --share=ipc
|
|
||||||
- --share=network
|
|
||||||
#- --filesystem=home
|
|
||||||
#- --filesystem=xdg-download
|
|
||||||
- --talk-name=org.freedesktop.secrets
|
|
||||||
- --talk-name=org.freedesktop.Notifications
|
|
||||||
- --talk-name=org.kde.StatusNotifierWatcher
|
|
||||||
- --filesystem=xdg-run/keyring
|
|
||||||
- --device=dri
|
|
||||||
|
|
||||||
modules:
|
|
||||||
- shared-modules/libappindicator/libappindicator-gtk3-12.10.json
|
|
||||||
- name: lume
|
|
||||||
sources:
|
|
||||||
- type: dir
|
|
||||||
path: usr
|
|
||||||
- type: file
|
|
||||||
path: nu.lume.Lume.desktop
|
|
||||||
- type: file
|
|
||||||
path: nu.lume.Lume.appdata.xml
|
|
||||||
buildsystem: simple
|
|
||||||
build-commands:
|
|
||||||
- install -Dm755 bin/lume /app/bin/lume
|
|
||||||
- mkdir -p /app/lib/lume/resources
|
|
||||||
- cp -r lib/lume/resources /app/lib/lume/resources
|
|
||||||
- mkdir -p /app/share/icons/hicolor/
|
|
||||||
- cp -r share/icons/hicolor/ /app/share/icons/
|
|
||||||
- install -Dm644 nu.lume.Lume.appdata.xml /app/share/metainfo/nu.lume.Lume.appdata.xml
|
|
||||||
- install -Dm644 nu.lume.Lume.desktop /app/share/applications/nu.lume.Lume.desktop
|
|
Before Width: | Height: | Size: 2.2 MiB |
Before Width: | Height: | Size: 2.5 MiB |
Before Width: | Height: | Size: 606 KiB |
73
package.json
@ -1,25 +1,45 @@
|
|||||||
{
|
{
|
||||||
"name": "lume",
|
"name": "lume",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "4.0.0",
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "turbo run build",
|
"dev": "vite",
|
||||||
"dev": "turbo run dev",
|
"build": "vite build",
|
||||||
"web:dev": "turbo run dev --filter web",
|
"preview": "vite preview",
|
||||||
"desktop:dev": "turbo run dev --filter @lume/desktop2",
|
|
||||||
"desktop:build": "turbo run build --filter @lume/desktop2",
|
|
||||||
"tauri": "tauri"
|
"tauri": "tauri"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
|
||||||
"@biomejs/biome": "^1.8.3",
|
|
||||||
"@tauri-apps/cli": "2.0.0-rc.1",
|
|
||||||
"turbo": "^2.0.12"
|
|
||||||
},
|
|
||||||
"packageManager": "pnpm@8.9.0",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@getalby/bitcoin-connect-react": "^3.6.1",
|
||||||
|
"@radix-ui/react-avatar": "^1.1.0",
|
||||||
|
"@radix-ui/react-checkbox": "^1.1.1",
|
||||||
|
"@radix-ui/react-popover": "^1.1.1",
|
||||||
|
"@radix-ui/react-scroll-area": "^1.1.0",
|
||||||
|
"@radix-ui/react-switch": "^1.1.0",
|
||||||
|
"@radix-ui/react-tabs": "^1.1.0",
|
||||||
|
"@radix-ui/react-tooltip": "^1.1.2",
|
||||||
|
"@tanstack/query-persist-client-core": "^5.51.21",
|
||||||
|
"@tanstack/react-query": "^5.51.23",
|
||||||
|
"@tanstack/react-router": "^1.47.1",
|
||||||
|
"embla-carousel-react": "^8.1.8",
|
||||||
|
"i18next": "^23.12.2",
|
||||||
|
"i18next-resources-to-backend": "^1.2.1",
|
||||||
|
"minidenticons": "^4.2.1",
|
||||||
|
"nanoid": "^5.0.7",
|
||||||
|
"nostr-tools": "^2.7.2",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"react-currency-input-field": "^3.8.0",
|
||||||
|
"react-dom": "^18.3.1",
|
||||||
|
"react-hook-form": "^7.52.2",
|
||||||
|
"react-i18next": "^15.0.1",
|
||||||
|
"react-string-replace": "^1.1.1",
|
||||||
|
"slate": "^0.103.0",
|
||||||
|
"slate-react": "^0.107.1",
|
||||||
|
"use-debounce": "^10.0.2",
|
||||||
|
"virtua": "^0.33.4",
|
||||||
|
"bitcoin-units": "^1.0.0",
|
||||||
|
"dayjs": "^1.11.12",
|
||||||
|
"light-bolt11-decoder": "^3.1.1",
|
||||||
"@tauri-apps/api": "2.0.0-rc.0",
|
"@tauri-apps/api": "2.0.0-rc.0",
|
||||||
"@tauri-apps/plugin-clipboard-manager": "2.0.0-rc.0",
|
"@tauri-apps/plugin-clipboard-manager": "2.0.0-rc.0",
|
||||||
"@tauri-apps/plugin-dialog": "2.0.0-rc.0",
|
"@tauri-apps/plugin-dialog": "2.0.0-rc.0",
|
||||||
@ -31,5 +51,28 @@
|
|||||||
"@tauri-apps/plugin-updater": "2.0.0-rc.0",
|
"@tauri-apps/plugin-updater": "2.0.0-rc.0",
|
||||||
"@tauri-apps/plugin-upload": "2.0.0-rc.0",
|
"@tauri-apps/plugin-upload": "2.0.0-rc.0",
|
||||||
"@tauri-apps/plugin-window-state": "2.0.0-rc.0"
|
"@tauri-apps/plugin-window-state": "2.0.0-rc.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"clsx": "^2.1.1",
|
||||||
|
"tailwind-merge": "^2.4.0",
|
||||||
|
"@biomejs/biome": "^1.8.3",
|
||||||
|
"@tauri-apps/cli": "2.0.0-rc.1",
|
||||||
|
"@tanstack/router-devtools": "^1.47.1",
|
||||||
|
"@tanstack/router-vite-plugin": "^1.47.0",
|
||||||
|
"@types/react": "^18.3.3",
|
||||||
|
"@types/react-dom": "^18.3.0",
|
||||||
|
"@vitejs/plugin-react-swc": "^3.7.0",
|
||||||
|
"autoprefixer": "^10.4.20",
|
||||||
|
"postcss": "^8.4.41",
|
||||||
|
"@evilmartians/harmony": "^1.2.0",
|
||||||
|
"@tailwindcss/forms": "^0.5.7",
|
||||||
|
"@tailwindcss/typography": "^0.5.14",
|
||||||
|
"tailwind-gradient-mask-image": "^1.2.0",
|
||||||
|
"tailwind-scrollbar": "^3.1.0",
|
||||||
|
"tailwindcss": "^3.4.9",
|
||||||
|
"tailwindcss-content-visibility": "^0.2.0",
|
||||||
|
"typescript": "^5.5.4",
|
||||||
|
"vite": "^5.4.0",
|
||||||
|
"vite-tsconfig-paths": "^5.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,128 +0,0 @@
|
|||||||
export * from "./src/addWidget";
|
|
||||||
export * from "./src/arrowLeft";
|
|
||||||
export * from "./src/arrowRight";
|
|
||||||
export * from "./src/bell";
|
|
||||||
export * from "./src/cancel";
|
|
||||||
export * from "./src/checkCircle";
|
|
||||||
export * from "./src/chevronDown";
|
|
||||||
export * from "./src/chevronRight";
|
|
||||||
export * from "./src/compose";
|
|
||||||
export * from "./src/copy";
|
|
||||||
export * from "./src/edit";
|
|
||||||
export * from "./src/enter";
|
|
||||||
export * from "./src/eyeOff";
|
|
||||||
export * from "./src/eyeOn";
|
|
||||||
export * from "./src/feed";
|
|
||||||
export * from "./src/heartbeat";
|
|
||||||
export * from "./src/hide";
|
|
||||||
export * from "./src/image";
|
|
||||||
export * from "./src/like";
|
|
||||||
export * from "./src/lume";
|
|
||||||
export * from "./src/media";
|
|
||||||
export * from "./src/mute";
|
|
||||||
export * from "./src/space";
|
|
||||||
export * from "./src/spaceFilled";
|
|
||||||
export * from "./src/navArrowDown";
|
|
||||||
export * from "./src/plus";
|
|
||||||
export * from "./src/plusCircle";
|
|
||||||
export * from "./src/refresh";
|
|
||||||
export * from "./src/reply";
|
|
||||||
export * from "./src/replyMessage";
|
|
||||||
export * from "./src/repost";
|
|
||||||
export * from "./src/threads";
|
|
||||||
export * from "./src/trash";
|
|
||||||
export * from "./src/world";
|
|
||||||
export * from "./src/zap";
|
|
||||||
export * from "./src/trending";
|
|
||||||
export * from "./src/empty";
|
|
||||||
export * from "./src/cmd";
|
|
||||||
export * from "./src/verticalDots";
|
|
||||||
export * from "./src/signal";
|
|
||||||
export * from "./src/unverified";
|
|
||||||
export * from "./src/settings";
|
|
||||||
export * from "./src/logout";
|
|
||||||
export * from "./src/follow";
|
|
||||||
export * from "./src/unfollow";
|
|
||||||
export * from "./src/reaction";
|
|
||||||
export * from "./src/thread";
|
|
||||||
export * from "./src/strangers";
|
|
||||||
export * from "./src/download";
|
|
||||||
export * from "./src/horizontalDots";
|
|
||||||
export * from "./src/arrowRightCircle";
|
|
||||||
export * from "./src/hashtag";
|
|
||||||
export * from "./src/file";
|
|
||||||
export * from "./src/share";
|
|
||||||
export * from "./src/expand";
|
|
||||||
export * from "./src/focus";
|
|
||||||
export * from "./src/chevronUp";
|
|
||||||
export * from "./src/secure";
|
|
||||||
export * from "./src/verified";
|
|
||||||
export * from "./src/mention";
|
|
||||||
export * from "./src/groupFeeds";
|
|
||||||
export * from "./src/article";
|
|
||||||
export * from "./src/follows";
|
|
||||||
export * from "./src/alby";
|
|
||||||
export * from "./src/stars";
|
|
||||||
export * from "./src/nwc";
|
|
||||||
export * from "./src/timeline";
|
|
||||||
export * from "./src/dots";
|
|
||||||
export * from "./src/handArrowDown";
|
|
||||||
export * from "./src/relay";
|
|
||||||
export * from "./src/explore";
|
|
||||||
export * from "./src/explore2";
|
|
||||||
export * from "./src/home";
|
|
||||||
export * from "./src/chats";
|
|
||||||
export * from "./src/community";
|
|
||||||
export * from "./src/heading1";
|
|
||||||
export * from "./src/heading2";
|
|
||||||
export * from "./src/heading3";
|
|
||||||
export * from "./src/bold";
|
|
||||||
export * from "./src/italic";
|
|
||||||
export * from "./src/user";
|
|
||||||
export * from "./src/advancedSettings";
|
|
||||||
export * from "./src/info";
|
|
||||||
export * from "./src/light";
|
|
||||||
export * from "./src/dark";
|
|
||||||
export * from "./src/system";
|
|
||||||
export * from "./src/announcement";
|
|
||||||
export * from "./src/depot";
|
|
||||||
export * from "./src/search";
|
|
||||||
export * from "./src/run";
|
|
||||||
export * from "./src/gossip";
|
|
||||||
export * from "./src/userAdd";
|
|
||||||
export * from "./src/userRemove";
|
|
||||||
export * from "./src/pin";
|
|
||||||
export * from "./src/homeFilled";
|
|
||||||
export * from "./src/relayFilled";
|
|
||||||
export * from "./src/depotFilled";
|
|
||||||
export * from "./src/nwcFilled";
|
|
||||||
export * from "./src/moveLeft";
|
|
||||||
export * from "./src/moveRight";
|
|
||||||
export * from "./src/help";
|
|
||||||
export * from "./src/plusSquare";
|
|
||||||
export * from "./src/column";
|
|
||||||
export * from "./src/addMedia";
|
|
||||||
export * from "./src/check";
|
|
||||||
export * from "./src/popperFilled";
|
|
||||||
export * from "./src/composeFilled";
|
|
||||||
export * from "./src/settingsFilled";
|
|
||||||
export * from "./src/bellFilled";
|
|
||||||
export * from "./src/foryou";
|
|
||||||
export * from "./src/editInterest";
|
|
||||||
export * from "./src/newColumn";
|
|
||||||
export * from "./src/searchFilled";
|
|
||||||
export * from "./src/arrowUp";
|
|
||||||
export * from "./src/arrowUpSquare";
|
|
||||||
export * from "./src/arrowDown";
|
|
||||||
export * from "./src/link";
|
|
||||||
export * from "./src/local";
|
|
||||||
export * from "./src/global";
|
|
||||||
export * from "./src/infoCircle";
|
|
||||||
export * from "./src/cancelCircle";
|
|
||||||
export * from "./src/laurel";
|
|
||||||
export * from "./src/quote";
|
|
||||||
export * from "./src/key";
|
|
||||||
export * from "./src/remote";
|
|
||||||
export * from "./src/nsfw";
|
|
||||||
export * from "./src/visit";
|
|
||||||
export * from "./src/pow";
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/icons",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"private": true,
|
|
||||||
"main": "./index.ts",
|
|
||||||
"dependencies": {
|
|
||||||
"react": "^18.3.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@lume/tsconfig": "workspace:*",
|
|
||||||
"@types/react": "^18.3.3",
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "@lume/tsconfig/base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"outDir": "dist"
|
|
||||||
},
|
|
||||||
"include": ["src"],
|
|
||||||
"exclude": ["node_modules", "dist"]
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/system",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"private": true,
|
|
||||||
"main": "./src/index.ts",
|
|
||||||
"dependencies": {
|
|
||||||
"@lume/utils": "workspace:^",
|
|
||||||
"@tanstack/query-persist-client-core": "^5.51.21",
|
|
||||||
"@tanstack/react-query": "^5.51.23",
|
|
||||||
"nostr-tools": "^2.7.2",
|
|
||||||
"react": "^18.3.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@lume/tsconfig": "workspace:^",
|
|
||||||
"@lume/types": "workspace:^",
|
|
||||||
"@types/react": "^18.3.3",
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
|
|
||||||
import preset from "@lume/tailwindcss";
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
content: ["./src/**/*.{js,ts,jsx,tsx}"],
|
|
||||||
presets: [preset],
|
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "@lume/tsconfig/base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"outDir": "dist"
|
|
||||||
},
|
|
||||||
"include": ["src"],
|
|
||||||
"exclude": ["node_modules", "dist"]
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/tailwindcss",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"private": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"exports": {
|
|
||||||
".": "./tailwind.config.js"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@evilmartians/harmony": "^1.2.0",
|
|
||||||
"@tailwindcss/forms": "^0.5.7",
|
|
||||||
"@tailwindcss/typography": "^0.5.14",
|
|
||||||
"tailwind-gradient-mask-image": "^1.2.0",
|
|
||||||
"tailwind-scrollbar": "^3.1.0",
|
|
||||||
"tailwindcss": "^3.4.9",
|
|
||||||
"tailwindcss-content-visibility": "^0.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://json.schemastore.org/tsconfig",
|
|
||||||
"display": "Default",
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "es2017",
|
|
||||||
"lib": ["dom", "dom.iterable", "esnext"],
|
|
||||||
"allowJs": true,
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"strict": false,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"noEmit": true,
|
|
||||||
"incremental": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"module": "esnext",
|
|
||||||
"resolveJsonModule": true,
|
|
||||||
"isolatedModules": true,
|
|
||||||
"jsx": "preserve",
|
|
||||||
"strictNullChecks": false
|
|
||||||
},
|
|
||||||
"exclude": ["node_modules", "src-tauri"]
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/tsconfig",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"private": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/types",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"main": "./index.d.ts",
|
|
||||||
"types": "./index.d.ts",
|
|
||||||
"private": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/ui",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"private": true,
|
|
||||||
"main": "./src/index.ts",
|
|
||||||
"dependencies": {
|
|
||||||
"@lume/icons": "workspace:^",
|
|
||||||
"@lume/utils": "workspace:^",
|
|
||||||
"react": "^18.3.1",
|
|
||||||
"react-dom": "^18.3.1",
|
|
||||||
"react-snap-carousel": "^0.4.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@lume/tailwindcss": "workspace:^",
|
|
||||||
"@lume/tsconfig": "workspace:^",
|
|
||||||
"@lume/types": "workspace:^",
|
|
||||||
"@types/react": "^18.3.3",
|
|
||||||
"tailwindcss": "^3.4.9",
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
export * from "./container";
|
|
||||||
export * from "./box";
|
|
||||||
export * from "./spinner";
|
|
@ -1,8 +0,0 @@
|
|||||||
import sharedConfig from "@lume/tailwindcss";
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
content: ["./src/**/*.{js,ts,jsx,tsx}"],
|
|
||||||
presets: [sharedConfig],
|
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "@lume/tsconfig/base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"outDir": "dist"
|
|
||||||
},
|
|
||||||
"include": ["src"],
|
|
||||||
"exclude": ["node_modules", "dist"]
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
export * from "./src/constants";
|
|
||||||
export * from "./src/formater";
|
|
||||||
export * from "./src/editor";
|
|
||||||
export * from "./src/cn";
|
|
||||||
export * from "./src/invoice";
|
|
||||||
export * from "./src/update";
|
|
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@lume/utils",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"main": "./index.ts",
|
|
||||||
"private": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"bitcoin-units": "^1.0.0",
|
|
||||||
"clsx": "^2.1.1",
|
|
||||||
"dayjs": "^1.11.12",
|
|
||||||
"light-bolt11-decoder": "^3.1.1",
|
|
||||||
"nostr-tools": "^2.7.2",
|
|
||||||
"react": "^18.3.1",
|
|
||||||
"react-dom": "^18.3.1",
|
|
||||||
"slate": "^0.103.0",
|
|
||||||
"slate-react": "^0.107.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@lume/tsconfig": "workspace:^",
|
|
||||||
"@lume/types": "workspace:^",
|
|
||||||
"@types/react": "^18.3.3",
|
|
||||||
"@types/react-dom": "^18.3.0",
|
|
||||||
"tailwind-merge": "^2.4.0",
|
|
||||||
"typescript": "^5.5.4"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
import { type ClassValue, clsx } from "clsx";
|
|
||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
|
|
||||||
export function cn(...inputs: ClassValue[]) {
|
|
||||||
return twMerge(clsx(inputs));
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
import type { Contact } from "@lume/types";
|
|
||||||
import type { ReactNode } from "react";
|
|
||||||
import ReactDOM from "react-dom";
|
|
||||||
import { type BaseEditor, Transforms } from "slate";
|
|
||||||
import { ReactEditor } from "slate-react";
|
|
||||||
|
|
||||||
export const Portal = ({ children }: { children?: ReactNode }) => {
|
|
||||||
return typeof document === "object"
|
|
||||||
? ReactDOM.createPortal(children, document.body)
|
|
||||||
: null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isImagePath = (path: string) => {
|
|
||||||
for (const suffix of ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"]) {
|
|
||||||
if (path.endsWith(suffix)) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isImageUrl = (url: string) => {
|
|
||||||
try {
|
|
||||||
if (!url) return false;
|
|
||||||
const ext = new URL(url).pathname.split(".").pop();
|
|
||||||
return ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"].includes(ext);
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const insertImage = (editor: ReactEditor | BaseEditor, url: string) => {
|
|
||||||
const text = { text: "" };
|
|
||||||
const image = [
|
|
||||||
{
|
|
||||||
type: "image",
|
|
||||||
url,
|
|
||||||
children: [text],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
const extraText = [
|
|
||||||
{
|
|
||||||
type: "paragraph",
|
|
||||||
children: [text],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// @ts-ignore, idk
|
|
||||||
ReactEditor.focus(editor);
|
|
||||||
Transforms.insertNodes(editor, image);
|
|
||||||
Transforms.insertNodes(editor, extraText);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const insertMention = (
|
|
||||||
editor: ReactEditor | BaseEditor,
|
|
||||||
contact: Contact,
|
|
||||||
) => {
|
|
||||||
const text = { text: "" };
|
|
||||||
const mention = {
|
|
||||||
type: "mention",
|
|
||||||
npub: `nostr:${contact.pubkey}`,
|
|
||||||
name: contact.profile.name || contact.profile.display_name || "anon",
|
|
||||||
children: [text],
|
|
||||||
};
|
|
||||||
|
|
||||||
// @ts-ignore, idk
|
|
||||||
ReactEditor.focus(editor);
|
|
||||||
Transforms.insertNodes(editor, mention);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const insertNostrEvent = (
|
|
||||||
editor: ReactEditor | BaseEditor,
|
|
||||||
eventId: string,
|
|
||||||
) => {
|
|
||||||
const text = { text: "" };
|
|
||||||
const event = [
|
|
||||||
{
|
|
||||||
type: "event",
|
|
||||||
eventId: `nostr:${eventId}`,
|
|
||||||
children: [text],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
const extraText = [
|
|
||||||
{
|
|
||||||
type: "paragraph",
|
|
||||||
children: [text],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
Transforms.insertNodes(editor, event);
|
|
||||||
Transforms.insertNodes(editor, extraText);
|
|
||||||
};
|
|
@ -1,17 +0,0 @@
|
|||||||
import { decode } from "light-bolt11-decoder";
|
|
||||||
import { getBitcoinDisplayValues } from "./formater";
|
|
||||||
|
|
||||||
export function decodeZapInvoice(tags?: string[][]) {
|
|
||||||
const invoice = tags.find((tag) => tag[0] === "bolt11")?.[1];
|
|
||||||
if (!invoice) return;
|
|
||||||
|
|
||||||
const decodedInvoice = decode(invoice);
|
|
||||||
const amountSection = decodedInvoice.sections.find(
|
|
||||||
(s: { name: string }) => s.name === "amount",
|
|
||||||
);
|
|
||||||
|
|
||||||
const amount = Number.parseInt(amountSection.value);
|
|
||||||
const displayValue = getBitcoinDisplayValues(amount);
|
|
||||||
|
|
||||||
return displayValue;
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
import { check } from "@tauri-apps/plugin-updater";
|
|
||||||
import { ask, message } from "@tauri-apps/plugin-dialog";
|
|
||||||
import { relaunch } from "@tauri-apps/plugin-process";
|
|
||||||
|
|
||||||
export async function checkForAppUpdates(silent: boolean) {
|
|
||||||
const update = await check();
|
|
||||||
|
|
||||||
if (!update) {
|
|
||||||
if (silent) return;
|
|
||||||
|
|
||||||
await message("You are on the latest version. Stay awesome!", {
|
|
||||||
title: "No Update Available",
|
|
||||||
kind: "info",
|
|
||||||
okLabel: "OK",
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (update?.available) {
|
|
||||||
const yes = await ask(
|
|
||||||
`Update to ${update.version} is available!\n\nRelease notes: ${update.body}`,
|
|
||||||
{
|
|
||||||
title: "Update Available",
|
|
||||||
kind: "info",
|
|
||||||
okLabel: "Update",
|
|
||||||
cancelLabel: "Cancel",
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
if (yes) {
|
|
||||||
await update.downloadAndInstall();
|
|
||||||
await relaunch();
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "@lume/tsconfig/base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"outDir": "dist"
|
|
||||||
},
|
|
||||||
"include": ["src"],
|
|
||||||
"exclude": ["node_modules", "dist"]
|
|
||||||
}
|
|
3027
pnpm-lock.yaml
generated
@ -1,3 +0,0 @@
|
|||||||
packages:
|
|
||||||
- "apps/*"
|
|
||||||
- "packages/*"
|
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 249 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 248 KiB After Width: | Height: | Size: 248 KiB |
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 220 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 246 KiB |
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 201 KiB |
Before Width: | Height: | Size: 170 KiB After Width: | Height: | Size: 170 KiB |
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 211 KiB |
@ -139,7 +139,7 @@ fn main() {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
builder
|
builder
|
||||||
.export(Typescript::default(), "../packages/system/src/commands.ts")
|
.export(Typescript::default(), "../src/commands.gen.ts")
|
||||||
.expect("Failed to export typescript bindings");
|
.expect("Failed to export typescript bindings");
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
"version": "4.0.15",
|
"version": "4.0.15",
|
||||||
"identifier": "nu.lume.Lume",
|
"identifier": "nu.lume.Lume",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeBuildCommand": "pnpm desktop:build",
|
"beforeDevCommand": "pnpm dev",
|
||||||
"beforeDevCommand": "pnpm desktop:dev",
|
|
||||||
"devUrl": "http://localhost:3000",
|
"devUrl": "http://localhost:3000",
|
||||||
|
"beforeBuildCommand": "pnpm build",
|
||||||
"frontendDist": "../dist"
|
"frontendDist": "../dist"
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
|
@ -3,11 +3,12 @@ import { RouterProvider, createRouter } from "@tanstack/react-router";
|
|||||||
import { type } from "@tauri-apps/plugin-os";
|
import { type } from "@tauri-apps/plugin-os";
|
||||||
import { StrictMode } from "react";
|
import { StrictMode } from "react";
|
||||||
import ReactDOM from "react-dom/client";
|
import ReactDOM from "react-dom/client";
|
||||||
import { routeTree } from "./router.gen"; // auto generated file
|
import { routeTree } from "./routes.gen"; // auto generated file
|
||||||
import "./app.css";
|
import "./app.css";
|
||||||
|
|
||||||
const queryClient = new QueryClient();
|
const queryClient = new QueryClient();
|
||||||
const platform = type();
|
const platform = type();
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
routeTree,
|
routeTree,
|
||||||
context: { queryClient, platform },
|
context: { queryClient, platform },
|
@ -1,7 +1,18 @@
|
|||||||
|
import type { Contact } from "@/types";
|
||||||
|
import { ask, message } from "@tauri-apps/plugin-dialog";
|
||||||
|
import { relaunch } from "@tauri-apps/plugin-process";
|
||||||
|
import { check } from "@tauri-apps/plugin-updater";
|
||||||
import { BitcoinUnit } from "bitcoin-units";
|
import { BitcoinUnit } from "bitcoin-units";
|
||||||
|
import { type ClassValue, clsx } from "clsx";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import relativeTime from "dayjs/plugin/relativeTime";
|
import relativeTime from "dayjs/plugin/relativeTime";
|
||||||
import updateLocale from "dayjs/plugin/updateLocale";
|
import updateLocale from "dayjs/plugin/updateLocale";
|
||||||
|
import { decode } from "light-bolt11-decoder";
|
||||||
|
import type { ReactNode } from "react";
|
||||||
|
import ReactDOM from "react-dom";
|
||||||
|
import { type BaseEditor, Transforms } from "slate";
|
||||||
|
import { ReactEditor } from "slate-react";
|
||||||
|
import { twMerge } from "tailwind-merge";
|
||||||
import { AUDIOS, IMAGES, VIDEOS } from "./constants";
|
import { AUDIOS, IMAGES, VIDEOS } from "./constants";
|
||||||
|
|
||||||
dayjs.extend(relativeTime);
|
dayjs.extend(relativeTime);
|
||||||
@ -20,6 +31,78 @@ dayjs.updateLocale("en", {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export function cn(...inputs: ClassValue[]) {
|
||||||
|
return twMerge(clsx(inputs));
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Portal = ({ children }: { children?: ReactNode }) => {
|
||||||
|
return typeof document === "object"
|
||||||
|
? ReactDOM.createPortal(children, document.body)
|
||||||
|
: null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const isImagePath = (path: string) => {
|
||||||
|
for (const suffix of ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"]) {
|
||||||
|
if (path.endsWith(suffix)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const isImageUrl = (url: string) => {
|
||||||
|
try {
|
||||||
|
if (!url) return false;
|
||||||
|
const ext = new URL(url).pathname.split(".").pop();
|
||||||
|
return ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"].includes(ext);
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const insertImage = (editor: ReactEditor | BaseEditor, url: string) => {
|
||||||
|
const text = { text: "" };
|
||||||
|
const image = [
|
||||||
|
{
|
||||||
|
type: "image",
|
||||||
|
url,
|
||||||
|
children: [text],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const extraText = [
|
||||||
|
{
|
||||||
|
type: "paragraph",
|
||||||
|
children: [text],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// @ts-ignore, idk
|
||||||
|
ReactEditor.focus(editor);
|
||||||
|
Transforms.insertNodes(editor, image);
|
||||||
|
Transforms.insertNodes(editor, extraText);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const insertNostrEvent = (
|
||||||
|
editor: ReactEditor | BaseEditor,
|
||||||
|
eventId: string,
|
||||||
|
) => {
|
||||||
|
const text = { text: "" };
|
||||||
|
const event = [
|
||||||
|
{
|
||||||
|
type: "event",
|
||||||
|
eventId: `nostr:${eventId}`,
|
||||||
|
children: [text],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const extraText = [
|
||||||
|
{
|
||||||
|
type: "paragraph",
|
||||||
|
children: [text],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
Transforms.insertNodes(editor, event);
|
||||||
|
Transforms.insertNodes(editor, extraText);
|
||||||
|
};
|
||||||
|
|
||||||
export function formatCreatedAt(time: number, message = false) {
|
export function formatCreatedAt(time: number, message = false) {
|
||||||
let formated: string;
|
let formated: string;
|
||||||
|
|
||||||
@ -140,3 +223,53 @@ export function getBitcoinDisplayValues(satoshis: number) {
|
|||||||
bitcoinDecimal,
|
bitcoinDecimal,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function decodeZapInvoice(tags?: string[][]) {
|
||||||
|
const invoice = tags.find((tag) => tag[0] === "bolt11")?.[1];
|
||||||
|
if (!invoice) return;
|
||||||
|
|
||||||
|
const decodedInvoice = decode(invoice);
|
||||||
|
const amountSection = decodedInvoice.sections.find(
|
||||||
|
(s: { name: string }) => s.name === "amount",
|
||||||
|
);
|
||||||
|
|
||||||
|
const amount = Number.parseInt(amountSection.value);
|
||||||
|
const displayValue = getBitcoinDisplayValues(amount);
|
||||||
|
|
||||||
|
return displayValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function checkForAppUpdates(silent: boolean) {
|
||||||
|
const update = await check();
|
||||||
|
|
||||||
|
if (!update) {
|
||||||
|
if (silent) return;
|
||||||
|
|
||||||
|
await message("You are on the latest version. Stay awesome!", {
|
||||||
|
title: "No Update Available",
|
||||||
|
kind: "info",
|
||||||
|
okLabel: "OK",
|
||||||
|
});
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update?.available) {
|
||||||
|
const yes = await ask(
|
||||||
|
`Update to ${update.version} is available!\n\nRelease notes: ${update.body}`,
|
||||||
|
{
|
||||||
|
title: "Update Available",
|
||||||
|
kind: "info",
|
||||||
|
okLabel: "Update",
|
||||||
|
cancelLabel: "Cancel",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (yes) {
|
||||||
|
await update.downloadAndInstall();
|
||||||
|
await relaunch();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
import { NostrQuery } from "@lume/system";
|
import { cn } from "@/commons";
|
||||||
import { Spinner } from "@lume/ui";
|
import { Spinner } from "@/components";
|
||||||
import { cn } from "@lume/utils";
|
import { NostrQuery } from "@/system";
|
||||||
import { message } from "@tauri-apps/plugin-dialog";
|
import { message } from "@tauri-apps/plugin-dialog";
|
||||||
import {
|
import {
|
||||||
type Dispatch,
|
type Dispatch,
|
@ -1,4 +1,4 @@
|
|||||||
import { cn } from "@lume/utils";
|
import { cn } from "@/commons";
|
||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
|
|
||||||
export function Box({
|
export function Box({
|
@ -1,5 +1,5 @@
|
|||||||
import { CheckIcon, HorizontalDotsIcon } from "@lume/icons";
|
import type { LumeColumn } from "@/types";
|
||||||
import type { LumeColumn } from "@lume/types";
|
import { CheckIcon, HorizontalDotsIcon } from "@/components";
|
||||||
import { invoke } from "@tauri-apps/api/core";
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
import { listen } from "@tauri-apps/api/event";
|
import { listen } from "@tauri-apps/api/event";
|
||||||
import { Menu, MenuItem, PredefinedMenuItem } from "@tauri-apps/api/menu";
|
import { Menu, MenuItem, PredefinedMenuItem } from "@tauri-apps/api/menu";
|
@ -1,4 +1,4 @@
|
|||||||
import { cn } from "@lume/utils";
|
import { cn } from "@/commons";
|
||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
|
|
||||||
export function Container({
|
export function Container({
|
@ -1,7 +1,7 @@
|
|||||||
|
import { cn } from "@/commons";
|
||||||
|
import { ThreadIcon } from "@/components";
|
||||||
import { Note } from "@/components/note";
|
import { Note } from "@/components/note";
|
||||||
import { ThreadIcon } from "@lume/icons";
|
import type { LumeEvent } from "@/system";
|
||||||
import type { LumeEvent } from "@lume/system";
|
|
||||||
import { cn } from "@lume/utils";
|
|
||||||
import { memo, useMemo } from "react";
|
import { memo, useMemo } from "react";
|
||||||
|
|
||||||
export const Conversation = memo(function Conversation({
|
export const Conversation = memo(function Conversation({
|