From 3ce3f090f50d326a596d179f0141337f1698b066 Mon Sep 17 00:00:00 2001 From: "plebeius.eth" Date: Fri, 26 Apr 2024 19:13:09 +0200 Subject: [PATCH 01/10] chore(package.json): add react-draggable --- package.json | 1 + yarn.lock | 91 ++++++++-------------------------------------------- 2 files changed, 14 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index a931f6c8..b1f06938 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "prettier": "3.0.3", "react": "18.2.0", "react-dom": "18.2.0", + "react-draggable": "^4.4.6", "react-i18next": "13.2.2", "react-markdown": "8.0.6", "react-router-dom": "6.16.0", diff --git a/yarn.lock b/yarn.lock index 94664693..2586b4fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3347,68 +3347,6 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@plebbit/plebbit-js@https://github.com/plebbit/plebbit-js.git#073d5f501ccf9521942d93f6522d1125058c196a": - version "0.0.3" - resolved "https://github.com/plebbit/plebbit-js.git#073d5f501ccf9521942d93f6522d1125058c196a" - dependencies: - "@bonfida/spl-name-service" "2.3.8" - "@chainsafe/libp2p-gossipsub" "12.0.0" - "@chainsafe/libp2p-noise" "15.0.0" - "@chainsafe/libp2p-yamux" "6.0.2" - "@ensdomains/eth-ens-namehash" "2.0.15" - "@keyv/sqlite" "3.6.7" - "@libp2p/autonat" "1.0.12" - "@libp2p/bootstrap" "10.0.15" - "@libp2p/circuit-relay-v2" "^1.0.15" - "@libp2p/identify" "1.0.14" - "@libp2p/kad-dht" "12.0.7" - "@libp2p/mplex" "10.0.15" - "@libp2p/peer-id-factory" "4.0.6" - "@libp2p/webrtc" "4.0.19" - "@libp2p/webtransport" "4.0.19" - "@plebbit/plebbit-logger" "github:plebbit/plebbit-logger#355a96d7659ed820047980049dfa627d30d83a69" - "@plebbit/proper-lockfile" "github:plebbit/node-proper-lockfile#7fd6332117340c1d3d98dd0afee2d31cc06f72b8" - "@types/proper-lockfile" "4.1.2" - "@types/uuid" "8.3.4" - assert "2.1.0" - better-sqlite3 "9.3.0" - buffer "6.0.3" - captcha-canvas "3.2.1" - cbor "9.0.1" - debounce "1.2.1" - err-code "3.0.1" - ethers "6.10.0" - ext-name "5.0.0" - file-type "16.5.4" - hpagent "1.2.0" - ipfs-only-hash "4.0.0" - jose "4.11.0" - js-sha256 "0.9.0" - keyv "4.5.4" - knex "3.1.0" - kubo-rpc-client "3.0.3" - libp2p "1.2.1" - libp2p-crypto "0.21.2" - limiter-es6-compat "2.1.2" - localforage "1.10.0" - lodash-es "4.17.21" - lru-cache "10.1.0" - open-graph-scraper "6.3.3" - p-limit "4.0.0" - p-timeout "6.1.2" - peer-id "0.16.0" - probe-image-size "7.2.3" - retry "0.13.1" - rpc-websockets "7.9.0" - safe-stable-stringify "2.4.3" - sha1-uint8array "0.10.7" - skia-canvas "1.0.0" - tiny-typed-emitter "2.1.0" - tinycache "1.1.2" - ts-custom-error "3.3.1" - uuid "9.0.1" - viem "1.5.2" - "@plebbit/plebbit-js@https://github.com/plebbit/plebbit-js.git#347579798478c27eea4808b923ab6f21799fce89": version "0.0.3" resolved "https://github.com/plebbit/plebbit-js.git#347579798478c27eea4808b923ab6f21799fce89" @@ -3484,22 +3422,6 @@ dependencies: debug "4.3.4" -"@plebbit/plebbit-react-hooks@https://github.com/plebbit/plebbit-react-hooks.git#00aabcce2276c671c0f4a371d459c93eb39c936a": - version "0.0.1" - resolved "https://github.com/plebbit/plebbit-react-hooks.git#00aabcce2276c671c0f4a371d459c93eb39c936a" - dependencies: - "@plebbit/plebbit-js" "https://github.com/plebbit/plebbit-js.git#073d5f501ccf9521942d93f6522d1125058c196a" - "@plebbit/plebbit-logger" "https://github.com/plebbit/plebbit-logger.git" - assert "2.0.0" - ethers "5.6.9" - localforage "1.10.0" - lodash.isequal "4.5.0" - memoizee "0.4.15" - quick-lru "5.1.1" - uint8arrays "3.1.1" - uuid "8.3.2" - zustand "4.0.0" - "@plebbit/plebbit-react-hooks@https://github.com/plebbit/plebbit-react-hooks.git#6d0d38ad52ce77715cb05be6cec55d691f5f013d": version "0.0.1" resolved "https://github.com/plebbit/plebbit-react-hooks.git#6d0d38ad52ce77715cb05be6cec55d691f5f013d" @@ -6224,6 +6146,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -14777,6 +14704,14 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-draggable@^4.4.6: + version "4.4.6" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.6.tgz#63343ee945770881ca1256a5b6fa5c9f5983fe1e" + integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + react-error-overlay@^6.0.11: version "6.0.11" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" From cc5d04288981ecbe2fec851d4669fcf874ddc216 Mon Sep 17 00:00:00 2001 From: "plebeius.eth" Date: Fri, 26 Apr 2024 19:13:23 +0200 Subject: [PATCH 02/10] feat: add challenge modal --- .../challenge-modal.module.css | 79 +++++++++++ .../challenge-modal/challenge-modal.tsx | 125 ++++++++++++++++++ src/components/challenge-modal/index.ts | 1 + src/components/post-form/post-form.tsx | 123 ++++++++++++++--- src/components/post/post.module.css | 10 ++ src/components/post/post.tsx | 55 ++++++-- src/hooks/use-challenges.ts | 24 ++++ src/lib/utils/challenge-utils.ts | 63 +++++++++ src/modules.d.ts | 2 + src/themes.css | 10 ++ 10 files changed, 463 insertions(+), 29 deletions(-) create mode 100644 src/components/challenge-modal/challenge-modal.module.css create mode 100644 src/components/challenge-modal/challenge-modal.tsx create mode 100644 src/components/challenge-modal/index.ts create mode 100644 src/hooks/use-challenges.ts create mode 100644 src/lib/utils/challenge-utils.ts diff --git a/src/components/challenge-modal/challenge-modal.module.css b/src/components/challenge-modal/challenge-modal.module.css new file mode 100644 index 00000000..682d3036 --- /dev/null +++ b/src/components/challenge-modal/challenge-modal.module.css @@ -0,0 +1,79 @@ +.container { + position: fixed; + top: calc(50% - 150px); + left: calc(50% - 150px); + display: block; + padding: 2px; + font-size: 10pt; + border-left: none; + border-top: none; + z-index: 1000; + background-color: var(--challenge-modal-background-color); + border: var(--challenge-modal-border); +} + +.title { + font-size: var(--challenge-modal-title-font-size); + text-align: center; + margin-bottom: 1px; + padding: 0; + height: 18px; + line-height: 18px; + cursor: move; + font-weight: var(--challenge-modal-title-font-weight); + background-color: var(--challenge-modal-title-background-color); + color: var(--challenge-modal-title-text-color); + border: var(--challenge-modal-title-border); +} + +.closeIcon { + all: unset; + float: right; + cursor: pointer; + margin-bottom: -4px; + width: 18px; + height: 18px; + border: none; + image-rendering: pixelated; + background-image: var(--close-button-background-image); +} + +.container input, .container textarea { + border: 1px solid #aaa; + font-family: Arial, Helvetica, sans-serif; + font-size: 10pt; + outline: medium none; + width: 298px; + padding: 2px; + margin-bottom: 1px; +} + +.content textarea { + vertical-align: top; +} + +.challengeAnswer { + font-size: 11px !important; + padding: 0px 2px; + font-family: monospace !important; +} + +.challengeMediaWrapper { + display: flex; + justify-content: center; + align-items: center; + margin: 5px 0; +} + +.challengeFooter { + display: flex; + justify-content: space-between; + align-items: center; + box-sizing: border-box; +} + +.challengeFooter button { + margin: 5px 5px 0 0; + cursor: pointer; + text-transform: capitalize; +} \ No newline at end of file diff --git a/src/components/challenge-modal/challenge-modal.tsx b/src/components/challenge-modal/challenge-modal.tsx new file mode 100644 index 00000000..336be334 --- /dev/null +++ b/src/components/challenge-modal/challenge-modal.tsx @@ -0,0 +1,125 @@ +import { useState } from 'react'; +import { Challenge as ChallengeType, useComment } from '@plebbit/plebbit-react-hooks'; +import { useTranslation } from 'react-i18next'; +import useChallenges from '../../hooks/use-challenges'; +import styles from './challenge-modal.module.css'; +import { getPublicationType } from '../../lib/utils/challenge-utils'; +import Draggable from 'react-draggable'; + +interface ChallengeProps { + challenge: ChallengeType; + closeModal: () => void; +} + +const Challenge = ({ challenge, closeModal }: ChallengeProps) => { + const { t } = useTranslation(); + + const challenges = challenge?.[0]?.challenges; + const publication = challenge?.[1]; + + const publicationType = getPublicationType(publication); + const { author, content, link, title } = publication || {}; + const { displayName } = author || {}; + + const [currentChallengeIndex, setCurrentChallengeIndex] = useState(0); + const [answers, setAnswers] = useState([]); + + const isTextChallenge = challenges[currentChallengeIndex].type === 'text/plain'; + const isImageChallenge = challenges[currentChallengeIndex].type === 'image/png'; + + const onAnswersChange = (e: React.ChangeEvent) => { + setAnswers((prevAnswers) => { + const updatedAnswers = [...prevAnswers]; + updatedAnswers[currentChallengeIndex] = e.target.value; + return updatedAnswers; + }); + }; + + const onSubmit = () => { + publication.publishChallengeAnswers(answers); + setAnswers([]); + closeModal(); + }; + + const onEnterKey = (e: React.KeyboardEvent) => { + if (e.key !== 'Enter') return; + if (challenges[currentChallengeIndex + 1]) { + setCurrentChallengeIndex((prev) => prev + 1); + } else { + onSubmit(); + } + }; + + return ( + +
+
+ Challenge for {publicationType} +
+
+
+ +
+ {title && ( +
+ +
+ )} + {content && ( +
+