From 60f52440d79e1c07e76e6cc627b09220467d84fc Mon Sep 17 00:00:00 2001 From: jonty007 Date: Thu, 26 Sep 2024 04:25:55 +0530 Subject: [PATCH 1/6] chat app --- packages/chat-vite/.env.example | 11 + packages/chat-vite/.gitignore | 22 ++ packages/chat-vite/.prettierrc | 6 + packages/chat-vite/README.md | 92 +++++ packages/chat-vite/eslint.config.js | 28 ++ packages/chat-vite/index.html | 13 + packages/chat-vite/package.json | 42 +++ packages/chat-vite/postcss.config.js | 6 + .../chat-vite/public/BitcoinComputer-Logo.png | Bin 0 -> 15614 bytes packages/chat-vite/public/logo.png | Bin 0 -> 43566 bytes packages/chat-vite/public/vite.svg | 1 + packages/chat-vite/scripts/deploy.ts | 53 +++ packages/chat-vite/src/App.css | 38 ++ packages/chat-vite/src/App.test.tsx | 10 + packages/chat-vite/src/App.tsx | 47 +++ packages/chat-vite/src/assets/react.svg | 1 + packages/chat-vite/src/components/Assets.tsx | 14 + packages/chat-vite/src/components/Chat.tsx | 354 ++++++++++++++++++ packages/chat-vite/src/components/Chats.tsx | 165 ++++++++ packages/chat-vite/src/components/Mint.tsx | 126 +++++++ packages/chat-vite/src/components/Navbar.tsx | 278 ++++++++++++++ packages/chat-vite/src/constants/modSpecs.ts | 2 + packages/chat-vite/src/contracts/chat.ts | 19 + packages/chat-vite/src/contracts/counter.ts | 10 + packages/chat-vite/src/index.css | 14 + packages/chat-vite/src/main.tsx | 10 + packages/chat-vite/src/setupTests.ts | 3 + packages/chat-vite/src/types/common.ts | 2 + packages/chat-vite/src/vite-env.d.ts | 1 + packages/chat-vite/tailwind.config.js | 19 + packages/chat-vite/tsconfig.json | 25 ++ packages/chat-vite/vite.config.ts | 28 ++ scripts/check-obfuscation.sh | 2 +- 33 files changed, 1441 insertions(+), 1 deletion(-) create mode 100644 packages/chat-vite/.env.example create mode 100644 packages/chat-vite/.gitignore create mode 100644 packages/chat-vite/.prettierrc create mode 100644 packages/chat-vite/README.md create mode 100644 packages/chat-vite/eslint.config.js create mode 100644 packages/chat-vite/index.html create mode 100644 packages/chat-vite/package.json create mode 100644 packages/chat-vite/postcss.config.js create mode 100644 packages/chat-vite/public/BitcoinComputer-Logo.png create mode 100644 packages/chat-vite/public/logo.png create mode 100644 packages/chat-vite/public/vite.svg create mode 100644 packages/chat-vite/scripts/deploy.ts create mode 100644 packages/chat-vite/src/App.css create mode 100644 packages/chat-vite/src/App.test.tsx create mode 100644 packages/chat-vite/src/App.tsx create mode 100644 packages/chat-vite/src/assets/react.svg create mode 100644 packages/chat-vite/src/components/Assets.tsx create mode 100644 packages/chat-vite/src/components/Chat.tsx create mode 100644 packages/chat-vite/src/components/Chats.tsx create mode 100644 packages/chat-vite/src/components/Mint.tsx create mode 100644 packages/chat-vite/src/components/Navbar.tsx create mode 100644 packages/chat-vite/src/constants/modSpecs.ts create mode 100644 packages/chat-vite/src/contracts/chat.ts create mode 100644 packages/chat-vite/src/contracts/counter.ts create mode 100644 packages/chat-vite/src/index.css create mode 100644 packages/chat-vite/src/main.tsx create mode 100644 packages/chat-vite/src/setupTests.ts create mode 100644 packages/chat-vite/src/types/common.ts create mode 100644 packages/chat-vite/src/vite-env.d.ts create mode 100644 packages/chat-vite/tailwind.config.js create mode 100644 packages/chat-vite/tsconfig.json create mode 100644 packages/chat-vite/vite.config.ts diff --git a/packages/chat-vite/.env.example b/packages/chat-vite/.env.example new file mode 100644 index 000000000..049c517f5 --- /dev/null +++ b/packages/chat-vite/.env.example @@ -0,0 +1,11 @@ +# Application configuration +VITE_CHAIN=LTC +VITE_NETWORK=regtest +VITE_URL=http://127.0.0.1:1031 + +# Application Port +VITE_PORT=1032 + +# Smart Contract Locations +# Run 'npm run deploy' and copy the output here +VITE_CHAT_MOD_SPEC=b7fa7873fb6fcf7f13555c6cf18cc7361ba7ff9f146f50b502e2bc5abbe2b28a:0 diff --git a/packages/chat-vite/.gitignore b/packages/chat-vite/.gitignore new file mode 100644 index 000000000..9aad0ad64 --- /dev/null +++ b/packages/chat-vite/.gitignore @@ -0,0 +1,22 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build +/dist + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +*.log* diff --git a/packages/chat-vite/.prettierrc b/packages/chat-vite/.prettierrc new file mode 100644 index 000000000..b7a412b57 --- /dev/null +++ b/packages/chat-vite/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 100, + "semi": false, + "singleQuote": false, + "trailingComma": "none" +} diff --git a/packages/chat-vite/README.md b/packages/chat-vite/README.md new file mode 100644 index 000000000..34cc2597d --- /dev/null +++ b/packages/chat-vite/README.md @@ -0,0 +1,92 @@ +
+

TBC CRA Template

+

+ A template for Create React App with TypeScript and the Bitcoin Computer +
+ website · docs +

+
+ +## Prerequisites + +You need to have [git](https://www.git-scm.com/) and [node.js](https://nodejs.org/) installed. + +## Installation + + + +```sh +# Download the monorepo +git clone https://github.com/bitcoin-computer/monorepo.git + +# Move into monorepo folder +cd monorepo + +# Install the dependencies +npm install +``` + + + +## Usage + +Most of the api is documented in the [Create React App Readme](https://github.com/facebook/create-react-app). + +### Start the Application + +To start the application run the command below and open [http://localhost:3000](http://localhost:3000). + + + +```bash +# Move to the package +cd packages/cra-template + +# Install the dependencies +npm install + +# Use the default environment variables +cp .env.example .env + +# Start the app +npm run start +``` + + + +## Documentation + +Have a look at the [docs](https://docs.bitcoincomputer.io/) for the Bitcoin Computer. + +## Getting Help + +If you have any questions, please let us know on Telegram, Twitter, or by email clemens@bitcoincomputer.io. + +## Development Status +See [here](https://github.com/bitcoin-computer/monorepo/tree/main/packages/lib#development-status). + +## Price + +See [here](https://github.com/bitcoin-computer/monorepo/tree/main/packages/lib#price). + +## Contributing + +This project is intended as a starting point for new development so we want to keep it simple. If you have found a bug please create an [issue](https://github.com/bitcoin-computer/monorepo/issues). If you have a bug fix or a UX improvement please create a pull request [here](https://github.com/bitcoin-computer/monorepo/pulls). + +If you want to add a feature we recommend to create a fork. Let us know if you have built something cool and we can link to your project. + +## Legal Notice + +See [here](https://github.com/bitcoin-computer/monorepo/tree/main/packages/lib#legal-notice). + +## MIT License + +Copyright (c) 2022 BCDB Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[node]: https://github.com/bitcoin-computer/monorepo/tree/main/packages/node diff --git a/packages/chat-vite/eslint.config.js b/packages/chat-vite/eslint.config.js new file mode 100644 index 000000000..092408a9f --- /dev/null +++ b/packages/chat-vite/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/packages/chat-vite/index.html b/packages/chat-vite/index.html new file mode 100644 index 000000000..3ed11b3ea --- /dev/null +++ b/packages/chat-vite/index.html @@ -0,0 +1,13 @@ + + + + + + + Bitcoin Computer Chat App + + +
+ + + diff --git a/packages/chat-vite/package.json b/packages/chat-vite/package.json new file mode 100644 index 000000000..b80be8459 --- /dev/null +++ b/packages/chat-vite/package.json @@ -0,0 +1,42 @@ +{ + "name": "chat-vite", + "private": true, + "version": "0.21.0-beta.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview", + "test": "vitest", + "deploy": "node --loader ts-node/esm scripts/deploy.ts" + }, + "dependencies": { + "@bitcoin-computer/components": "^0.21.0-beta.0", + "@bitcoin-computer/lib": "^0.21.0-beta.0", + "flowbite": "^2.3.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", + "jsdom": "^25.0.0", + "postcss": "^8.4.44", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.1", + "vite": "^5.4.1", + "vitest": "^2.0.5" + } +} diff --git a/packages/chat-vite/postcss.config.js b/packages/chat-vite/postcss.config.js new file mode 100644 index 000000000..2e7af2b7f --- /dev/null +++ b/packages/chat-vite/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/packages/chat-vite/public/BitcoinComputer-Logo.png b/packages/chat-vite/public/BitcoinComputer-Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..539aeba1adbac0b1ee13860ad965bb7c5d8e53cd GIT binary patch literal 15614 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�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 literal 0 HcmV?d00001 diff --git a/packages/chat-vite/public/vite.svg b/packages/chat-vite/public/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/packages/chat-vite/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/chat-vite/scripts/deploy.ts b/packages/chat-vite/scripts/deploy.ts new file mode 100644 index 000000000..1089d5551 --- /dev/null +++ b/packages/chat-vite/scripts/deploy.ts @@ -0,0 +1,53 @@ +import { config } from "dotenv" +import * as readline from "node:readline/promises" +import { stdin as input, stdout as output } from "node:process" +import { Computer } from "@bitcoin-computer/lib" +import { ChatSc } from "../src/contracts/chat.js" + +config() + +const rl = readline.createInterface({ input, output }) + +const { VITE_CHAIN: chain, VITE_NETWORK: network, VITE_URL: url, MNEMONIC: mnemonic } = process.env + +if (network !== "regtest") { + if (!mnemonic) throw new Error("Please set MNEMONIC in the .env file") +} + +const computer = new Computer({ chain, network, mnemonic, url }) +if (network === "regtest") { + await computer.faucet(2e8) +} + +const balance = await computer.wallet.getBalance() + +// Summary +console.log(`Chain \x1b[2m${chain}\x1b[0m +Network \x1b[2m${network}\x1b[0m +Node Url \x1b[2m${url}\x1b[0m +Address \x1b[2m${computer.wallet.address}\x1b[0m +Mnemonic \x1b[2m${mnemonic}\x1b[0m +Balance \x1b[2m${balance.balance / 1e8}\x1b[0m`) + +const answer = await rl.question("\nDo you want to deploy the contract? \x1b[2m(y/n)\x1b[0m") +if (answer === "n") { + console.log("\n Aborting...\n") +} else { + console.log("\n * Deploying ChatSc contract...") + const chatModSpec = await computer.deploy(`export ${ChatSc}`) + + console.log(` +Successfully deployed chat smart contract. + +----------------- + ACTION REQUIRED +----------------- + +(1) Update the following rows in your .env file. + +VITE_CHAT_MOD_SPEC\x1b[2m=${chatModSpec}\x1b[0m +(2) Run 'npm start' to start the application. +`) +} + +rl.close() diff --git a/packages/chat-vite/src/App.css b/packages/chat-vite/src/App.css new file mode 100644 index 000000000..74b5e0534 --- /dev/null +++ b/packages/chat-vite/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/packages/chat-vite/src/App.test.tsx b/packages/chat-vite/src/App.test.tsx new file mode 100644 index 000000000..c53ac5c74 --- /dev/null +++ b/packages/chat-vite/src/App.test.tsx @@ -0,0 +1,10 @@ +import { screen, render } from "@testing-library/react" +import App from "./App" + +describe("App", () => { + it("renders the App component", () => { + render() + const linkElement = screen.getByText(/All Counters/i) + expect(linkElement).toBeInTheDocument() + }) +}) diff --git a/packages/chat-vite/src/App.tsx b/packages/chat-vite/src/App.tsx new file mode 100644 index 000000000..5381d4736 --- /dev/null +++ b/packages/chat-vite/src/App.tsx @@ -0,0 +1,47 @@ +import "./App.css" +import { useEffect, useState } from "react" +import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom" +import { initFlowbite } from "flowbite" +import { + Auth, + Error404, + UtilsContext, + Wallet, + SmartObject, + Transaction, + ComputerContext +} from "@bitcoin-computer/components" +import Mint from "./components/Mint" +import { Chats } from "./components/Chats" + +export default function App() { + const [computer] = useState(Auth.getComputer()) + + useEffect(() => { + initFlowbite() + }, []) + + return ( + + + + + + +

+ + + + ) +} diff --git a/packages/chat-vite/src/assets/react.svg b/packages/chat-vite/src/assets/react.svg new file mode 100644 index 000000000..6c87de9bb --- /dev/null +++ b/packages/chat-vite/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/chat-vite/src/components/Assets.tsx b/packages/chat-vite/src/components/Assets.tsx new file mode 100644 index 000000000..abc9e1e16 --- /dev/null +++ b/packages/chat-vite/src/components/Assets.tsx @@ -0,0 +1,14 @@ +import { Auth, Gallery } from "@bitcoin-computer/components" +import { VITE_CHAT_MOD_SPEC } from "../constants/modSpecs" + +const publicKey = Auth.getComputer().getPublicKey() + +// How to prevent users from accessing other chats +export function MyAssets() { + return ( + <> +

My Chats

+ + + ) +} diff --git a/packages/chat-vite/src/components/Chat.tsx b/packages/chat-vite/src/components/Chat.tsx new file mode 100644 index 000000000..77f50e6ff --- /dev/null +++ b/packages/chat-vite/src/components/Chat.tsx @@ -0,0 +1,354 @@ +import { ComputerContext, Modal, sleep, UtilsContext } from "@bitcoin-computer/components" +import { useContext, useEffect, useState } from "react" +import { useNavigate } from "react-router-dom" +import { HiRefresh, HiUserAdd } from "react-icons/hi" +import { HiWallet } from "react-icons/hi2" + +import { ChatSc } from "../contracts/chat" +const addUserModal = "add-user-modal" + +interface messageI { + text: string + publicKey: string + time: string +} +const getInitials = (name: string | undefined) => { + if (!name) { + return "" + } + const names = name.trim().split(" ") + if (names.length === 1) return names[0].charAt(0).toUpperCase() + return (names[0].charAt(0) + names[1].charAt(0)).toUpperCase() +} + +const getColor = (publicKey: string) => { + return `#${publicKey.slice(0, 6)}` +} + +const getInitialsFromPublicKey = (publicKey: string) => { + return (publicKey[0].charAt(0) + publicKey[3].charAt(0)).toUpperCase() +} + +const formatTime = (str: string) => { + const date = new Date(parseInt(str)) + let hours = date.getHours() + let minutes = date.getMinutes() + + // Format time + const formattedTime = `${hours < 10 ? "0" + hours : hours}:${minutes < 10 ? "0" + minutes : minutes}` + + // Format date as dd mmm yy + const day = date.getDate() + const monthNames = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + const month = monthNames[date.getMonth()] + const year = date.getFullYear().toString().slice(-2) + + const formattedDate = `${day < 10 ? "0" + day : day} ${month}'${year}` + + return `${formattedDate} ${formattedTime}` +} + +const ReceivedMessage = ({ message }: { message: messageI }) => { + return ( +
+
+ {getInitialsFromPublicKey(message.publicKey)} +
+
+

{message.text}

+ + {formatTime(message.time)} + +
+
+ ) +} + +const SentMessage = ({ message }: { message: messageI }) => { + return ( +
+
+

{message.text}

+ + {formatTime(message.time)} + +
+
+ {getInitialsFromPublicKey(message.publicKey)} +
+
+ ) +} + +function AddUserToChat(chatObj: ChatSc) { + const [publicKey, setPublicKey] = useState("") + const [creating, setCreating] = useState(false) + const { showSnackBar } = UtilsContext.useUtilsComponents() + + const inviteUser = async (e: React.SyntheticEvent) => { + e.preventDefault() + try { + setCreating(true) + console.log(chatObj) + await chatObj.invite(publicKey) + setPublicKey("") + showSnackBar("User added to the chat", true) + Modal.hideModal(addUserModal) + } catch (err) { + if (err instanceof Error) { + showSnackBar(err.message, false) + } + } finally { + setCreating(false) + } + } + + return ( + <> +
+
+
+ + setPublicKey(e.target.value)} + className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + placeholder="User Public Key" + required + /> +
+ +
+
+ + ) +} + +const ChatHeader = ({ + channelName, + refreshChat, + chatObj +}: { + channelName?: string + refreshChat: () => Promise + chatObj: ChatSc +}) => { + const [addUserToChat, setAddUserToChat] = useState() + + const addUser = (chat: ChatSc) => { + setAddUserToChat(chat) + Modal.showModal(addUserModal) + } + + return ( +
+
+
+ {getInitials(channelName)} +
+
+
{channelName}
+ Online +
+
+ + {/* Icon Group */} +
+ + addUser(chatObj)} + className="w-6 h-6 cursor-pointer hover:opacity-80 dark:hover:opacity-80" + style={{ color: "#999999" }} + /> + +
+ +
+ ) +} + +const ChatInput = ({ + disabled, + chatObj, + refreshChat +}: { + chatObj: ChatSc | null + disabled: boolean + refreshChat: () => Promise +}) => { + const computer = useContext(ComputerContext) + const [message, setMessage] = useState("") + const [sending, setSending] = useState(false) + const { showSnackBar, showLoader } = UtilsContext.useUtilsComponents() + + const sendMessage = async () => { + try { + setSending(true) + showLoader(true) + const messageData: messageI = { + text: message, + publicKey: computer.getPublicKey(), + time: Date.now().toString() + } + await chatObj?.post(JSON.stringify(messageData)) + await sleep(2000) + await refreshChat() + setMessage("") + } catch (error) { + if (error instanceof Error) showSnackBar(error.message, false) + } finally { + showLoader(false) + setSending(false) + } + } + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault() + sendMessage() + } + } + + return ( +
+
+ setMessage(e.target.value)} + onKeyDown={handleKeyDown} + disabled={disabled} + /> + +
+
+ ) +} + +export function Chat({ chatId }: { chatId: string }) { + const computer = useContext(ComputerContext) + const { showSnackBar, showLoader } = UtilsContext.useUtilsComponents() + const navigate = useNavigate() + const [id] = useState(chatId || "") + const [chatObj, setChatObj] = useState(null) + const [messages, setMessages] = useState([]) + + const refreshChat = async () => { + try { + showLoader(true) + const latesRev = await computer.getLatestRev(id) + const synced = (await computer.sync(latesRev)) as ChatSc + setChatObj(synced) + const messagesData: messageI[] = [] + synced.messages.forEach((message) => { + messagesData.push(JSON.parse(message)) + }) + setMessages(messagesData) + showLoader(false) + } catch (error) { + showLoader(false) + showSnackBar("Not a valid Chat", false) + } + } + + useEffect(() => { + const fetch = async () => { + await refreshChat() + } + fetch() + }, [computer, id, chatId, location, navigate]) + + return ( + <> +
+
+ {chatObj && ( + <> + + +
+ {messages.map((data, index) => + data.publicKey === computer.getPublicKey() ? ( + + ) : ( + + ) + )} +
+ + + + )} +
+
+ + ) +} diff --git a/packages/chat-vite/src/components/Chats.tsx b/packages/chat-vite/src/components/Chats.tsx new file mode 100644 index 000000000..3457cda1e --- /dev/null +++ b/packages/chat-vite/src/components/Chats.tsx @@ -0,0 +1,165 @@ +import { Auth, ComputerContext, Modal, UtilsContext } from "@bitcoin-computer/components" +import { useContext, useEffect, useState } from "react" +import { useNavigate, useParams, Link } from "react-router-dom" +import { HiPlusCircle } from "react-icons/hi" + +import { VITE_CHAT_MOD_SPEC } from "../constants/modSpecs" +import { ChatSc } from "../contracts/chat" +import { Chat } from "./Chat" + +const newChatModal = "new-chat-modal" + +function CreateNewChat() { + const computer = useContext(ComputerContext) + const [name, setName] = useState("") + const [creating, setCreating] = useState(false) + const { showSnackBar, showLoader } = UtilsContext.useUtilsComponents() + const navigate = useNavigate() + + const onSubmit = async (e: React.SyntheticEvent) => { + e.preventDefault() + try { + showLoader(true) + setCreating(true) + const { tx, effect } = await computer.encode({ + exp: `new ChatSc("${name}", "${computer.getPublicKey()}")`, + mod: VITE_CHAT_MOD_SPEC + }) + await computer.broadcast(tx) + setName("") + if (typeof effect.res === "object" && !Array.isArray(effect.res)) { + showLoader(false) + showSnackBar("You created a new chat", true) + navigate(`/chats/${effect.res?._id as string}`) + window.location.reload() + } + } catch (err) { + if (err instanceof Error) { + showSnackBar(err.message, false) + } + } finally { + setCreating(false) + showLoader(false) + } + } + + return ( + <> +
+
+
+ + setName(e.target.value)} + className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + placeholder="Channel Name" + required + /> +
+ +
+
+ + ) +} + +export function Chats() { + const computer = useContext(ComputerContext) + const publicKey = Auth.getComputer().getPublicKey() + const params = useParams() + const navigate = useNavigate() + const [chatId] = useState(params.id || "") + const [chats, setChats] = useState([]) + + useEffect(() => { + const fetch = async () => { + const result = await computer.query({ mod: VITE_CHAT_MOD_SPEC, publicKey }) + const chatsPromise: Promise[] = [] + result.forEach((rev: string) => { + chatsPromise.push(computer.sync(rev) as Promise) + }) + + Promise.all(chatsPromise).then((data) => { + setChats(data) + }) + } + fetch() + }, [computer, location, navigate]) + + const newChat = () => { + Modal.showModal(newChatModal) + } + + return ( + <> +
+
+
+ + + + + + + + {chats.map((chat) => ( + + + + ))} + +
+ My Chats + +
{ + navigate(`/chats/${chat._id}`) + window.location.reload() + }} + > + + {chat.channelName} + +
+
+
+
+ {chatId ? ( + + ) : ( +
+

+ Create new chat or select a existing existing one{" "} +

+
+ )} +
+
+ + + ) +} diff --git a/packages/chat-vite/src/components/Mint.tsx b/packages/chat-vite/src/components/Mint.tsx new file mode 100644 index 000000000..29be3c89a --- /dev/null +++ b/packages/chat-vite/src/components/Mint.tsx @@ -0,0 +1,126 @@ +import { useContext, useState } from "react" +import { ComputerContext, Modal } from "@bitcoin-computer/components" +import { Link } from "react-router-dom" +import { VITE_CHAT_MOD_SPEC } from "../constants/modSpecs" + +function SuccessContent(rev: string) { + return ( + <> +
+
+ You created a{" "} + { + Modal.hideModal("success-modal") + }} + > + chat + +
+
+
+ +
+ + ) +} + +function ErrorContent(msg: string) { + return ( + <> +
+
+ Something went wrong. +
+
+ {msg} +
+
+
+ +
+ + ) +} + +export default function Mint() { + const computer = useContext(ComputerContext) + const [successRev, setSuccessRev] = useState("") + const [errorMsg, setErrorMsg] = useState("") + const [name, setName] = useState("") + + const onSubmit = async (e: React.SyntheticEvent) => { + e.preventDefault() + try { + const { tx, effect } = await computer.encode({ + exp: `new ChatSc("${name}", "${computer.getPublicKey()}")`, + mod: VITE_CHAT_MOD_SPEC + }) + await computer.broadcast(tx) + if (typeof effect.res === "object" && !Array.isArray(effect.res)) { + setSuccessRev(effect.res?._id as string) + Modal.showModal("success-modal") + } else { + setErrorMsg("Error occurred while creating chat") + Modal.showModal("error-modal") + } + } catch (err) { + if (err instanceof Error) { + setErrorMsg(err.message) + Modal.showModal("error-modal") + } + } + } + + return ( + <> +
+

Create a new Chat

+
+ + setName(e.target.value)} + className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + /> +
+ +
+ + + + ) +} diff --git a/packages/chat-vite/src/components/Navbar.tsx b/packages/chat-vite/src/components/Navbar.tsx new file mode 100644 index 000000000..c027abafa --- /dev/null +++ b/packages/chat-vite/src/components/Navbar.tsx @@ -0,0 +1,278 @@ +import { Link } from "react-router-dom" +import { Modal, Auth, UtilsContext, Drawer } from "@bitcoin-computer/components" +import { useEffect, useState } from "react" +import { initFlowbite } from "flowbite" +import { Chain, Network } from "../types/common" + +const modalTitle = "Connect to Node" +const modalId = "unsupported-config-modal" + +function formatChainAndNetwork(chain: Chain, network: Network) { + const map = { + mainnet: "", + testnet: "t", + regtest: "r" + } + const prefix = map[network] + return `${prefix}${chain}` +} + +function ModalContent() { + const [url, setUrl] = useState("") + function setNetwork(e: React.SyntheticEvent) { + e.preventDefault() + localStorage.setItem("URL", url) + } + + function closeModal() { + Modal.get(modalId).hide() + } + + return ( +
+
+
+ + + setUrl(e.target.value)} + value={url} + type="text" + name="url" + id="url" + className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white" + placeholder="http://127.0.0.1:1031" + required + /> + + +
+
+ +
+ + +
+
+ ) +} + +function SignInItem() { + return ( +
  • + +
  • + ) +} + +export function NotLoggedMenu() { + const [dropDownLabel, setDropDownLabel] = useState("LTC") + const { showSnackBar } = UtilsContext.useUtilsComponents() + + useEffect(() => { + initFlowbite() + + const { chain, network } = Auth.defaultConfiguration() + setDropDownLabel(formatChainAndNetwork(chain, network)) + }, []) + + const setChainAndNetwork = (chain: Chain, network: Network) => { + try { + localStorage.setItem("CHAIN", chain) + localStorage.setItem("NETWORK", network) + setDropDownLabel(formatChainAndNetwork(chain, network)) + window.location.href = "/" + } catch (err) { + showSnackBar("Error setting chain and network", false) + Modal.get(modalId).show() + } + } + + function CoinSelectionItem({ chain, network }: { chain: Chain; network: Network }) { + return ( +
  • +
    setChainAndNetwork(chain, network)} + className="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white" + > + {chain} {network} +
    +
  • + ) + } + + return ( + <> + +
      +
    • + + +
    • + + +
    + + ) +} + +function WalletItem() { + return ( +
  • + +
  • + ) +} + +const capitalizeFirstLetter = (s: string) => s.charAt(0).toUpperCase() + s.slice(1) + +function Item({ dest }: { dest: string }) { + return ( + + + {capitalizeFirstLetter(dest)} + + + ) +} + +export function LoggedInMenu() { + return ( +
      + + +
    + ) +} + +function NavbarDropdownButton() { + return ( + + ) +} + +export function Logo({ name = "Bitcoin Computer CRA Template" }) { + return ( + + Bitcoin Computer Logo + + {name} + + + ) +} + +export function Navbar() { + useEffect(() => { + initFlowbite() + }, []) + + return ( + <> + + + ) +} diff --git a/packages/chat-vite/src/constants/modSpecs.ts b/packages/chat-vite/src/constants/modSpecs.ts new file mode 100644 index 000000000..09a5f62d1 --- /dev/null +++ b/packages/chat-vite/src/constants/modSpecs.ts @@ -0,0 +1,2 @@ +const { VITE_CHAT_MOD_SPEC } = import.meta.env +export { VITE_CHAT_MOD_SPEC } diff --git a/packages/chat-vite/src/contracts/chat.ts b/packages/chat-vite/src/contracts/chat.ts new file mode 100644 index 000000000..9ae7a2c46 --- /dev/null +++ b/packages/chat-vite/src/contracts/chat.ts @@ -0,0 +1,19 @@ +export class ChatSc extends Contract { + messages!: string[] + channelName!: string + constructor(channelName: string, publicKey: string) { + super({ + messages: [], + channelName, + _owners: [publicKey] + }) + } + + post(message: string) { + this.messages.push(message) + } + + invite(publicKey: string) { + this._owners.push(publicKey) + } +} diff --git a/packages/chat-vite/src/contracts/counter.ts b/packages/chat-vite/src/contracts/counter.ts new file mode 100644 index 000000000..ab3f09338 --- /dev/null +++ b/packages/chat-vite/src/contracts/counter.ts @@ -0,0 +1,10 @@ +export class Counter extends Contract { + count!: number + constructor() { + super({ count: 0 }) + } + + inc() { + this.count += 1 + } +} diff --git a/packages/chat-vite/src/index.css b/packages/chat-vite/src/index.css new file mode 100644 index 000000000..e2ac8d522 --- /dev/null +++ b/packages/chat-vite/src/index.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", + "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; +} diff --git a/packages/chat-vite/src/main.tsx b/packages/chat-vite/src/main.tsx new file mode 100644 index 000000000..6f4ac9bcc --- /dev/null +++ b/packages/chat-vite/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/packages/chat-vite/src/setupTests.ts b/packages/chat-vite/src/setupTests.ts new file mode 100644 index 000000000..3f925457f --- /dev/null +++ b/packages/chat-vite/src/setupTests.ts @@ -0,0 +1,3 @@ +import * as matchers from "@testing-library/jest-dom/matchers"; + +expect.extend(matchers); diff --git a/packages/chat-vite/src/types/common.ts b/packages/chat-vite/src/types/common.ts new file mode 100644 index 000000000..58276575f --- /dev/null +++ b/packages/chat-vite/src/types/common.ts @@ -0,0 +1,2 @@ +export type Chain = "LTC" | "BTC" | "DOGE" | "PEPE" +export type Network = "testnet" | "mainnet" | "regtest" diff --git a/packages/chat-vite/src/vite-env.d.ts b/packages/chat-vite/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/packages/chat-vite/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/chat-vite/tailwind.config.js b/packages/chat-vite/tailwind.config.js new file mode 100644 index 000000000..40183bda5 --- /dev/null +++ b/packages/chat-vite/tailwind.config.js @@ -0,0 +1,19 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/**/*.{js,jsx,ts,tsx}", "../components/built/**/*.{js,jsx,ts,tsx}"], + darkMode: "media", + theme: { + extend: { + colors: { + "blue-1": "#000F38", + "blue-2": "#002A99", + "blue-3": "#0046FF", + "blue-4": "#A7BFFF" + }, + height: { + 120: "36rem" + } + } + }, + plugins: [] +} diff --git a/packages/chat-vite/tsconfig.json b/packages/chat-vite/tsconfig.json new file mode 100644 index 000000000..21d8316bc --- /dev/null +++ b/packages/chat-vite/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": false, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "types": ["vitest/globals", "@testing-library/jest-dom"], + + /* Bundler mode */ + "moduleResolution": "node", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/packages/chat-vite/vite.config.ts b/packages/chat-vite/vite.config.ts new file mode 100644 index 000000000..fa48d77f8 --- /dev/null +++ b/packages/chat-vite/vite.config.ts @@ -0,0 +1,28 @@ +/// +/// + +import { defineConfig, loadEnv } from "vite" +import react from "@vitejs/plugin-react" +import path from "path" + +// https://vitejs.dev/config/ +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd(), "") + return { + plugins: [react()], + resolve: { + alias: { + // Define the alias pointing to the specific entry point in node_modules + "@bitcoin-computer/lib": path.resolve(__dirname, "../lib/dist/bc-lib.browser.min.mjs") + } + }, + server: { + port: parseInt(env.VITE_PORT) + }, + test: { + globals: true, + environment: "jsdom", + setupFiles: ["./src/setupTests.ts"] + } + } +}) diff --git a/scripts/check-obfuscation.sh b/scripts/check-obfuscation.sh index 225c9ad92..4e971cdec 100755 --- a/scripts/check-obfuscation.sh +++ b/scripts/check-obfuscation.sh @@ -1,7 +1,7 @@ #!/bin/bash # List of folders to skip -skip_folders=("vite-template" "nft-vite" "explorer-vite" "wallet-vite") +skip_folders=("vite-template" "nft-vite" "explorer-vite" "wallet-vite" "chat-vite") # Check if the obfuscation was successful on all dist folders msg="Checking obfuscation ..." From 9337275a7b7145696b04841f4f51368b471f0bf6 Mon Sep 17 00:00:00 2001 From: jonty007 Date: Wed, 9 Oct 2024 15:06:46 +0530 Subject: [PATCH 2/6] Made fixes for chat app --- packages/chat-vite/src/App.tsx | 2 ++ packages/chat-vite/src/components/Chat.tsx | 21 +++++++------------- packages/chat-vite/src/components/Chats.tsx | 12 ++++++++--- packages/chat-vite/src/components/Navbar.tsx | 18 +---------------- 4 files changed, 19 insertions(+), 34 deletions(-) diff --git a/packages/chat-vite/src/App.tsx b/packages/chat-vite/src/App.tsx index 5381d4736..350a432d5 100644 --- a/packages/chat-vite/src/App.tsx +++ b/packages/chat-vite/src/App.tsx @@ -13,6 +13,7 @@ import { } from "@bitcoin-computer/components" import Mint from "./components/Mint" import { Chats } from "./components/Chats" +import { Navbar } from "./components/Navbar" export default function App() { const [computer] = useState(Auth.getComputer()) @@ -28,6 +29,7 @@ export default function App() { +
    } /> diff --git a/packages/chat-vite/src/components/Chat.tsx b/packages/chat-vite/src/components/Chat.tsx index 77f50e6ff..f2dbfe5d5 100644 --- a/packages/chat-vite/src/components/Chat.tsx +++ b/packages/chat-vite/src/components/Chat.tsx @@ -2,7 +2,6 @@ import { ComputerContext, Modal, sleep, UtilsContext } from "@bitcoin-computer/c import { useContext, useEffect, useState } from "react" import { useNavigate } from "react-router-dom" import { HiRefresh, HiUserAdd } from "react-icons/hi" -import { HiWallet } from "react-icons/hi2" import { ChatSc } from "../contracts/chat" const addUserModal = "add-user-modal" @@ -199,14 +198,6 @@ const ChatHeader = ({ className="w-6 h-6 cursor-pointer hover:opacity-80 dark:hover:opacity-80" style={{ color: "#999999" }} /> -
    Promise }) => { @@ -241,7 +232,9 @@ const ChatInput = ({ publicKey: computer.getPublicKey(), time: Date.now().toString() } - await chatObj?.post(JSON.stringify(messageData)) + const latesRev = await computer.getLatestRev(chatId) + const chatObj = (await computer.sync(latesRev)) as ChatSc + await chatObj.post(JSON.stringify(messageData)) await sleep(2000) await refreshChat() setMessage("") @@ -341,7 +334,7 @@ export function Chat({ chatId }: { chatId: string }) { diff --git a/packages/chat-vite/src/components/Chats.tsx b/packages/chat-vite/src/components/Chats.tsx index 3457cda1e..35f806dec 100644 --- a/packages/chat-vite/src/components/Chats.tsx +++ b/packages/chat-vite/src/components/Chats.tsx @@ -1,6 +1,6 @@ import { Auth, ComputerContext, Modal, UtilsContext } from "@bitcoin-computer/components" import { useContext, useEffect, useState } from "react" -import { useNavigate, useParams, Link } from "react-router-dom" +import { useNavigate, useParams } from "react-router-dom" import { HiPlusCircle } from "react-icons/hi" import { VITE_CHAT_MOD_SPEC } from "../constants/modSpecs" @@ -93,8 +93,14 @@ export function Chats() { chatsPromise.push(computer.sync(rev) as Promise) }) - Promise.all(chatsPromise).then((data) => { - setChats(data) + Promise.allSettled(chatsPromise).then((results) => { + const successfulChats = results + .filter( + (result): result is PromiseFulfilledResult => result.status === "fulfilled" + ) + .map((result) => result.value) + + setChats(successfulChats) }) } fetch() diff --git a/packages/chat-vite/src/components/Navbar.tsx b/packages/chat-vite/src/components/Navbar.tsx index c027abafa..405a5378a 100644 --- a/packages/chat-vite/src/components/Navbar.tsx +++ b/packages/chat-vite/src/components/Navbar.tsx @@ -193,25 +193,9 @@ function WalletItem() { ) } -const capitalizeFirstLetter = (s: string) => s.charAt(0).toUpperCase() + s.slice(1) - -function Item({ dest }: { dest: string }) { - return ( - - - {capitalizeFirstLetter(dest)} - - - ) -} - export function LoggedInMenu() { return (
      -
    ) @@ -246,7 +230,7 @@ function NavbarDropdownButton() { ) } -export function Logo({ name = "Bitcoin Computer CRA Template" }) { +export function Logo({ name = "Bitcoin Computer Chat" }) { return ( Bitcoin Computer Logo From 2d04cf2ba4afc6313efb73e66fbeab322eeed885 Mon Sep 17 00:00:00 2001 From: jonty007 Date: Fri, 11 Oct 2024 16:32:57 +0530 Subject: [PATCH 3/6] made UI fixed & renamed chat-vite to chat --- packages/chat-vite/.gitignore | 22 --- packages/chat-vite/.prettierrc | 6 - packages/chat-vite/README.md | 92 ------------ packages/chat-vite/package.json | 42 ------ packages/chat-vite/src/index.css | 14 -- packages/{chat-vite => chat}/.env.example | 0 packages/chat/.eslintrc | 25 ---- packages/chat/.gitignore | 1 + packages/chat/.prettierrc | 2 +- packages/chat/README.md | 1 + packages/{chat-vite => chat}/eslint.config.js | 0 packages/chat/imgs/chat-screen.png | Bin 147506 -> 0 bytes packages/{chat-vite => chat}/index.html | 0 packages/chat/package.json | 67 +++++---- .../{chat-vite => chat}/postcss.config.js | 0 .../public/BitcoinComputer-Logo.png | Bin packages/chat/public/favicon.ico | Bin 15406 -> 0 bytes packages/chat/public/index.html | 43 ------ packages/{chat-vite => chat}/public/logo.png | Bin packages/chat/public/logo192.png | Bin 5347 -> 0 bytes packages/chat/public/logo512.png | Bin 9664 -> 0 bytes packages/chat/public/manifest.json | 25 ---- packages/chat/public/robots.txt | 3 - packages/{chat-vite => chat}/public/vite.svg | 0 .../{chat-vite => chat}/scripts/deploy.ts | 0 packages/{chat-vite => chat}/src/App.css | 0 packages/chat/src/App.js | 67 --------- packages/chat/src/App.test.js | 9 -- packages/{chat-vite => chat}/src/App.test.tsx | 0 packages/{chat-vite => chat}/src/App.tsx | 0 packages/chat/src/Chat.js | 56 ------- packages/chat/src/InviteUser.js | 22 --- packages/chat/src/Login.js | 82 ---------- packages/chat/src/SideBar.js | 43 ------ packages/chat/src/StartChat.js | 40 ----- packages/chat/src/Wallet.js | 35 ----- .../{chat-vite => chat}/src/assets/react.svg | 0 packages/chat/src/chat-sc.js | 17 --- .../src/components/Assets.tsx | 0 .../src/components/Chat.tsx | 19 ++- .../src/components/Chats.tsx | 12 +- .../src/components/Mint.tsx | 0 .../src/components/Navbar.tsx | 0 .../src/constants/modSpecs.ts | 0 .../{chat-vite => chat}/src/contracts/chat.ts | 0 .../src/contracts/counter.ts | 0 packages/chat/src/index.css | 73 +-------- packages/chat/src/index.js | 18 --- packages/chat/src/logo.svg | 7 - packages/{chat-vite => chat}/src/main.tsx | 0 packages/chat/src/serviceWorker.js | 141 ------------------ packages/chat/src/setupTests.js | 5 - .../{chat-vite => chat}/src/setupTests.ts | 0 .../{chat-vite => chat}/src/types/common.ts | 0 packages/chat/src/useInterval.js | 22 --- packages/chat/src/utils.js | 6 - .../{chat-vite => chat}/src/vite-env.d.ts | 0 .../{chat-vite => chat}/tailwind.config.js | 0 packages/{chat-vite => chat}/tsconfig.json | 0 packages/{chat-vite => chat}/vite.config.ts | 0 60 files changed, 64 insertions(+), 953 deletions(-) delete mode 100644 packages/chat-vite/.gitignore delete mode 100644 packages/chat-vite/.prettierrc delete mode 100644 packages/chat-vite/README.md delete mode 100644 packages/chat-vite/package.json delete mode 100644 packages/chat-vite/src/index.css rename packages/{chat-vite => chat}/.env.example (100%) delete mode 100644 packages/chat/.eslintrc rename packages/{chat-vite => chat}/eslint.config.js (100%) delete mode 100644 packages/chat/imgs/chat-screen.png rename packages/{chat-vite => chat}/index.html (100%) rename packages/{chat-vite => chat}/postcss.config.js (100%) rename packages/{chat-vite => chat}/public/BitcoinComputer-Logo.png (100%) delete mode 100644 packages/chat/public/favicon.ico delete mode 100644 packages/chat/public/index.html rename packages/{chat-vite => chat}/public/logo.png (100%) delete mode 100644 packages/chat/public/logo192.png delete mode 100644 packages/chat/public/logo512.png delete mode 100644 packages/chat/public/manifest.json delete mode 100644 packages/chat/public/robots.txt rename packages/{chat-vite => chat}/public/vite.svg (100%) rename packages/{chat-vite => chat}/scripts/deploy.ts (100%) rename packages/{chat-vite => chat}/src/App.css (100%) delete mode 100644 packages/chat/src/App.js delete mode 100644 packages/chat/src/App.test.js rename packages/{chat-vite => chat}/src/App.test.tsx (100%) rename packages/{chat-vite => chat}/src/App.tsx (100%) delete mode 100644 packages/chat/src/Chat.js delete mode 100644 packages/chat/src/InviteUser.js delete mode 100644 packages/chat/src/Login.js delete mode 100644 packages/chat/src/SideBar.js delete mode 100644 packages/chat/src/StartChat.js delete mode 100644 packages/chat/src/Wallet.js rename packages/{chat-vite => chat}/src/assets/react.svg (100%) delete mode 100644 packages/chat/src/chat-sc.js rename packages/{chat-vite => chat}/src/components/Assets.tsx (100%) rename packages/{chat-vite => chat}/src/components/Chat.tsx (93%) rename packages/{chat-vite => chat}/src/components/Chats.tsx (93%) rename packages/{chat-vite => chat}/src/components/Mint.tsx (100%) rename packages/{chat-vite => chat}/src/components/Navbar.tsx (100%) rename packages/{chat-vite => chat}/src/constants/modSpecs.ts (100%) rename packages/{chat-vite => chat}/src/contracts/chat.ts (100%) rename packages/{chat-vite => chat}/src/contracts/counter.ts (100%) delete mode 100644 packages/chat/src/index.js delete mode 100644 packages/chat/src/logo.svg rename packages/{chat-vite => chat}/src/main.tsx (100%) delete mode 100644 packages/chat/src/serviceWorker.js delete mode 100644 packages/chat/src/setupTests.js rename packages/{chat-vite => chat}/src/setupTests.ts (100%) rename packages/{chat-vite => chat}/src/types/common.ts (100%) delete mode 100644 packages/chat/src/useInterval.js delete mode 100644 packages/chat/src/utils.js rename packages/{chat-vite => chat}/src/vite-env.d.ts (100%) rename packages/{chat-vite => chat}/tailwind.config.js (100%) rename packages/{chat-vite => chat}/tsconfig.json (100%) rename packages/{chat-vite => chat}/vite.config.ts (100%) diff --git a/packages/chat-vite/.gitignore b/packages/chat-vite/.gitignore deleted file mode 100644 index 9aad0ad64..000000000 --- a/packages/chat-vite/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build -/dist - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -*.log* diff --git a/packages/chat-vite/.prettierrc b/packages/chat-vite/.prettierrc deleted file mode 100644 index b7a412b57..000000000 --- a/packages/chat-vite/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "printWidth": 100, - "semi": false, - "singleQuote": false, - "trailingComma": "none" -} diff --git a/packages/chat-vite/README.md b/packages/chat-vite/README.md deleted file mode 100644 index 34cc2597d..000000000 --- a/packages/chat-vite/README.md +++ /dev/null @@ -1,92 +0,0 @@ -
    - -## Prerequisites - -You need to have [git](https://www.git-scm.com/) and [node.js](https://nodejs.org/) installed. - -## Installation - - - -```sh -# Download the monorepo -git clone https://github.com/bitcoin-computer/monorepo.git - -# Move into monorepo folder -cd monorepo - -# Install the dependencies -npm install -``` - - - -## Usage - -Most of the api is documented in the [Create React App Readme](https://github.com/facebook/create-react-app). - -### Start the Application - -To start the application run the command below and open [http://localhost:3000](http://localhost:3000). - - - -```bash -# Move to the package -cd packages/cra-template - -# Install the dependencies -npm install - -# Use the default environment variables -cp .env.example .env - -# Start the app -npm run start -``` - - - -## Documentation - -Have a look at the [docs](https://docs.bitcoincomputer.io/) for the Bitcoin Computer. - -## Getting Help - -If you have any questions, please let us know on Telegram, Twitter, or by email clemens@bitcoincomputer.io. - -## Development Status -See [here](https://github.com/bitcoin-computer/monorepo/tree/main/packages/lib#development-status). - -## Price - -See [here](https://github.com/bitcoin-computer/monorepo/tree/main/packages/lib#price). - -## Contributing - -This project is intended as a starting point for new development so we want to keep it simple. If you have found a bug please create an [issue](https://github.com/bitcoin-computer/monorepo/issues). If you have a bug fix or a UX improvement please create a pull request [here](https://github.com/bitcoin-computer/monorepo/pulls). - -If you want to add a feature we recommend to create a fork. Let us know if you have built something cool and we can link to your project. - -## Legal Notice - -See [here](https://github.com/bitcoin-computer/monorepo/tree/main/packages/lib#legal-notice). - -## MIT License - -Copyright (c) 2022 BCDB Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -[node]: https://github.com/bitcoin-computer/monorepo/tree/main/packages/node diff --git a/packages/chat-vite/package.json b/packages/chat-vite/package.json deleted file mode 100644 index b80be8459..000000000 --- a/packages/chat-vite/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "chat-vite", - "private": true, - "version": "0.21.0-beta.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "lint": "eslint .", - "preview": "vite preview", - "test": "vitest", - "deploy": "node --loader ts-node/esm scripts/deploy.ts" - }, - "dependencies": { - "@bitcoin-computer/components": "^0.21.0-beta.0", - "@bitcoin-computer/lib": "^0.21.0-beta.0", - "flowbite": "^2.3.0", - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@eslint/js": "^9.9.0", - "@testing-library/jest-dom": "^6.5.0", - "@testing-library/react": "^16.0.1", - "@testing-library/user-event": "^14.5.2", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.1", - "autoprefixer": "^10.4.20", - "eslint": "^9.9.0", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.9", - "globals": "^15.9.0", - "jsdom": "^25.0.0", - "postcss": "^8.4.44", - "tailwindcss": "^3.4.10", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", - "vite": "^5.4.1", - "vitest": "^2.0.5" - } -} diff --git a/packages/chat-vite/src/index.css b/packages/chat-vite/src/index.css deleted file mode 100644 index e2ac8d522..000000000 --- a/packages/chat-vite/src/index.css +++ /dev/null @@ -1,14 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", - "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; -} diff --git a/packages/chat-vite/.env.example b/packages/chat/.env.example similarity index 100% rename from packages/chat-vite/.env.example rename to packages/chat/.env.example diff --git a/packages/chat/.eslintrc b/packages/chat/.eslintrc deleted file mode 100644 index 669d4a8f8..000000000 --- a/packages/chat/.eslintrc +++ /dev/null @@ -1,25 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": ["airbnb-base", "prettier"], - "plugins": [], - "env": { - "jest": true - }, - "globals": { - "document": true, - "window": true - }, - "rules": { - "semi": ["error", "never"], - "import/extensions": "off", - "lines-between-class-members": "off", - "import/prefer-default-export": "off", - "no-underscore-dangle": [ - "error", - { - "allowAfterThis": true, - "allow": ["_readers", "_owners", "_amount", "_id", "_rev", "_root"] - } - ] - } -} diff --git a/packages/chat/.gitignore b/packages/chat/.gitignore index 274ff2da6..9aad0ad64 100644 --- a/packages/chat/.gitignore +++ b/packages/chat/.gitignore @@ -10,6 +10,7 @@ # production /build +/dist # misc .DS_Store diff --git a/packages/chat/.prettierrc b/packages/chat/.prettierrc index a65b64ade..b7a412b57 100644 --- a/packages/chat/.prettierrc +++ b/packages/chat/.prettierrc @@ -1,6 +1,6 @@ { "printWidth": 100, "semi": false, - "singleQuote": true, + "singleQuote": false, "trailingComma": "none" } diff --git a/packages/chat/README.md b/packages/chat/README.md index 04ec1d2e2..e9da1ab96 100644 --- a/packages/chat/README.md +++ b/packages/chat/README.md @@ -57,6 +57,7 @@ Have a look at the [docs](https://docs.bitcoincomputer.io/) for the Bitcoin Comp If you have any questions, please let us know on Telegram, Twitter, or by email clemens@bitcoincomputer.io. ## Development Status + See [here](https://github.com/bitcoin-computer/monorepo/tree/main/packages/lib#development-status). ## Price diff --git a/packages/chat-vite/eslint.config.js b/packages/chat/eslint.config.js similarity index 100% rename from packages/chat-vite/eslint.config.js rename to packages/chat/eslint.config.js diff --git a/packages/chat/imgs/chat-screen.png b/packages/chat/imgs/chat-screen.png deleted file mode 100644 index d0cc04bdeadc3fab99af13e5c4b7dd8d0b0368d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147506 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

    J8oL9 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%0AUfUuQ^tAnFve6KL3=pK(s+ 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%0DFW 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�$B$)ij{#N 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.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] + "dependencies": { + "@bitcoin-computer/components": "^0.21.0-beta.0", + "@bitcoin-computer/lib": "^0.21.0-beta.0", + "flowbite": "^2.3.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "devDependencies": { - "@babel/plugin-proposal-private-property-in-object": "^7.21.11" + "@eslint/js": "^9.9.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", + "jsdom": "^25.0.0", + "postcss": "^8.4.44", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.1", + "vite": "^5.4.1", + "vitest": "^2.0.5" } } diff --git a/packages/chat-vite/postcss.config.js b/packages/chat/postcss.config.js similarity index 100% rename from packages/chat-vite/postcss.config.js rename to packages/chat/postcss.config.js diff --git a/packages/chat-vite/public/BitcoinComputer-Logo.png b/packages/chat/public/BitcoinComputer-Logo.png similarity index 100% rename from packages/chat-vite/public/BitcoinComputer-Logo.png rename to packages/chat/public/BitcoinComputer-Logo.png diff --git a/packages/chat/public/favicon.ico b/packages/chat/public/favicon.ico deleted file mode 100644 index e6e12e61732aa74d83625bdb1c7f34c776a27345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 zcmeI3dyEy;9mju_`lz)P6s%I3Zd7!ORIn;)5W2|j+!e%EBSuXv1Y%8FY+8*PpKC)+ zXkr^hj1O4f{vjwDNqh#>p!N^60*axj25VcyHwucp#?SZ6%NL<{rMAZgx_IvfR}vF-T~g?`3c&Kc(;E!CjJTb9dP~zYytc-@Gkx5`BEwN=O1l* z)BkuGnqpo%{DNH?BRA-7iqURI-!DqQqtCOQA>KCLPZAG!jpBK0*uRD6Q#H;KXtTlK zXnc`AYy7ip5Af&4`rh{2jM+&3^G~ud;72;_^xLff?V29?4$DLD!)p$-8dsoGe)@&b z_Rd#cde0U?|Ie!B7wiUTZ>ySKbJcFgL%%)bv6=ZC#~kcc0)c;C+apVUO`m3pzPn@n z@_`RZz@yKz9UvpE}{J^aJJuREtS?Yd*qcD;rqwg z_u+Fn@ZX9uqcvXKcG&08Jq(O2j;oQ3axJwiqTWWt^hYkmcpIUI$Ud9)YhksaZ( zmVSqEZtv+k|J%v9FLv>lya@UCCeA?zXQ(zCmN)J? zzKX5Exil&MZ$SQ`5nue^1aLo1&_T3Mx}5q%8{}sNeih^=NgDn5TM9lFWEtn2(JIUuS?Mf5@xPXN>8Zym=I|e}o;n zX*U6RWeQ(8)+@lItY@FN9rP?Z)?ORD7Q#pQcNTl7W~DvlH;j9~VxHCfmd_x2IPhyg zXYWAQp7N zb5vi=huepBCMwuWY^FN@W}sM~T7GN)Q*4?A|Dp2BiiXVb(&cih`4;R>_`geAu9i`Y z{-RY}|A2N8GTQU*D@jArzR2933D1{-q@1Z%os;P0k1H9&FR90*?#oGftB*O{2OiVm z^%hW#e<$gdwNH7p&d;-GbMJM|?w-wHKG#CuSN@V^EUNKdLd?y)Z-TogI!_Jl-bmdw zKIQc5@ZlL*YThodQBBXYSAi_{*%dhQCHX;nT3q7&F!WY!FZqnoxG|}=`2=u8{CpK( zyWv@D7P@OsO0(-$=2d3_`Dbk)K7|Uko?cy)Z+8KSdo@0GB=7zKq{SNXxsTjoGI`I0 zn!&RUY;gxXRokv)H~G=){vDl$rr}>TcfVyNeX!C&>Bw3xk>an2^zxca+4&W1p9KcHN_IlT!^#2Tf{@`+j z4!e$L<$TSgzs^3lxE!;?9^yI8_xqdui-&ka}2uc+o|T$Uo~9ioCWS;no)nKMHH%SD}BJ5A_%Qbq>B+z8{|5ltb$->&*;4wAg(cpevC& z|Dn@Cz$5r_+FrCCywl=!6xP9D`tCsgv^-R`m20Uv{2)$W>rnj3+`;Q!J*at>kAu1! z>EK=m{J2baFQNKYa9>xRK8UgJfp;A+oN*7U8B}}dv_GP|?q$+!FPu}7Z0F80y2tiR zXPZi6kc^MeU-uZ#)&Z8oL-Sfmrrzm$rrQ{2*?Kg7F@pEcfS2Y+X|n45UN%#0ZG5HL zjqabY>sjEH`);w`dS&JJAwD)u`&HcUlb+q4tZ&JKIZgA&tn#bJE4Vwp*?H>jCaOEm>g`uOt!l0FSd#}Q#hWDGDehz3Ls-w(z(;Xw zSFLH)`gQkpJ$`Utu}*n^yY#@m0*kr2aI*T5) z;JBLUB)%n3{WSRhnJ1CIF4RTmINhU5w*d4U{MMZ5y~eEX{+7}H1(@P;!i@h%Qj6|! zS~m{OM{svC4m~aaZUyvhiT1yZ*i?J|M&RGT3%~+EchVDpL-CV+bOwp@{pR@_3+ze@ Fd<7>V&)@(6 diff --git a/packages/chat/public/index.html b/packages/chat/public/index.html deleted file mode 100644 index 606576c7a..000000000 --- a/packages/chat/public/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - React App - - - -

    - - - diff --git a/packages/chat-vite/public/logo.png b/packages/chat/public/logo.png similarity index 100% rename from packages/chat-vite/public/logo.png rename to packages/chat/public/logo.png diff --git a/packages/chat/public/logo192.png b/packages/chat/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/packages/chat/public/manifest.json b/packages/chat/public/manifest.json deleted file mode 100644 index 080d6c77a..000000000 --- a/packages/chat/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/packages/chat/public/robots.txt b/packages/chat/public/robots.txt deleted file mode 100644 index e9e57dc4d..000000000 --- a/packages/chat/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/packages/chat-vite/public/vite.svg b/packages/chat/public/vite.svg similarity index 100% rename from packages/chat-vite/public/vite.svg rename to packages/chat/public/vite.svg diff --git a/packages/chat-vite/scripts/deploy.ts b/packages/chat/scripts/deploy.ts similarity index 100% rename from packages/chat-vite/scripts/deploy.ts rename to packages/chat/scripts/deploy.ts diff --git a/packages/chat-vite/src/App.css b/packages/chat/src/App.css similarity index 100% rename from packages/chat-vite/src/App.css rename to packages/chat/src/App.css diff --git a/packages/chat/src/App.js b/packages/chat/src/App.js deleted file mode 100644 index 097805ede..000000000 --- a/packages/chat/src/App.js +++ /dev/null @@ -1,67 +0,0 @@ -import React, { useState } from 'react' -import { BrowserRouter as Router, Routes, Route } from 'react-router-dom' -import { Computer } from '@bitcoin-computer/lib' -import Wallet from './Wallet' -import Chat from './Chat' -import SideBar from './SideBar' -import useInterval from './useInterval' - -/** - * This is a simple chat app that demonstrates how to use the @bitcoin-computer/lib. - */ -function App() { - const getConf = () => ({ - chain: window.localStorage.getItem('CHAIN'), - // the BIP_39_KEY is set on login and we fetch it from local storage - mnemonic: window.localStorage.getItem('BIP_39_KEY') - }) - - // To connect the app to a local Bitcoin Computer node set "network" to "regtest" - const [config] = useState(getConf()) - const [computer, setComputer] = useState(null) - const [chats, setChats] = useState([]) - - useInterval(() => { - const isLoggedIn = config.mnemonic && config.chain - - // if you are currently logging in - if (isLoggedIn && !computer) { - setComputer(new Computer(config)) - // eslint-disable-next-line no-console - console.log(`Bitcoin Computer created on chain ${ config.chain}`) - // if you are currently logging out - } else if (!isLoggedIn && computer) { - // eslint-disable-next-line no-console - console.log('You have been logged out') - setComputer(null) - } - }, 5000) - - useInterval(() => { - const refresh = async () => { - if (computer) { - const revs = await computer.query({ publicKey: computer.getPublicKey() }) - setChats(await Promise.all(revs.map(async (rev) => computer.sync(rev)))) - } - } - refresh() - }, 7000) - - return ( - -
    - {/* bind the value of chain stored in the state to the child component */} - - - -
    - - } /> - -
    -
    -
    - ) -} - -export default App diff --git a/packages/chat/src/App.test.js b/packages/chat/src/App.test.js deleted file mode 100644 index 55d18b05a..000000000 --- a/packages/chat/src/App.test.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' -import { render } from '@testing-library/react' -import App from './App' - -test('renders learn react link', () => { - const { getByText } = render() - const linkElement = getByText(/Public Key/i) - expect(linkElement).toBeInTheDocument() -}) diff --git a/packages/chat-vite/src/App.test.tsx b/packages/chat/src/App.test.tsx similarity index 100% rename from packages/chat-vite/src/App.test.tsx rename to packages/chat/src/App.test.tsx diff --git a/packages/chat-vite/src/App.tsx b/packages/chat/src/App.tsx similarity index 100% rename from packages/chat-vite/src/App.tsx rename to packages/chat/src/App.tsx diff --git a/packages/chat/src/Chat.js b/packages/chat/src/Chat.js deleted file mode 100644 index c01465c93..000000000 --- a/packages/chat/src/Chat.js +++ /dev/null @@ -1,56 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { useParams } from 'react-router-dom' -import InviteUser from './InviteUser' - -function Chat({ computer }) { - const [message, setMessage] = useState('') - const [chat, setChat] = useState({ messages: [] }) - const [refresh, setRefresh] = useState(null) - - const { rev } = useParams() - - useEffect(() => { - const refreshChat = async () => { - if (computer) { - const [latestRev] = await computer.query({ ids: [rev] }) - setChat(await computer.sync(latestRev)) - } - } - refreshChat() - }, [rev, computer, refresh]) - - useEffect(() => { - setTimeout(() => setRefresh(refresh + 1), 5000) - }, [refresh]) - - const send = async (e) => { - e.preventDefault() - const username = window.localStorage.getItem('USER_NAME') - const line = `${username}: ${message}` - try { - await chat.post(line) - // eslint-disable-next-line no-console - console.log(`Sent message ${line}\n chat id ${chat._id}\n chat rev ${chat._rev}`) - } catch (error) { - if (error.message.startsWith('Insufficient balance in address')) { - // eslint-disable-next-line no-alert, no-undef - alert('You have to fund your wallet') - } - } - setMessage('') - } - - return ( -
    - -
    - -
    - setMessage(e.target.value)} /> - -
    -
    - ) -} - -export default Chat diff --git a/packages/chat/src/InviteUser.js b/packages/chat/src/InviteUser.js deleted file mode 100644 index 497c30234..000000000 --- a/packages/chat/src/InviteUser.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react' - -function InviteUser({ chat }) { - const inviteUser = async (e) => { - try { - e.preventDefault() - // eslint-disable-next-line no-alert, no-undef - const publicKey = prompt('Enter the public key of a friend and send them the url.') - await chat.invite(publicKey) - } catch (err) { - // eslint-disable-next-line no-console - console.log(err) - } - } - return ( -
    - -
    - ) -} - -export default InviteUser diff --git a/packages/chat/src/Login.js b/packages/chat/src/Login.js deleted file mode 100644 index 9313a0bec..000000000 --- a/packages/chat/src/Login.js +++ /dev/null @@ -1,82 +0,0 @@ -import React, { useState } from 'react' -import useInterval from './useInterval' - -function Login() { - const [password, setPassword] = useState('') - const [username, setUsername] = useState('') - const [loggedIn, setLoggedIn] = useState(false) - const [chain, setChain] = useState('LTC') - - useInterval(() => { - setLoggedIn(!!window.localStorage.getItem('BIP_39_KEY')) - }, 500) - - const login = (e) => { - e.preventDefault() - window.localStorage.setItem('BIP_39_KEY', password) - window.localStorage.setItem('USER_NAME', username) - window.localStorage.setItem('CHAIN', chain) - } - - const logout = (e) => { - e.preventDefault() - window.localStorage.removeItem('BIP_39_KEY') - window.localStorage.removeItem('USER_NAME') - window.localStorage.removeItem('CHAIN') - } - - return loggedIn ? ( - <> - -
    - - ) : ( -
    - ) -} - -export default Login diff --git a/packages/chat/src/SideBar.js b/packages/chat/src/SideBar.js deleted file mode 100644 index 4b9dfc293..000000000 --- a/packages/chat/src/SideBar.js +++ /dev/null @@ -1,43 +0,0 @@ -import React from 'react' -import { Link } from 'react-router-dom' -import StartChat from './StartChat' - -function SideBar({ chats, computer }) { - return ( -
    - -
    - {chats.map((object) => ( - - {object._id.substr(0, 16)} -
    -
    - ))} -
    - This chat runs on the -
    - - - Bitcoin Computer - - -
    - - - View on Github - - -
    -
    - ) -} - -export default SideBar diff --git a/packages/chat/src/StartChat.js b/packages/chat/src/StartChat.js deleted file mode 100644 index 84594043f..000000000 --- a/packages/chat/src/StartChat.js +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react' -import { useNavigate } from 'react-router-dom' -import ChatSc from './chat-sc' - -function StartChat({ computer }) { - const navigate = useNavigate() - - const createChat = async (e) => { - try { - e.preventDefault() - const publicKey = computer.getPublicKey() - // eslint-disable-next-line no-console - console.log('creating chat') - let chat - try { - if ((await computer.getBalance()).balance < 100) { - await computer.faucet(1e7) - } - chat = await computer.new(ChatSc, [publicKey]) - } catch (err) { - if (err.message.startsWith('Insufficient balance in address')) - // eslint-disable-next-line no-alert, no-undef - alert('You have to fund your wallet') - } - // eslint-disable-next-line no-console - console.log('created chat', chat) - navigate(`/chat/${chat._id}`) - } catch (err) { - // eslint-disable-next-line no-console - console.log('error creating chat', err) - } - } - return ( -
    - -
    - ) -} - -export default StartChat diff --git a/packages/chat/src/Wallet.js b/packages/chat/src/Wallet.js deleted file mode 100644 index 6e6caafc8..000000000 --- a/packages/chat/src/Wallet.js +++ /dev/null @@ -1,35 +0,0 @@ -import React, { useState } from 'react' -import Login from './Login' -import useInterval from './useInterval' - -function Wallet({ computer, chain }) { - const [balance, setBalance] = useState(0) - - useInterval(() => { - const getBalance = async () => { - if (computer) setBalance((await computer.getBalance()).balance) - } - getBalance() - }, 3000) - - return ( -
    - - Public Key {computer ? computer.getPublicKey() : ''} -
    -
    - - Balance {balance / 1e8} {chain} - - - Address {computer ? computer.getAddress() : ''} -
    -
    - - - -
    - ) -} - -export default Wallet diff --git a/packages/chat-vite/src/assets/react.svg b/packages/chat/src/assets/react.svg similarity index 100% rename from packages/chat-vite/src/assets/react.svg rename to packages/chat/src/assets/react.svg diff --git a/packages/chat/src/chat-sc.js b/packages/chat/src/chat-sc.js deleted file mode 100644 index c0c0c075f..000000000 --- a/packages/chat/src/chat-sc.js +++ /dev/null @@ -1,17 +0,0 @@ -// eslint-disable-next-line no-undef -export default class ChatSc extends Contract { - constructor(publicKey) { - super({ - messages: [], - _owners: [publicKey], - }) - } - - post(message) { - this.messages.push(message) - } - - invite(publicKey) { - this._owners.push(publicKey) - } -} diff --git a/packages/chat-vite/src/components/Assets.tsx b/packages/chat/src/components/Assets.tsx similarity index 100% rename from packages/chat-vite/src/components/Assets.tsx rename to packages/chat/src/components/Assets.tsx diff --git a/packages/chat-vite/src/components/Chat.tsx b/packages/chat/src/components/Chat.tsx similarity index 93% rename from packages/chat-vite/src/components/Chat.tsx rename to packages/chat/src/components/Chat.tsx index f2dbfe5d5..6e147d4ee 100644 --- a/packages/chat-vite/src/components/Chat.tsx +++ b/packages/chat/src/components/Chat.tsx @@ -62,15 +62,15 @@ const formatTime = (str: string) => { const ReceivedMessage = ({ message }: { message: messageI }) => { return ( -
    +
    {getInitialsFromPublicKey(message.publicKey)}
    -
    -

    {message.text}

    +
    +

    {message.text}

    {formatTime(message.time)} @@ -81,9 +81,9 @@ const ReceivedMessage = ({ message }: { message: messageI }) => { const SentMessage = ({ message }: { message: messageI }) => { return ( -
    -
    -

    {message.text}

    +
    +
    +

    {message.text}

    {formatTime(message.time)} @@ -313,8 +313,11 @@ export function Chat({ chatId }: { chatId: string }) { return ( <> -
    -
    +
    +
    {chatObj && ( <> -
    +
    -
    +
    @@ -153,7 +159,7 @@ export function Chats() {
    -
    +
    {chatId ? ( ) : ( diff --git a/packages/chat-vite/src/components/Mint.tsx b/packages/chat/src/components/Mint.tsx similarity index 100% rename from packages/chat-vite/src/components/Mint.tsx rename to packages/chat/src/components/Mint.tsx diff --git a/packages/chat-vite/src/components/Navbar.tsx b/packages/chat/src/components/Navbar.tsx similarity index 100% rename from packages/chat-vite/src/components/Navbar.tsx rename to packages/chat/src/components/Navbar.tsx diff --git a/packages/chat-vite/src/constants/modSpecs.ts b/packages/chat/src/constants/modSpecs.ts similarity index 100% rename from packages/chat-vite/src/constants/modSpecs.ts rename to packages/chat/src/constants/modSpecs.ts diff --git a/packages/chat-vite/src/contracts/chat.ts b/packages/chat/src/contracts/chat.ts similarity index 100% rename from packages/chat-vite/src/contracts/chat.ts rename to packages/chat/src/contracts/chat.ts diff --git a/packages/chat-vite/src/contracts/counter.ts b/packages/chat/src/contracts/counter.ts similarity index 100% rename from packages/chat-vite/src/contracts/counter.ts rename to packages/chat/src/contracts/counter.ts diff --git a/packages/chat/src/index.css b/packages/chat/src/index.css index abf5213eb..e2ac8d522 100644 --- a/packages/chat/src/index.css +++ b/packages/chat/src/index.css @@ -1,73 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", + "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - line-height: 1.4; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} - -.sidebar { - margin: 68px 8px 8px 8px; - height: calc(100vh - 80px); - width: 165px; - position: fixed; - z-index: 1; - top: 0; - left: 0; - background-color: #fff; - overflow-x: hidden; - line-height: 1.5 -} - -.main { - margin: 40px 0px 5px 180px; -} - -.flex { - display: flex; - justify-content: space-between; -} - -textarea { - width: calc(100vw - 200px); - height: calc(100vh - 160px); -} - -input { - width: calc(100vw - 257px); - margin-right: 5px; -} - -.login-screen { - height: 100%; - width: 100%; - position: fixed; - z-index: 2; - top: 0; - left: 0; - background-color: #fff; - display: flex; - justify-content: center; - align-items: center; -} - -.login-screen input { - width: 400px; - margin: 5px 0; -} - -.login-screen button { - width: 100px; - margin: 5px 0; -} - -.branding { - position: absolute; - bottom: 0; + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } diff --git a/packages/chat/src/index.js b/packages/chat/src/index.js deleted file mode 100644 index a74bc0c80..000000000 --- a/packages/chat/src/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import './index.css' -import App from './App' -import * as serviceWorker from './serviceWorker' - -const root = ReactDOM.createRoot(document.getElementById('root')) - -root.render( - - - , -) - -// If you want your app to work offline and load faster, you can change -// unregister() to register() below. Note this comes with some pitfalls. -// Learn more about service workers: https://bit.ly/CRA-PWA -serviceWorker.unregister() diff --git a/packages/chat/src/logo.svg b/packages/chat/src/logo.svg deleted file mode 100644 index 6b60c1042..000000000 --- a/packages/chat/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/packages/chat-vite/src/main.tsx b/packages/chat/src/main.tsx similarity index 100% rename from packages/chat-vite/src/main.tsx rename to packages/chat/src/main.tsx diff --git a/packages/chat/src/serviceWorker.js b/packages/chat/src/serviceWorker.js deleted file mode 100644 index f3141a123..000000000 --- a/packages/chat/src/serviceWorker.js +++ /dev/null @@ -1,141 +0,0 @@ -/* eslint-disable no-use-before-define */ -/* eslint-disable no-param-reassign */ -/* eslint-disable no-console */ -/* eslint-disable no-undef */ -// This optional code is used to register a service worker. -// register() is not called by default. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on subsequent visits to a page, after all the -// existing tabs open on the page have been closed, since previously cached -// resources are updated in the background. - -// To learn more about the benefits of this model and instructions on how to -// opt-in, read https://bit.ly/CRA-PWA - -const isLocalhost = Boolean( - window.location.hostname === 'localhost' || - // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || - // 127.0.0.0/8 are considered localhost for IPv4. - window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/), -) - -export function register(config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href) - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return - } - - window.addEventListener('load', () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js` - - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config) - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://bit.ly/CRA-PWA', - ) - }) - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config) - } - }) - } -} - -function registerValidSW(swUrl, config) { - navigator.serviceWorker - .register(swUrl) - .then((registration) => { - registration.onupdatefound = () => { - const installingWorker = registration.installing - if (installingWorker == null) { - return - } - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://bit.ly/CRA-PWA.', - ) - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration) - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.') - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration) - } - } - } - } - } - }) - .catch((error) => { - console.error('Error during service worker registration:', error) - }) -} - -function checkValidServiceWorker(swUrl, config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl, { - headers: { 'Service-Worker': 'script' }, - }) - .then((response) => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type') - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then((registration) => { - registration.unregister().then(() => { - window.location.reload() - }) - }) - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config) - } - }) - .catch(() => { - console.log('No internet connection found. App is running in offline mode.') - }) -} - -export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready - .then((registration) => { - registration.unregister() - }) - .catch((error) => { - console.error(error.message) - }) - } -} diff --git a/packages/chat/src/setupTests.js b/packages/chat/src/setupTests.js deleted file mode 100644 index 2eb59b05d..000000000 --- a/packages/chat/src/setupTests.js +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom/extend-expect' diff --git a/packages/chat-vite/src/setupTests.ts b/packages/chat/src/setupTests.ts similarity index 100% rename from packages/chat-vite/src/setupTests.ts rename to packages/chat/src/setupTests.ts diff --git a/packages/chat-vite/src/types/common.ts b/packages/chat/src/types/common.ts similarity index 100% rename from packages/chat-vite/src/types/common.ts rename to packages/chat/src/types/common.ts diff --git a/packages/chat/src/useInterval.js b/packages/chat/src/useInterval.js deleted file mode 100644 index 1ddf497ec..000000000 --- a/packages/chat/src/useInterval.js +++ /dev/null @@ -1,22 +0,0 @@ -import { useEffect, useRef } from 'react' - -export default function useInterval(callback, delay) { - const savedCallback = useRef() - - // Remember the latest callback. - useEffect(() => { - savedCallback.current = callback - }, [callback]) - - // Set up the interval. - // eslint-disable-next-line consistent-return - useEffect(() => { - function tick() { - savedCallback.current() - } - if (delay !== null) { - const id = setInterval(tick, delay) - return () => clearInterval(id) - } - }, [delay]) -} diff --git a/packages/chat/src/utils.js b/packages/chat/src/utils.js deleted file mode 100644 index c128fd0e3..000000000 --- a/packages/chat/src/utils.js +++ /dev/null @@ -1,6 +0,0 @@ -export default class Utils { - static async importFromPublic(fileName) { - const response = await fetch(process.env.PUBLIC_URL + fileName) - return response.text() - } -} diff --git a/packages/chat-vite/src/vite-env.d.ts b/packages/chat/src/vite-env.d.ts similarity index 100% rename from packages/chat-vite/src/vite-env.d.ts rename to packages/chat/src/vite-env.d.ts diff --git a/packages/chat-vite/tailwind.config.js b/packages/chat/tailwind.config.js similarity index 100% rename from packages/chat-vite/tailwind.config.js rename to packages/chat/tailwind.config.js diff --git a/packages/chat-vite/tsconfig.json b/packages/chat/tsconfig.json similarity index 100% rename from packages/chat-vite/tsconfig.json rename to packages/chat/tsconfig.json diff --git a/packages/chat-vite/vite.config.ts b/packages/chat/vite.config.ts similarity index 100% rename from packages/chat-vite/vite.config.ts rename to packages/chat/vite.config.ts From ee415acccf74ced8bdaef6b4fe33bceb87461d79 Mon Sep 17 00:00:00 2001 From: jonty007 Date: Wed, 16 Oct 2024 10:53:46 +0530 Subject: [PATCH 4/6] dependency version fix --- packages/chat/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/chat/package.json b/packages/chat/package.json index 28b96cec3..aa1a1b47a 100644 --- a/packages/chat/package.json +++ b/packages/chat/package.json @@ -12,7 +12,7 @@ "deploy": "node --loader ts-node/esm scripts/deploy.ts" }, "dependencies": { - "@bitcoin-computer/components": "^0.21.0-beta.0", + "@bitcoin-computer/components": "^0.22.0-beta.0", "@bitcoin-computer/lib": "^0.21.0-beta.0", "flowbite": "^2.3.0", "react": "^18.3.1", From 7a4792108dcd72e44f61ba2a7830513a9053188b Mon Sep 17 00:00:00 2001 From: jonty007 Date: Mon, 21 Oct 2024 15:11:57 +0530 Subject: [PATCH 5/6] upgrade lib package in chat --- packages/chat/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/chat/package.json b/packages/chat/package.json index aa1a1b47a..bb4b9c6e1 100644 --- a/packages/chat/package.json +++ b/packages/chat/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@bitcoin-computer/components": "^0.22.0-beta.0", - "@bitcoin-computer/lib": "^0.21.0-beta.0", + "@bitcoin-computer/lib": "^0.22.0-beta.0", "flowbite": "^2.3.0", "react": "^18.3.1", "react-dom": "^18.3.1" From feb54cc33589b00f5f0cdca3d374bbd3603739e2 Mon Sep 17 00:00:00 2001 From: jonty007 Date: Mon, 21 Oct 2024 15:12:57 +0530 Subject: [PATCH 6/6] upgrade package version in chat --- packages/chat/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/chat/package.json b/packages/chat/package.json index bb4b9c6e1..972339fd2 100644 --- a/packages/chat/package.json +++ b/packages/chat/package.json @@ -1,7 +1,7 @@ { "name": "chat", "private": true, - "version": "0.21.0-beta.0", + "version": "0.22.0-beta.0", "type": "module", "scripts": { "dev": "vite",

    OH~&RL>km4MM28p)YYicH`!HhM0Owg~A!X`H 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