diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f3d5c415..11c19f1e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,10 +1,9 @@ --- name: Bug report about: Create a report to help us improve -title: '' +title: "" labels: bug -assignees: '' - +assignees: "" --- **Describe the bug** @@ -12,6 +11,7 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -24,15 +24,17 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] **Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] + +- Device: [e.g. iPhone6] +- OS: [e.g. iOS8.1] +- Browser [e.g. stock browser, safari] +- Version [e.g. 22] **Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 11fc491e..d883b8f2 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -1,10 +1,9 @@ --- name: Feature request about: Suggest an idea for this project -title: '' +title: "" labels: enhancement -assignees: '' - +assignees: "" --- **Is your feature request related to a problem? Please describe.** diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1c675c4a..6bc38781 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,8 +10,8 @@ jobs: with: deploy-env: "mainnet" app-name: "builddao" - deploy-account-address: ${{ vars.BOS_SIGNER_ACCOUNT_ID }} + deploy-account-address: ${{ vars.BOS_SIGNER_ACCOUNT_ID }} signer-account-address: ${{ vars.BOS_SIGNER_ACCOUNT_ID }} signer-public-key: ${{ vars.BOS_SIGNER_PUBLIC_KEY }} - secrets: - SIGNER_PRIVATE_KEY: ${{ secrets.BOS_SIGNER_PRIVATE_KEY }} \ No newline at end of file + secrets: + SIGNER_PRIVATE_KEY: ${{ secrets.BOS_SIGNER_PRIVATE_KEY }} diff --git a/.github/workflows/testnet.yml b/.github/workflows/testnet.yml index 2b2530fd..ed990e8a 100644 --- a/.github/workflows/testnet.yml +++ b/.github/workflows/testnet.yml @@ -10,8 +10,8 @@ jobs: with: deploy-env: "testnet" app-name: "builddao" - deploy-account-address: ${{ vars.BOS_TESTNET_SIGNER_ACCOUNT_ID }} + deploy-account-address: ${{ vars.BOS_TESTNET_SIGNER_ACCOUNT_ID }} signer-account-address: ${{ vars.BOS_TESTNET_SIGNER_ACCOUNT_ID }} signer-public-key: ${{ vars.BOS_TESTNET_SIGNER_PUBLIC_KEY }} - secrets: - SIGNER_PRIVATE_KEY: ${{ secrets.BOS_TESTNET_SIGNER_PRIVATE_KEY }} \ No newline at end of file + secrets: + SIGNER_PRIVATE_KEY: ${{ secrets.BOS_TESTNET_SIGNER_PRIVATE_KEY }} diff --git a/README.md b/README.md index 18f27caa..d609031c 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,13 @@ Let's connect, collaborate, and create solutions together! ## Setup & Development Install packages: + ``` yarn ``` Start development version: + ``` yarn dev ``` @@ -20,8 +22,7 @@ To view your local developments, either visit them through a gateway ${gateway_u For example, to use this local gateway, use: -* Set the flag (something like http://127.0.0.1:4040/api/loader) at localhost:3000/flags - +- Set the flag (something like http://127.0.0.1:4040/api/loader) at localhost:3000/flags ### Community Page @@ -29,8 +30,8 @@ For example, to use this local gateway, use: #### Features -* Customizable Settings -* Onboarding Flow -* Leaderboard -* Groups -* Projects +- Customizable Settings +- Onboarding Flow +- Leaderboard +- Groups +- Projects diff --git a/apps/builddao/bos.config.json b/apps/builddao/bos.config.json index 9db549a9..a54425da 100644 --- a/apps/builddao/bos.config.json +++ b/apps/builddao/bos.config.json @@ -1,3 +1,3 @@ { "appAccount": "buildhub.near" -} \ No newline at end of file +} diff --git a/apps/builddao/widget/Compose.jsx b/apps/builddao/widget/Compose.jsx index 55c1d004..b39b1353 100644 --- a/apps/builddao/widget/Compose.jsx +++ b/apps/builddao/widget/Compose.jsx @@ -15,7 +15,8 @@ const [postContent, setPostContent] = useState(""); const [hideAdvanced, setHideAdvanced] = useState(true); const [labels, setLabels] = useState([]); -setPostContent(draft || props.template); +const [composeKey, setComposeKey] = useState(0); +const memoizedComposeKey = useMemo(() => composeKey, [composeKey]); function generateUID() { const maxHex = 0xffffffff; @@ -23,6 +24,8 @@ function generateUID() { return randomNumber.toString(16).padStart(8, "0"); } +setPostContent(draft || props.template); + function tagsFromLabels(labels) { return labels.reduce( (newLabels, label) => ({ @@ -85,15 +88,9 @@ function checkAndAppendHashtag(input, target) { } } -const postToCustomFeed = ({ feed, text, labels }) => { - // if (!labels) labels = []; - - // labels = labels.map((label) => label.toLowerCase()); - // labels.push(feed.name.toLowerCase()); - +const postToCustomFeed = ({ feed, text }) => { const requiredHashtags = props.requiredHashtags || ["build"]; if (feed.hashtag) requiredHashtags.push(feed.hashtag.toLowerCase()); - requiredHashtags.push(feed.name.toLowerCase()); text = text + `\n\n`; requiredHashtags.forEach((hashtag) => { text = checkAndAppendHashtag(text, hashtag); @@ -156,7 +153,8 @@ const postToCustomFeed = ({ feed, text, labels }) => { onCommit: () => { setPostContent(""); Storage.privateSet(draftKey, props.template || ""); - setHandler("autocompleteSelected"); // this is a hack to force the iframe to update + // setHandler("autocompleteSelected"); // this is a hack to force the iframe to update + setComposeKey(generateUID()); }, onCancel: () => { // console.log(`Cancelled ${feed}: #${postId}`); @@ -260,7 +258,7 @@ const MarkdownEditor = ` } .drop-wrap { - top: -110px !important; + border-radius: 0.5rem !important; } @@ -385,7 +383,7 @@ return ( - + /> ); diff --git a/apps/builddao/widget/Proposals.jsx b/apps/builddao/widget/Proposals.jsx index 081047fc..f4a57cf8 100644 --- a/apps/builddao/widget/Proposals.jsx +++ b/apps/builddao/widget/Proposals.jsx @@ -1,11 +1,12 @@ const { Button } = VM.require("buildhub.near/widget/components.Button") || { - Button: <> + Button: <>, }; -const DaoSDK = VM.require("sdks.near/widget/SDKs.Sputnik.DaoSDK"); +const DaoSDK = VM.require("sdks.near/widget/SDKs.Sputnik.DaoSDK") || (() => {}); if (!DaoSDK) { return <>; } + const resPerPage = 10; const daoId = props.daoId ?? "build.sputnik-dao.near"; const proposalId = props.proposalId ?? null; @@ -18,8 +19,8 @@ const lastProposalId = sdk.getLastProposalId(); const reversedProposals = proposalId ? [ sdk.getProposalById({ - proposalId - }) + proposalId, + }), ] || [] : sdk.getProposals({ offset: @@ -28,7 +29,7 @@ const reversedProposals = proposalId ? lastProposalId - resPerPage : lastProposalId ?? 10 : lastProposalId - currentPage * resPerPage, - limit: resPerPage + limit: resPerPage, }) || []; const proposals = reversedProposals.reverse(); @@ -81,15 +82,15 @@ const handleVote = ({ action, proposalId, proposer }) => { message: `${accountId} voted to ${customAction} your proposal for ${daoId} (Proposal ID: ${proposalId})`, params: { daoId: daoId, - proposalId: proposalId + proposalId: proposalId, }, type: "custom", - widget: "buildhub.near/widget/Proposals" - } - } - ]) - } - } + widget: "buildhub.near/widget/Proposals", + }, + }, + ]), + }, + }, }; sdk.actProposal({ @@ -103,9 +104,9 @@ const handleVote = ({ action, proposalId, proposer }) => { args: { data: notification }, deposit: Big(JSON.stringify(notification).length * 16) .mul(Big(10).pow(20)) - .toString() - } - ] + .toString(), + }, + ], }); }; @@ -144,30 +145,30 @@ const proposalsComponent = useMemo(() => { sdk.hasPermission({ accountId, kindName, - actionType: actions.VoteApprove + actionType: actions.VoteApprove, }), sdk.hasPermission({ accountId, kindName, - actionType: actions.VoteReject + actionType: actions.VoteReject, }), sdk.hasPermission({ accountId, kindName, - actionType: actions.VoteRemove - }) + actionType: actions.VoteRemove, + }), ]; const { thresholdVoteCount } = sdk.getVotersAndThresholdForProposalKind({ - kindName + kindName, }); const totalVotes = sdk.calculateVoteCountByType({ - votes: item.votes + votes: item.votes, }); let expirationTime = sdk.getProposalExpirationTime({ - submissionTime: item.submission_time + submissionTime: item.submission_time, }); return ( @@ -181,14 +182,14 @@ const proposalsComponent = useMemo(() => { totalVotes: { ...totalVotes, yes: totalVotes.approve, - no: totalVotes.reject + no: totalVotes.reject, }, - expirationTime + expirationTime, }, daoId: daoId, comments: comments, isAllowedToVote, - handleVote + handleVote, }} /> ); @@ -207,7 +208,7 @@ return ( src="buildhub.near/widget/components.modals.CreateProposal" props={{ showModal: showProposalModal, - toggleModal: () => setShowModal(!showProposalModal) + toggleModal: () => setShowModal(!showProposalModal), }} />
@@ -226,7 +227,7 @@ return ( totalPages: Math.round(lastProposalId / resPerPage), onPageClick: (v) => setCurrentPage(v), selectedPage: currentPage, - ThemeContainer: PaginationThemeContainer + ThemeContainer: PaginationThemeContainer, }} />
diff --git a/apps/builddao/widget/Resources.jsx b/apps/builddao/widget/Resources.jsx index 8062602d..0036066c 100644 --- a/apps/builddao/widget/Resources.jsx +++ b/apps/builddao/widget/Resources.jsx @@ -1,5 +1,9 @@ -const { MarkdownView } = VM.require("buildhub.near/widget/md-view"); -const { Button } = VM.require("buildhub.near/widget/components.Button"); +const { MarkdownView } = VM.require("buildhub.near/widget/md-view") || { + MarkdownView: () => <>, +}; +const { Button } = VM.require("buildhub.near/widget/components.Button") || { + Button: () => <>, +}; Button || (Button = () => <>); MarkdownView || (MarkdownView = () => <>); @@ -40,7 +44,7 @@ return ( ); }), - mainContent: + mainContent: , }} /> ); diff --git a/apps/builddao/widget/app.jsx b/apps/builddao/widget/app.jsx index 9cad4902..115ca85a 100644 --- a/apps/builddao/widget/app.jsx +++ b/apps/builddao/widget/app.jsx @@ -5,7 +5,7 @@ const { routes } = VM.require("buildhub.near/widget/config.app") ?? { }; const { AppLayout } = VM.require("buildhub.near/widget/template.AppLayout") || { - AppLayout: () => <>Layout loading..., + AppLayout: () => <>, }; if (!page) page = Object.keys(routes)[0] || "home"; diff --git a/apps/builddao/widget/components/Bullet.jsx b/apps/builddao/widget/components/Bullet.jsx index 77fdaa8e..e4a8e14c 100644 --- a/apps/builddao/widget/components/Bullet.jsx +++ b/apps/builddao/widget/components/Bullet.jsx @@ -1,4 +1,6 @@ -const { theme } = VM.require("rambo-dev.near/widget/ThemeProvider"); +const { theme } = VM.require("rambo-dev.near/widget/ThemeProvider") || { + theme: {}, +}; const StyledBullet = styled.div` width: fit-content; @@ -10,21 +12,21 @@ const StyledBullet = styled.div` font-size: 0.875rem; font-weight: 500; border-radius: 8px; - ${({ variant, theme }) => { - const isDefault = variant === "default"; + ${({ variant, theme }) => { + const isDefault = variant === "default"; - const background = isDefault - ? theme.colors.blue500 - : theme.colors.seablue500; - const color = isDefault ? theme.colors.blue500 : theme.colors.seablue500; - const border = `1px solid ${background}33`; + const background = isDefault + ? theme.colors.blue500 + : theme.colors.seablue500; + const color = isDefault ? theme.colors.blue500 : theme.colors.seablue500; + const border = `1px solid ${background}33`; - return ` + return ` background: ${background}33; color: ${color}; border: ${border}; `; - }} + }} `; function Bullet({ children, variant }) { @@ -37,4 +39,4 @@ function Bullet({ children, variant }) { ); } -return { Bullet }; \ No newline at end of file +return { Bullet }; diff --git a/apps/builddao/widget/components/InputField.jsx b/apps/builddao/widget/components/InputField.jsx index deacecd2..712c6c02 100644 --- a/apps/builddao/widget/components/InputField.jsx +++ b/apps/builddao/widget/components/InputField.jsx @@ -17,9 +17,8 @@ const Label = styled.label` const Input = styled.input` display: flex; - max-width: ${(props) => props.maxWidth ?? "390px"}; width: 100%; - padding: 16px 12px; + padding: 12px; align-items: flex-start; gap: 10px; @@ -48,15 +47,18 @@ function InputField({ maxWidth, }) { return ( - + {label && } ); diff --git a/apps/builddao/widget/components/Library.jsx b/apps/builddao/widget/components/Library.jsx index e626315d..2dd592c6 100644 --- a/apps/builddao/widget/components/Library.jsx +++ b/apps/builddao/widget/components/Library.jsx @@ -11,20 +11,20 @@ const { User, Avatar, Checkbox, -} = VM.require("buildhub.near/widget/components"); - -Button = Button || (() => <>); -Pagination = Pagination || (() => <>); -ProgressState = ProgressState || (() => <>); -Step = Step || (() => <>); -Post = Post || (() => <>); -InputField = InputField || (() => <>); -UploadField = UploadField || (() => <>); -TextBox = TextBox || (() => <>); -TextEditor = TextEditor || (() => <>); -User = User || (() => <>); -Avatar = Avatar || (() => <>); -Checkbox = Checkbox || (() => <>); +} = VM.require("buildhub.near/widget/components") || { + Button: () => <>, + Pagination: () => <>, + ProgressState: () => <>, + Step: () => <>, + Post: () => <>, + InputField: () => <>, + UploadField: () => <>, + TextBox: () => <>, + TextEditor: () => <>, + User: () => <>, + Avatar: () => <>, + Checkbox: () => <>, +}; // states const [checked, setChecked] = useState(false); diff --git a/apps/builddao/widget/components/Modal.jsx b/apps/builddao/widget/components/Modal.jsx index 62c857ce..93235fd0 100644 --- a/apps/builddao/widget/components/Modal.jsx +++ b/apps/builddao/widget/components/Modal.jsx @@ -1,4 +1,6 @@ -const { Button } = VM.require("buildhub.near/widget/components.Button"); +const { Button } = VM.require("buildhub.near/widget/components.Button") || { + Button: () => <>, +}; const toggle = props.toggle ?? ; diff --git a/apps/builddao/widget/components/Post.jsx b/apps/builddao/widget/components/Post.jsx index 8f9ebb96..8b8a04b0 100644 --- a/apps/builddao/widget/components/Post.jsx +++ b/apps/builddao/widget/components/Post.jsx @@ -1,5 +1,6 @@ -const { Button } = - VM.require("buildhub.near/widget/components") || (() => <>); +const { Button } = VM.require("buildhub.near/widget/components") || { + Button: () => <>, +}; const StyledPost = styled.div` margin-bottom: 1rem; @@ -288,7 +289,10 @@ const contentWidget = ( return ( <> - + { props={{ size: "sm", variant: "info outline mb-1", - children: "You voted" + children: "You voted", }} /> ); @@ -273,7 +273,7 @@ function renderHeader({ typeName, id, status }) { children: `Proposal ID #${id}`, variant: "", className: "secondary-bg", - size: "lg" + size: "lg", }} /> @@ -288,14 +288,14 @@ function renderHeader({ typeName, id, status }) { fontSize: "16px", marginRight: "5px", borderWidth: "2px", - animationDuration: "3s" + animationDuration: "3s", }} > {statustext} ), variant: `${statusvariant} round`, - size: "lg" + size: "lg", }} /> @@ -311,13 +311,13 @@ function renderHeader({ typeName, id, status }) { props={{ timeToCheck: parseInt( Big(expirationTime).div(1000000) - ) + ), }} /> ), variant: `info round`, - size: "lg" + size: "lg", }} /> )} @@ -331,7 +331,7 @@ function renderData({ proposer, description, submission_time, - totalVotesNeeded + totalVotesNeeded, }) { return (
@@ -400,7 +400,7 @@ function renderVoteButtons({ totalVotes, status, isAllowedToVote, - handleVote + handleVote, }) { const finished = status !== "InProgress"; const VoteButton = styled.button` @@ -519,19 +519,19 @@ function renderVoteButtons({ yes: getPercentage(totalVotes.yes), no: getPercentage(totalVotes.no), spam: getPercentage(totalVotes.spam), - abstain: getPercentage(totalVotes.abstain) + abstain: getPercentage(totalVotes.abstain), }; const wins = { yes: status === "Approved", no: status === "Rejected", - spam: status === "Failed" || status === "Spam" + spam: status === "Failed" || status === "Spam", }; const voted = { yes: checkVotes("Approve"), no: checkVotes("Reject"), - spam: checkVotes("Remove") + spam: checkVotes("Remove"), }; const alreadyVoted = voted.yes || voted.no || voted.spam || voted.abstain; @@ -552,7 +552,7 @@ function renderVoteButtons({
@@ -635,9 +635,9 @@ function renderFooter({ totalVotes, votes, comments, daoId, proposal }) { item: { type: "dao_proposal_comment", path: `${daoId}/proposal/main`, - proposal_id: proposal.id + "-beta" - } - } + proposal_id: proposal.id + "-beta", + }, + }, }, { title: "Voters", @@ -649,8 +649,8 @@ function renderFooter({ totalVotes, votes, comments, daoId, proposal }) { votes, totalVotes, proposalId: proposal.id, - votersCount: totalVotes.total - } + votersCount: totalVotes.total, + }, }, { title: "Share", @@ -660,9 +660,9 @@ function renderFooter({ totalVotes, votes, comments, daoId, proposal }) { url: `https://near.org/buildhub.near/widget/Proposals?daoId=${daoId}&proposalId=${ proposalData.id }${props.dev ? "&dev=true" : ""}`, - text: "Explore this new proposal from our DAO! Your support and feedback are essential as we work towards a decentralized future. Review the details and join the discussion here:" - } - } + text: "Explore this new proposal from our DAO! Your support and feedback are essential as we work towards a decentralized future. Review the details and join the discussion here:", + }, + }, ]; if (proposal.typeName !== "Text") { @@ -673,8 +673,8 @@ function renderFooter({ totalVotes, votes, comments, daoId, proposal }) { props: { daoId, proposal, - showCard: true - } + showCard: true, + }, }); } @@ -703,8 +703,8 @@ function renderFooter({ totalVotes, votes, comments, daoId, proposal }) {
), toggleContainerProps: { - className: "flex-fill" - } + className: "flex-fill", + }, }} /> ); @@ -721,7 +721,7 @@ const voted = { yes: checkVotes("Approve"), no: checkVotes("Reject"), spam: checkVotes("Remove"), - abstain: checkVotes("Abstain") + abstain: checkVotes("Abstain"), }; const alreadyVoted = voted.yes || voted.no || voted.spam; @@ -738,7 +738,7 @@ return ( proposer, description, submission_time, - totalVotesNeeded + totalVotesNeeded, })} {renderVoteButtons({ totalVotes, @@ -750,16 +750,16 @@ return ( return handleVote({ action, proposalId: id, - proposer + proposer, }); - } + }, })} {renderFooter({ totalVotes, votes, comments, daoId, - proposal: proposalData + proposal: proposalData, })} diff --git a/apps/builddao/widget/components/Step.jsx b/apps/builddao/widget/components/Step.jsx index 0f9fceab..d6e27400 100644 --- a/apps/builddao/widget/components/Step.jsx +++ b/apps/builddao/widget/components/Step.jsx @@ -1,5 +1,8 @@ -const { ProgressState } = - VM.require("buildhub.near/widget/components.ProgressState") || (() => <>); +const { ProgressState } = VM.require( + "buildhub.near/widget/components.ProgressState" +) || { + ProgressState: () => <>, +}; const StepContainer = styled.div` position: relative; diff --git a/apps/builddao/widget/components/Text/H1.jsx b/apps/builddao/widget/components/Text/H1.jsx index 24c4eedb..ae91fb52 100644 --- a/apps/builddao/widget/components/Text/H1.jsx +++ b/apps/builddao/widget/components/Text/H1.jsx @@ -4,15 +4,11 @@ const StyledH1 = styled.h1` font-size: 2rem; line-height: 100%; letter-spacing: 0; - color: ${(props) => `${props.textColor}`} + color: ${(props) => `${props.textColor}`}; `; -function H1({ children, textColor}) { - return ( - - {children} - - ) +function H1({ children, textColor }) { + return {children}; } -return { H1 } \ No newline at end of file +return { H1 }; diff --git a/apps/builddao/widget/components/Text/H2.jsx b/apps/builddao/widget/components/Text/H2.jsx index 4b4938b2..8ea0a99b 100644 --- a/apps/builddao/widget/components/Text/H2.jsx +++ b/apps/builddao/widget/components/Text/H2.jsx @@ -4,15 +4,11 @@ const StyledH2 = styled.h2` font-size: 1.625rem; line-height: 120%; letter-spacing: 0; - color: ${(props) => `${props.textColor}`} + color: ${(props) => `${props.textColor}`}; `; function H2({ children, textColor }) { - return ( - - {children} - - ) + return {children}; } -return { H2 } \ No newline at end of file +return { H2 }; diff --git a/apps/builddao/widget/components/Text/H3.jsx b/apps/builddao/widget/components/Text/H3.jsx index d6f6588e..5baffaab 100644 --- a/apps/builddao/widget/components/Text/H3.jsx +++ b/apps/builddao/widget/components/Text/H3.jsx @@ -4,15 +4,11 @@ const StyledH3 = styled.h3` font-size: 1.5rem; line-height: 140%; letter-spacing: 0; - color: ${(props) => `${props.textColor}`} + color: ${(props) => `${props.textColor}`}; `; function H3({ children, textColor }) { - return ( - - {children} - - ) + return {children}; } -return { H3 } \ No newline at end of file +return { H3 }; diff --git a/apps/builddao/widget/components/Text/H4.jsx b/apps/builddao/widget/components/Text/H4.jsx index 69b05c69..dbd19f43 100644 --- a/apps/builddao/widget/components/Text/H4.jsx +++ b/apps/builddao/widget/components/Text/H4.jsx @@ -4,15 +4,11 @@ const StyledH4 = styled.h4` font-size: 1.125rem; line-height: 160%; letter-spacing: 0; - color: ${(props) => `${props.textColor}`} + color: ${(props) => `${props.textColor}`}; `; function H4({ children, textColor }) { - return ( - - {children} - - ) + return {children}; } -return { H4 } \ No newline at end of file +return { H4 }; diff --git a/apps/builddao/widget/components/TextEditor.jsx b/apps/builddao/widget/components/TextEditor.jsx index bdb999c5..c9b29a03 100644 --- a/apps/builddao/widget/components/TextEditor.jsx +++ b/apps/builddao/widget/components/TextEditor.jsx @@ -81,7 +81,7 @@ const MarkdownEditor = ` } .drop-wrap { - top: -110px !important; + border-radius: 0.5rem !important; } @@ -126,22 +126,41 @@ const MarkdownEditor = ` } `; -function TextEditor({ value, onChange, maxWidth }) { +const Label = styled.label` + color: var(--label-color, #fff); + + /* Body/16px */ + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 170%; /* 27.2px */ +`; + +const Container = styled.div` + display: flex; + flex-direction: column; + gap: 4px; +`; + +function TextEditor({ value, label, onChange, maxWidth }) { return ( - - - + + + + + + ); } diff --git a/apps/builddao/widget/components/UploadField.jsx b/apps/builddao/widget/components/UploadField.jsx index b0f873b2..5715279a 100644 --- a/apps/builddao/widget/components/UploadField.jsx +++ b/apps/builddao/widget/components/UploadField.jsx @@ -1,5 +1,6 @@ -const { Button } = - VM.require("buildhub.near/widget/components.Button") || (() => <>); +const { Button } = VM.require("buildhub.near/widget/components.Button") || { + Button: () => <>, +}; const UploadContainer = styled.div` display: flex; diff --git a/apps/builddao/widget/components/User.jsx b/apps/builddao/widget/components/User.jsx index 935b9053..74794c1f 100644 --- a/apps/builddao/widget/components/User.jsx +++ b/apps/builddao/widget/components/User.jsx @@ -1,5 +1,6 @@ -const { Avatar } = - VM.require("buildhub.near/widget/components") || (() => <>); +const { Avatar } = VM.require("buildhub.near/widget/components") || { + Avatar: () => <>, +}; const Wrapper = styled.div` color: #fff; @@ -58,8 +59,9 @@ const Overlay = (props) => ( <>, }; -const DaoSDK = VM.require("sdks.near/widget/SDKs.Sputnik.DaoSDK"); +const DaoSDK = VM.require("sdks.near/widget/SDKs.Sputnik.DaoSDK") || (() => {}); if (!DaoSDK) { return <>; } const daoId = "build.sputnik-dao.near"; const sdk = DaoSDK(daoId); +if (!sdk) { + return <>; +} const userAccountId = context.accountId; const data = sdk?.checkIsMemberOrPending({ diff --git a/apps/builddao/widget/components/buttons/UserDropdown.jsx b/apps/builddao/widget/components/buttons/UserDropdown.jsx index 1e06e701..4864ae1b 100644 --- a/apps/builddao/widget/components/buttons/UserDropdown.jsx +++ b/apps/builddao/widget/components/buttons/UserDropdown.jsx @@ -144,6 +144,10 @@ function LogOut() { ); } +const { href } = VM.require("buildhub.near/widget/lib.url") || { + href: () => {}, +}; + return ( diff --git a/apps/builddao/widget/components/post/Header.jsx b/apps/builddao/widget/components/post/Header.jsx index 15b9b233..3da02a09 100644 --- a/apps/builddao/widget/components/post/Header.jsx +++ b/apps/builddao/widget/components/post/Header.jsx @@ -1,5 +1,6 @@ -const { Avatar } = - VM.require("buildhub.near/widget/components") || (() => <>); +const { Avatar } = VM.require("buildhub.near/widget/components") || { + Avatar: () => <>, +}; const Button = styled.div` line-height: 20px; @@ -98,14 +99,17 @@ const showTime = props.showTime ?? true; const modalToggles = props.modalToggles; const setItem = props.setItem; -const { href } = VM.require("buildhub.near/widget/lib.url") || (() => {}); +const { href } = VM.require("buildhub.near/widget/lib.url") || { + href: () => {}, +}; const Overlay = (props) => ( {pinned && ( - + )} diff --git a/apps/builddao/widget/components/profile/AccountFeed.jsx b/apps/builddao/widget/components/profile/AccountFeed.jsx new file mode 100644 index 00000000..8f4ac8ca --- /dev/null +++ b/apps/builddao/widget/components/profile/AccountFeed.jsx @@ -0,0 +1,173 @@ +const { Post } = VM.require("buildhub.near/widget/components") || { + Post: () => <>, +}; + +const indexKey = props.indexKey ?? "main"; +const groupId = props.groupId; +const permissions = props.permissions; + +const index = [ + { + action: "post", + key: indexKey, + options: { + limit: 10, + order: "desc", + accountId: props.accounts, + }, + cacheOptions: { + ignoreCache: true, + }, + }, + { + action: "repost", + key: indexKey, + options: { + limit: 10, + order: "desc", + accountId: props.accounts, + }, + cacheOptions: { + ignoreCache: true, + }, + }, +]; + +const isPremiumFeed = props.isPremiumFeed; +const commentAccounts = props.commentAccounts; +const renderedPosts = {}; + +const makePostItem = (a) => ({ + type: "social", + path: `${a.accountId}/post/main`, + blockHeight: a.blockHeight, +}); + +const renderPost = (a) => { + if (a.value.type !== "md") { + return false; + } + const item = JSON.stringify(makePostItem(a)); + if (item in renderedPosts) { + return false; + } + renderedPosts[item] = true; + + return ( +
+ +
+ ); +}; + +const repostSvg = ( + + + + +); + +const extractParentPost = (item) => { + if (!item || item.type !== "social" || !item.path || !item.blockHeight) { + return undefined; + } + const accountId = item.path.split("/")[0]; + return `${accountId}/post/main` === item.path + ? { accountId, blockHeight: item.blockHeight } + : undefined; +}; + +const renderRepost = (a) => { + if (a.value.type !== "repost") { + return false; + } + const post = extractParentPost(a.value.item); + if (!post) { + return false; + } + const item = JSON.stringify(makePostItem(post)); + if (item in renderedPosts) { + return false; + } + renderedPosts[item] = true; + + return ( +
+
+ {repostSvg}{" "} + + Reposted by{" "} + + +
+ +
+ ); +}; + +const renderItem = (item) => + item.action === "post" ? renderPost(item) : renderRepost(item); + +return ( + +); diff --git a/apps/builddao/widget/components/profile/ImageUploader.jsx b/apps/builddao/widget/components/profile/ImageUploader.jsx new file mode 100644 index 00000000..04ae39f2 --- /dev/null +++ b/apps/builddao/widget/components/profile/ImageUploader.jsx @@ -0,0 +1,47 @@ +const [img, setImg] = useState(null); +const [msg, setMsg] = useState("Replace"); + +const uploadFile = (files) => { + setMsg("Uploading..."); + + asyncFetch("https://ipfs.near.social/add", { + method: "POST", + headers: { Accept: "application/json" }, + body: files[0], + }) + .catch((e) => { + console.error(e); + setMsg("Failed to upload"); + }) + .then((res) => { + setImg(res.body.cid); + setMsg("Replace"); + props.setImage({ + ipfs_cid: res.body.cid, + }); + }); +}; + +return ( + <> + {img ? ( + + ) : ( + + )} + uploadFile(f)} + > + {msg} + + +); diff --git a/apps/builddao/widget/components/profile/LastWidgets.jsx b/apps/builddao/widget/components/profile/LastWidgets.jsx new file mode 100644 index 00000000..ce7985ea --- /dev/null +++ b/apps/builddao/widget/components/profile/LastWidgets.jsx @@ -0,0 +1,105 @@ +const accountId = props.accountId; +const tag = props.tag; + +const makeLink = (accountId, tag) => { + const args = []; + if (accountId) { + args.push(`accountId=${accountId}`); + } + if (tag) { + args.push(`tag=${tag}`); + } + return `#/mob.near/widget/LastWidgets${args.length > 0 ? "?" : ""}${args.join( + "&" + )}`; +}; + +const render = (content) => { + return ( +
+ {content} +
+ ); +}; + +let keys = `${accountId ?? "*"}/widget/*`; + +if (tag) { + const taggedWidgets = Social.keys( + `${accountId ?? "*"}/widget/*/metadata/tags/${tag}`, + "final" + ); + + if (taggedWidgets === null) { + return render("Loading tags"); + } + + keys = Object.entries(taggedWidgets) + .map((kv) => Object.keys(kv[1].widget).map((w) => `${kv[0]}/widget/${w}`)) + .flat(); + + if (!keys.length) { + return render(`No widgets found by tag #${tag}`); + } +} + +const data = Social.keys(keys, "final", { + return_type: "BlockHeight", +}); + +if (data === null) { + return render("Loading"); +} + +const processData = (data) => { + const accounts = Object.entries(data); + + const allItems = accounts + .map((account) => { + const accountId = account[0]; + return Object.entries(account[1].widget).map((kv) => ({ + accountId, + widgetName: kv[0], + blockHeight: kv[1], + })); + }) + .flat(); + + allItems.sort((a, b) => b.blockHeight - a.blockHeight); + return allItems; +}; + +const renderTag = (tag, tagBadge) => ( + {tagBadge} +); + +const renderItem = (a) => { + return ( +
+ +
+ ); +}; + +if (JSON.stringify(data) !== JSON.stringify(state.data || {})) { + State.update({ + data, + allItems: processData(data), + }); +} + +return render( + +); diff --git a/apps/builddao/widget/components/profile/ProfileEdit.jsx b/apps/builddao/widget/components/profile/ProfileEdit.jsx new file mode 100644 index 00000000..bc759530 --- /dev/null +++ b/apps/builddao/widget/components/profile/ProfileEdit.jsx @@ -0,0 +1,192 @@ +const { Button, Avatar, InputField, TextEditor } = VM.require( + "buildhub.near/widget/components" +) || { + Button: () => <>, + Avatar: () => <>, + InputField: () => <>, + TextEditor: () => <>, +}; + +const accountId = context.accountId; + +if (!accountId) { + return ""; +} + +const profile = Social.getr(`${accountId}/profile`); + +if (!profile) { + return ""; +} + +const [name, setName] = useState(profile.name ?? ""); +const [description, setDescription] = useState(profile.description ?? ""); +const [location, setLocation] = useState(profile.location ?? ""); +const [twitter, setTwitter] = useState(profile.linktree.twitter ?? ""); +const [github, setGithub] = useState(profile.linktree.github ?? ""); +const [telegram, setTelegram] = useState(profile.linktree.telegram ?? ""); +const [website, setWebsite] = useState(profile.linktree.website ?? ""); +const [image, setImage] = useState(profile.image ?? {}); + +const onNameChange = useCallback((e) => { + setName(e.target.value); +}, []); + +const onDescriptionChange = useCallback((e) => { + setDescription(e); +}, []); + +const onLocationChange = useCallback((e) => { + setLocation(e.target.value); +}, []); + +const onTwitterChange = useCallback((e) => { + setTwitter(e.target.value); +}, []); + +const onGithubChange = useCallback((e) => { + setGithub(e.target.value); +}, []); + +const onTelegramChange = useCallback((e) => { + setTelegram(e.target.value); +}, []); + +const onWebsiteChange = useCallback((e) => { + setWebsite(e.target.value); +}, []); + +const setEditMode = props.setEditMode || (() => {}); + +const SpanLabel = styled.span` + color: var(--White-100, #fff); + + /* Body/14px */ + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 170%; /* 23.8px */ +`; + +const ProfileImageContainer = styled.div` + display: flex; + flex-direction: row; + gap: 4px; + align-items: center; + + img { + width: 64px; + height: 64px; + object-fit: cover; + border-radius: 100%; + } +`; + +return ( + <> +
+ + +
+
+ + + + + + + + + + +
+ +); diff --git a/apps/builddao/widget/components/profile/ProfileInfo.jsx b/apps/builddao/widget/components/profile/ProfileInfo.jsx index 26d4b69b..9047c956 100644 --- a/apps/builddao/widget/components/profile/ProfileInfo.jsx +++ b/apps/builddao/widget/components/profile/ProfileInfo.jsx @@ -1,5 +1,6 @@ -const { Button } = - VM.require("buildhub.near/widget/components") || (() => <>); +const { Button } = VM.require("buildhub.near/widget/components") || { + Button: () => <>, +}; if (!context.accountId || !props.accountId) { return "No Account ID"; @@ -298,51 +299,70 @@ const Badges = ({ tags }) => { ); }; -return ( - -
- - {context.accountId === accountId && ( - - )} -
-
-

{profile.name}

- clipboard.writeText(accountId)}> - {accountId} - -
-
- -
-
- -
- {profile.description && ( -
-

BIO

- +const [editMode, setEditMode] = useState(false); + +const InfoSection = () => { + return ( + <> +
+ + + {context.accountId === accountId && ( + + )}
- )} - {profile.location && ( -
- - {profile.location} +
+

{profile.name}

+ clipboard.writeText(accountId)}> + {accountId}
- )} - {profile.linktree && ( -
- +
+
- )} - -); +
+ +
+ {profile.description && ( +
+

BIO

+ +
+ )} + {profile.location && ( +
+ + {profile.location} + +
+ )} + {profile.linktree && ( +
+ +
+ )} + + ); +}; + +const EditSection = () => { + return ( + + ); +}; + +return {!editMode ? : }; diff --git a/apps/builddao/widget/components/profile/ProfileLine.jsx b/apps/builddao/widget/components/profile/ProfileLine.jsx new file mode 100644 index 00000000..5a426cb7 --- /dev/null +++ b/apps/builddao/widget/components/profile/ProfileLine.jsx @@ -0,0 +1,81 @@ +const accountId = props.accountId; +const link = props.link ?? true; +const hideAccountId = props.hideAccountId; +const hideName = props.hideName; +const hideImage = props.hideImage; + +const profile = props.profile ?? Social.getr(`${accountId}/profile`); +const fast = !!props.fast || (!props.profile && accountId); + +const name = profile.name ?? accountId; +const title = props.title ?? `${name} @${accountId}`; +const tooltip = + props.tooltip && (props.tooltip === true ? title : props.tooltip); + +const { href } = VM.require("buildhub.near/widget/lib.url") || { + href: () => {}, +}; + +let inner = ( + <> + {!hideImage && ( + + )} + {!hideAccountId && ( + + @{accountId} + + )} + +); + +inner = link ? ( + + {inner} + +) : ( + {inner} +); + +if (props.tooltip === true) { + return ( + + ); +} +if (tooltip) { + inner = ( + {tooltip}}> + {inner} + + ); +} + +return inner; diff --git a/apps/builddao/widget/components/profile/ProfileTabs.jsx b/apps/builddao/widget/components/profile/ProfileTabs.jsx new file mode 100644 index 00000000..5d1fb552 --- /dev/null +++ b/apps/builddao/widget/components/profile/ProfileTabs.jsx @@ -0,0 +1,151 @@ +const { Post } = VM.require("buildhub.near/widget/components") || { + Post: () => <>, +}; + +const accountId = props.accountId ?? context.accountId; +if (!accountId) { + return "No account ID"; +} + +const profile = props.profile ?? Social.getr(`${accountId}/profile`); + +if (profile === null) { + return "Loading"; +} + +const description = profile.description; + +const pills = [ + { id: "posts", title: "Posts" }, + { id: "nfts", title: "NFTs" }, + { id: "widget", title: "Widgets" }, +]; + +const Nav = styled.div` + .nav-pills { + background: var(--bg-1, #0b0c14); + font-weight: 500; + --bs-nav-pills-border-radius: 0; + --bs-nav-link-color: var(--font-color, #fff); + --bs-nav-pills-link-active-color: var(--font-color, #fff); + --bs-nav-pills-link-active-bg: var(--bg-1, #0b0c14); + --bs-nav-link-padding-y: 0.75rem; + border-bottom: 1px solid var(--stroke-color, rgba(255, 255, 255, 0.2)); + padding-top: 3px; + } + .nav-link.active { + border-bottom: 2px solid var(--Yellow, #ffaf51); + } + + .nav-item:not(:has(> .disabled)):hover { + background: rgba(13, 110, 253, 0.15); + } +`; + +const StyledContent = styled.div` + #pills-nfts { + .nft-card { + background: var(--bg-1, #0b0c14); + border-radius: 1rem; + border: 1px solid var(--stroke-color, rgba(255, 255, 255, 0.2)); + + .nft-title, + nft-description { + color: var(--font-color, #fff); + } + } + } + + #pills-widget { + } +`; + +return ( + <> + + +
+
+ {description && ( + + )} + +
+
+
+ {state.loadnfts && ( + + )} +
+
+ {state.loadwidget && ( + + )} +
+
+ +); diff --git a/apps/builddao/widget/components/profile/WidgetMetadata.jsx b/apps/builddao/widget/components/profile/WidgetMetadata.jsx new file mode 100644 index 00000000..59f5908b --- /dev/null +++ b/apps/builddao/widget/components/profile/WidgetMetadata.jsx @@ -0,0 +1,192 @@ +const accountId = props.accountId; +const widgetName = props.widgetName; +const widgetPath = `${accountId}/widget/${widgetName}`; +const blockHeight = props.blockHeight; +const metadata = props.metadata ?? Social.getr(`${widgetPath}/metadata`); +const renderTag = props.renderTag; + +const name = metadata.name ?? widgetName; +const description = metadata.description; +const image = metadata.image; +const tags = Object.keys(metadata.tags ?? {}); +const expanded = !!props.expanded; + +const linktree = Object.entries(metadata.linktree ?? {}); +const linktreeElements = { + website: { + prefix: "https://", + icon: "bi-globe2", + }, +}; + +const linktreeObjects = linktree.map((o, i) => { + const key = o[0]; + let value = o[1]; + if (!value) { + return null; + } + const e = linktreeElements[key]; + if (e.prefix) { + value = value && value.replace(e.prefix, ""); + } + const icon = e.icon ? ( + + ) : ( + "" + ); + return e.prefix ? ( +
+ + {icon} + {value} + +
+ ) : ( +
+ {key}: {icon} + {value} +
+ ); +}); + +const descriptionKey = `${widgetPath}-description`.replaceAll(/[._\/-]/g, "--"); +const { href } = VM.require("buildhub.near/widget/lib.url") || { + href: () => {}, +}; + +return ( +
+
+
+
+ +
+
+
+
+
{name}
+
+ + + {widgetPath} + +
+
+
+ {tags.length > 0 && ( +
+ {tags.map((tag, i) => { + const tagBadge = ( + + #{tag} + + ); + return renderTag ? renderTag(tag, tagBadge) : tagBadge; + })} +
+ )} + {!expanded && (description || linktreeObjects.length > 0) && ( + + )} + + Source + + + History + + + + {accountId === context.accountId ? "Edit" : "Fork"} + +
+
+
+
+ + {linktreeObjects} +
+
+
+
+ By + +
+
+ + + + +
+
+
+
+); diff --git a/apps/builddao/widget/config/app.jsx b/apps/builddao/widget/config/app.jsx index b2eb2e18..592517b5 100644 --- a/apps/builddao/widget/config/app.jsx +++ b/apps/builddao/widget/config/app.jsx @@ -5,36 +5,44 @@ return { path: "buildhub.near/widget/page.home", blockHeight: "final", init: { - name: "Home" - } + name: "Home", + }, }, feed: { path: "buildhub.near/widget/page.feed", blockHeight: "final", init: { - name: "Feed" - } + name: "Feed", + }, }, proposal: { path: "buildhub.near/widget/page.projects", blockHeight: "final", init: { - name: "Projects" - } + name: "Projects", + }, }, resources: { path: "buildhub.near/widget/page.resources", blockHeight: "final", init: { - name: "Resources" - } + name: "Resources", + }, }, library: { path: "buildhub.near/widget/page.library", blockHeight: "final", init: { - name: "Library" - } - } - } + name: "Library", + }, + }, + profile: { + path: "buildhub.near/widget/page.profile", + blockHeight: "final", + init: { + name: "Profile", + }, + hide: true, + }, + }, }; diff --git a/apps/builddao/widget/config/feed.jsx b/apps/builddao/widget/config/feed.jsx index ef0a352f..14c1cbc2 100644 --- a/apps/builddao/widget/config/feed.jsx +++ b/apps/builddao/widget/config/feed.jsx @@ -1,4 +1,6 @@ -const { Post } = VM.require("buildhub.near/widget/components") || (() => <>); +const { Post } = VM.require("buildhub.near/widget/components") || { + Post: () => <>, +}; function formatDate(date) { const options = { year: "numeric", month: "short", day: "numeric" }; @@ -17,7 +19,7 @@ return { init: { name: "All", // maybe these should be moved to navbar specific icon: "bi-list", - requiredHashtags: ["build"] + requiredHashtags: ["build"], }, }, resolutions: { diff --git a/apps/builddao/widget/config/projects.jsx b/apps/builddao/widget/config/projects.jsx index 5131fe05..569ac4a2 100644 --- a/apps/builddao/widget/config/projects.jsx +++ b/apps/builddao/widget/config/projects.jsx @@ -1,4 +1,6 @@ -const { Post } = VM.require("buildhub.near/widget/components") || (() => <>); +const { Post } = VM.require("buildhub.near/widget/components") || { + Post: () => <>, +}; function formatDate(date) { const options = { year: "numeric", month: "short", day: "numeric" }; diff --git a/apps/builddao/widget/page/feed.jsx b/apps/builddao/widget/page/feed.jsx index 4ab7394e..12812cc2 100644 --- a/apps/builddao/widget/page/feed.jsx +++ b/apps/builddao/widget/page/feed.jsx @@ -11,7 +11,7 @@ const { theme } = VM.require("buildhub.near/widget/config.theme") ?? { const { SidebarLayout } = VM.require( "buildhub.near/widget/template.SidebarLayout" ) || { - SidebarLayout: () => <>Layout loading..., + SidebarLayout: () => <>, }; if (!page) page = Object.keys(routes)[0] || "home"; diff --git a/apps/builddao/widget/page/home.jsx b/apps/builddao/widget/page/home.jsx index e752c1e0..59f22695 100644 --- a/apps/builddao/widget/page/home.jsx +++ b/apps/builddao/widget/page/home.jsx @@ -1,20 +1,20 @@ const { Hero } = VM.require("buildhub.near/widget/home.hero") || { - Hero: () => <> + Hero: () => <>, }; const { Goals } = VM.require("buildhub.near/widget/home.goals") || { - Goals: () => <> + Goals: () => <>, }; const { Join } = VM.require("buildhub.near/widget/home.join") || { - Join: () => <> + Join: () => <>, }; const { Governance } = VM.require("buildhub.near/widget/home.governance") || { - Governance: () => <> + Governance: () => <>, }; const { CTA } = VM.require("buildhub.near/widget/home.cta") || { - CTA: () => <> + CTA: () => <>, }; const { Footer } = VM.require("buildhub.near/widget/home.footer") || { - Footer: () => <> + Footer: () => <>, }; const Root = styled.div` diff --git a/apps/builddao/widget/page/profile.jsx b/apps/builddao/widget/page/profile.jsx new file mode 100644 index 00000000..189a4403 --- /dev/null +++ b/apps/builddao/widget/page/profile.jsx @@ -0,0 +1,5 @@ +return ( +
+ ; +
+); diff --git a/apps/builddao/widget/page/projects.jsx b/apps/builddao/widget/page/projects.jsx index d59a63a4..b90c8b0a 100644 --- a/apps/builddao/widget/page/projects.jsx +++ b/apps/builddao/widget/page/projects.jsx @@ -11,7 +11,7 @@ const { theme } = VM.require("buildhub.near/widget/config.theme") ?? { const { SidebarLayout } = VM.require( "buildhub.near/widget/template.SidebarLayout" ) || { - SidebarLayout: () => <>Layout loading..., + SidebarLayout: () => <>, }; if (!page) page = Object.keys(routes)[0] || "home"; diff --git a/apps/builddao/widget/template/SidebarLayout.jsx b/apps/builddao/widget/template/SidebarLayout.jsx index 0cfec2fe..a70735e9 100644 --- a/apps/builddao/widget/template/SidebarLayout.jsx +++ b/apps/builddao/widget/template/SidebarLayout.jsx @@ -1,4 +1,6 @@ -const { Button } = VM.require("buildhub.near/widget/components"); +const { Button } = VM.require("buildhub.near/widget/components") || { + Button: () => <>, +}; const Container = styled.div` display: grid; diff --git a/apps/embeds/bos.config.json b/apps/embeds/bos.config.json index 50143cc0..0ccacb11 100644 --- a/apps/embeds/bos.config.json +++ b/apps/embeds/bos.config.json @@ -1,3 +1,3 @@ { "appAccount": "embeds.near" -} \ No newline at end of file +} diff --git a/apps/embeds/widget/Embed.jsx b/apps/embeds/widget/Embed.jsx index 7cb6a601..cecc6ba1 100644 --- a/apps/embeds/widget/Embed.jsx +++ b/apps/embeds/widget/Embed.jsx @@ -33,30 +33,30 @@ if (accountId) { const href = props.href; -const assertString = s => { +const assertString = (s) => { if (typeof s !== "string") { return null; - } -} + } +}; // checks for use of "**" in widgetSrc string -const containsGlob = path => /\*\*/.test(path) +const containsGlob = (path) => /\*\*/.test(path); const findWithKey = (key, href) => { - let fragments = key.split('**').filter(f => f != '') - const hasFragment = (str, fragment) => str.search(fragment) != -1 + let fragments = key.split("**").filter((f) => f != ""); + const hasFragment = (str, fragment) => str.search(fragment) != -1; while (fragments.length > 0) { if (hasFragment(href, fragments[0])) { - fragments.shift() + fragments.shift(); } else { - return null + return null; } } - return true -} + return true; +}; const parseUrl = (url) => { - assertString(url) + assertString(url); if (url.startsWith("/")) { url = `https://near.social${url}`; } @@ -68,17 +68,17 @@ const parseUrl = (url) => { }; const parseGlob = (path) => { - assertString(path) - const keysWithGlobs = [...EmbedMap.keys()].filter(key => containsGlob(key)) - const keysThatMatch = keysWithGlobs.filter(key => findWithKey(key,href)) + assertString(path); + const keysWithGlobs = [...EmbedMap.keys()].filter((key) => containsGlob(key)); + const keysThatMatch = keysWithGlobs.filter((key) => findWithKey(key, href)); if (keysThatMatch.length >= 1) { try { - return keysThatMatch[0] + return keysThatMatch[0]; } catch { - return null + return null; } } - return null + return null; }; const parsed = useMemo(() => { @@ -92,7 +92,7 @@ const parsed = useMemo(() => { } // try parsing embed link to glob if url failed - const widgetSrc = parseGlob(href) + const widgetSrc = parseGlob(href); if (!!widgetSrc) { return { widgetSrc, diff --git a/apps/embeds/widget/Feed.jsx b/apps/embeds/widget/Feed.jsx index 1725a615..db7cada7 100644 --- a/apps/embeds/widget/Feed.jsx +++ b/apps/embeds/widget/Feed.jsx @@ -1,4 +1,6 @@ -const { Feed } = VM.require("devs.near/widget/Module.Feed") || (() => <>); +const { Feed } = VM.require("devs.near/widget/Module.Feed") || { + Feed: () => <>, +}; Feed = Feed || (() => <>); // make sure you have this or else it can break diff --git a/apps/embeds/widget/Plugin/Creator.jsx b/apps/embeds/widget/Plugin/Creator.jsx index 0408020d..88392798 100644 --- a/apps/embeds/widget/Plugin/Creator.jsx +++ b/apps/embeds/widget/Plugin/Creator.jsx @@ -1,5 +1,5 @@ /** - * TODO: This should be more generalized. + * TODO: This should be more generalized. * Currently only supports embed plugins */ const Wrapper = styled.div` @@ -44,10 +44,9 @@ const [activeTab, setActiveTab] = useState("data"); function generateUID() { const maxHex = 0xffffffff; const randomNumber = Math.floor(Math.random() * maxHex); - return randomNumber.toString(16).padStart(8, '0'); + return randomNumber.toString(16).padStart(8, "0"); } - const handleCreate = () => { Social.set({ plugin: { diff --git a/apps/embeds/widget/Post/Content.jsx b/apps/embeds/widget/Post/Content.jsx index e7485e8c..dedace18 100644 --- a/apps/embeds/widget/Post/Content.jsx +++ b/apps/embeds/widget/Post/Content.jsx @@ -11,15 +11,17 @@ const Wrapper = styled.div` overflow: hidden; .expand-post { - position : absolute; - z-index : 1; - top : 35em; - left : 0; - background-image : linear-gradient(to bottom, - rgba(255,255,255, 0), - rgba(255,255,255, 1) 25%); - width : 100%; - height : 3em; + position: absolute; + z-index: 1; + top: 35em; + left: 0; + background-image: linear-gradient( + to bottom, + rgba(255, 255, 255, 0), + rgba(255, 255, 255, 1) 25% + ); + width: 100%; + height: 3em; > div { position: relative; @@ -36,7 +38,7 @@ const Wrapper = styled.div` } } - @media(max-width: 991px) { + @media (max-width: 991px) { max-height: 30em; .expand-post { top: 27em; @@ -123,4 +125,4 @@ return (
-); \ No newline at end of file +); diff --git a/apps/embeds/widget/Post/EditableContent.jsx b/apps/embeds/widget/Post/EditableContent.jsx index 791f5bc3..7e47bd17 100644 --- a/apps/embeds/widget/Post/EditableContent.jsx +++ b/apps/embeds/widget/Post/EditableContent.jsx @@ -14,4 +14,4 @@ return ( noEmbed: false, }} /> -); \ No newline at end of file +); diff --git a/apps/embeds/widget/Post/Index.jsx b/apps/embeds/widget/Post/Index.jsx index c896d6a4..8168a0e1 100644 --- a/apps/embeds/widget/Post/Index.jsx +++ b/apps/embeds/widget/Post/Index.jsx @@ -32,26 +32,45 @@ const link = const Wrapper = styled.div` margin: 0 -12px; line-height: normal; - + .post { position: relative; padding: 12px; padding-bottom: 4px; display: flex; - h1, h2, h3, h4, h5, h6 { + h1, + h2, + h3, + h4, + h5, + h6 { font-size: 16px !important; } - @media(max-width: 767px) { + @media (max-width: 767px) { font-size: 15px !important; - h1, h2, h3, h4, h5, h6 { + h1, + h2, + h3, + h4, + h5, + h6 { font-size: 15px !important; } } - h1, h2, h3, h4, h5, h6, strong, b { + h1, + h2, + h3, + h4, + h5, + h6, + strong, + b { font-weight: 500 !important; } - ol, ul, dl { + ol, + ul, + dl { margin-bottom: 0.5rem; white-space: inherit; } @@ -69,16 +88,18 @@ const Wrapper = styled.div` min-width: 5em; } - .table>:not(caption)>*>* { - padding: .3rem; + .table > :not(caption) > * > * { + padding: 0.3rem; } &:hover { background-color: rgba(0, 0, 0, 0.03); .expand-post { - background-image : linear-gradient(to bottom, - rgba(0,0,0, 0), - rgba(247.35,247.35,247.35, 1) 25%); + background-image: linear-gradient( + to bottom, + rgba(0, 0, 0, 0), + rgba(247.35, 247.35, 247.35, 1) 25% + ); } } @@ -108,7 +129,7 @@ const Wrapper = styled.div` background-color: #ddd; z-index: -1; } - + .left { margin-right: 12px; min-width: 40px; @@ -275,4 +296,4 @@ return ( /> )} -); \ No newline at end of file +); diff --git a/functions/[[accountId]]/widget/[[index]].js b/functions/[[accountId]]/widget/[[index]].js index 1ab0ded5..d9d1742b 100644 --- a/functions/[[accountId]]/widget/[[index]].js +++ b/functions/[[accountId]]/widget/[[index]].js @@ -78,8 +78,7 @@ class NoscriptDescriptionInjector { function defaultData() { const image = "https://nearbuilders.org/assets/logo.png"; const title = "Build DAO"; - const description = - "Support Systems for Open Web Developers"; + const description = "Support Systems for Open Web Developers"; return { image, title, diff --git a/src/App.js b/src/App.js index cf38561f..2daff8c9 100644 --- a/src/App.js +++ b/src/App.js @@ -85,8 +85,11 @@ function App() { signInContractId: NetworkId == "testnet" ? "v1.social08.testnet" : "social.near", trialAccountSpecs: { - url: NetworkId == "testnet" ? "https://test.nearbuilders.org/#trial-url/ACCOUNT_ID/SECRET_KEY" : "https://www.nearbuilders.org/#trial-url/ACCOUNT_ID/SECRET_KEY", - modalOptions: KEYPOM_OPTIONS(NetworkId) + url: + NetworkId == "testnet" + ? "https://test.nearbuilders.org/#trial-url/ACCOUNT_ID/SECRET_KEY" + : "https://www.nearbuilders.org/#trial-url/ACCOUNT_ID/SECRET_KEY", + modalOptions: KEYPOM_OPTIONS(NetworkId), }, instantSignInSpecs: { url: diff --git a/src/App.scss b/src/App.scss index 8a847d35..54b8fe5f 100644 --- a/src/App.scss +++ b/src/App.scss @@ -6,7 +6,8 @@ body { color-scheme: dark; } -body, html { +body, +html { -webkit-font-smoothing: antialiased; height: 100%; } @@ -15,10 +16,11 @@ body, html { cursor: pointer; } -.btn-success, .btn-primary { +.btn-success, +.btn-primary { .text-muted { color: #fff !important; - }; + } } .outline-none { @@ -36,7 +38,7 @@ a { } .sidebar-items { - &> div { + & > div { border-right: 1px solid #e5e5e5; text-align: center; min-height: 4rem; @@ -44,7 +46,7 @@ a { display: flex; } - &> div:not(.apps) { + & > div:not(.apps) { min-width: 4rem; align-items: center !important; justify-content: center !important; diff --git a/src/components/BosLoaderBanner.js b/src/components/BosLoaderBanner.js index 9a008d79..0799a5d9 100644 --- a/src/components/BosLoaderBanner.js +++ b/src/components/BosLoaderBanner.js @@ -99,4 +99,4 @@ export function BosLoaderBanner() { ); -} \ No newline at end of file +} diff --git a/src/components/Editor/FileTab.js b/src/components/Editor/FileTab.js index d0e3dd74..8843e96e 100644 --- a/src/components/Editor/FileTab.js +++ b/src/components/Editor/FileTab.js @@ -148,8 +148,9 @@ export function FileTab(props) { )} { e.preventDefault(); e.stopPropagation(); diff --git a/src/data/widgets.js b/src/data/widgets.js index 8c6e4073..cde2a12d 100644 --- a/src/data/widgets.js +++ b/src/data/widgets.js @@ -12,7 +12,7 @@ const TestnetWidgets = { widgetMetadataEditor: "eugenethedream/widget/WidgetMetadataEditor", widgetMetadata: "eugenethedream/widget/WidgetMetadata", profileImage: "eugenethedream/widget/ProfileImage", - profilePage: "eugenethedream/widget/Profile", + profilePage: "buildhub.near/widget/Profile", profileName: "eugenethedream/widget/ProfileName", profileInlineBlock: "eugenethedream/widget/Profile", notificationButton: "eugenethedream/widget/NotificationButton", @@ -28,7 +28,7 @@ const MainnetWidgets = { widgetMetadata: "buildhub.near/widget/WidgetMetadata", profileImage: "mob.near/widget/ProfileImage", notificationButton: "mob.near/widget/NotificationButton", - profilePage: "near/widget/ProfilePage", + profilePage: "buildhub.near/widget/Profile", profileName: "patrick.near/widget/ProfileName", editorComponentSearch: "mob.near/widget/Editor.ComponentSearch", profileInlineBlock: "mob.near/widget/Profile.InlineBlock", diff --git a/src/hooks/useBosLoaderInitializer.js b/src/hooks/useBosLoaderInitializer.js index c2f8c1d4..5979c0ba 100644 --- a/src/hooks/useBosLoaderInitializer.js +++ b/src/hooks/useBosLoaderInitializer.js @@ -1,8 +1,8 @@ -import { useCallback, useEffect } from 'react'; +import { useCallback, useEffect } from "react"; -import { useBosLoaderStore } from '../stores/bos-loader'; +import { useBosLoaderStore } from "../stores/bos-loader"; -import { useFlags } from './useFlags'; +import { useFlags } from "./useFlags"; export function useBosLoaderInitializer() { const [flags] = useFlags(); @@ -21,14 +21,14 @@ export function useBosLoaderInitializer() { try { const res = await fetch(url, { - method: 'GET', + method: "GET", headers: { - Accept: 'application/json', + Accept: "application/json", }, }); if (!res.ok) { - throw new Error('Network response was not OK'); + throw new Error("Network response was not OK"); } const data = await res.json(); @@ -46,7 +46,7 @@ export function useBosLoaderInitializer() { }); } }, - [setStore], + [setStore] ); useEffect(() => { @@ -56,4 +56,4 @@ export function useBosLoaderInitializer() { setStore({ hasResolved: true }); } }, [fetchRedirectMap, loaderUrl, setStore]); -} \ No newline at end of file +} diff --git a/src/hooks/useFlags.js b/src/hooks/useFlags.js index ff4ad3e9..d67b1d2d 100644 --- a/src/hooks/useFlags.js +++ b/src/hooks/useFlags.js @@ -1,20 +1,21 @@ -import { useCallback, useEffect, useState } from 'react'; - +import { useCallback, useEffect, useState } from "react"; export function useFlags() { const [rawFlags, setRawFlags] = useState(); useEffect(() => { - const flags = localStorage.getItem('flags') ? JSON.parse(localStorage.getItem('flags') || '') : {}; + const flags = localStorage.getItem("flags") + ? JSON.parse(localStorage.getItem("flags") || "") + : {}; setRawFlags(flags); }, []); const setFlags = useCallback((newFlags) => { setRawFlags((f) => { const updated = { ...f, ...newFlags }; - localStorage.setItem('flags', JSON.stringify(updated)); + localStorage.setItem("flags", JSON.stringify(updated)); - alert('Flags have been saved.'); + alert("Flags have been saved."); // reload for changes to take effect location.reload(); @@ -25,4 +26,4 @@ export function useFlags() { }, []); return [rawFlags, setFlags]; -} \ No newline at end of file +} diff --git a/src/index.css b/src/index.css index 5c475efe..93512865 100644 --- a/src/index.css +++ b/src/index.css @@ -1,12 +1,12 @@ :root { --slate-dark-1: #151718; - --slate-dark-5: #2B2F31; + --slate-dark-5: #2b2f31; --slate-dark-6: #313538; - --slate-dark-8: #4C5155; + --slate-dark-8: #4c5155; --slate-dark-9: #697177; - --slate-dark-11: #9BA1A6; - --slate-dark-12: #ECEDEE; - --blue-light-9: #0091FF; + --slate-dark-11: #9ba1a6; + --slate-dark-12: #ecedee; + --blue-light-9: #0091ff; --font-weight-medium: 500; --font-weight-bold: 600; @@ -16,4 +16,3 @@ --account-center-position-top: 64px; --account-center-position-right: -10px; } - diff --git a/src/pages/EditorPage.js b/src/pages/EditorPage.js index c357095e..de99f54c 100644 --- a/src/pages/EditorPage.js +++ b/src/pages/EditorPage.js @@ -437,20 +437,20 @@ export default function EditorPage(props) { (uncommittedPreviews) => { return uncommittedPreviews ? { - redirectMap: Object.fromEntries( - Object.entries(allSaved) - .filter(([jpath, code]) => code !== true) - .map(([jpath, code]) => { - const path = JSON.parse(jpath); - return [ - pathToSrc(path), - { - code, - }, - ]; - }) - ), - } + redirectMap: Object.fromEntries( + Object.entries(allSaved) + .filter(([jpath, code]) => code !== true) + .map(([jpath, code]) => { + const path = JSON.parse(jpath); + return [ + pathToSrc(path), + { + code, + }, + ]; + }) + ), + } : undefined; }, [allSaved, pathToSrc] @@ -696,8 +696,9 @@ export default function EditorPage(props) {
@@ -909,8 +917,9 @@ export default function EditorPage(props) {
diff --git a/src/pages/Viewer.js b/src/pages/Viewer.js index c5d3922b..600b2c2e 100644 --- a/src/pages/Viewer.js +++ b/src/pages/Viewer.js @@ -21,7 +21,7 @@ function Viewer({ code, ...props }) { const defaultSrc = "buildhub.near/widget/app"; // default widget to load const pathSrc = path || defaultSrc; // if no path, load default widget return pathSrc; - // const lastSlashIndex = pathSrc.lastIndexOf("/", pathSrc.indexOf(".near")); + // const lastSlashIndex = pathSrc.lastIndexOf("/", pathSrc.indexOf(".near")); // return lastSlashIndex !== -1 // ? pathSrc.substring(lastSlashIndex + 1) // : defaultSrc; diff --git a/src/stores/bos-loader.js b/src/stores/bos-loader.js index 1c04bc0f..4914a4e0 100644 --- a/src/stores/bos-loader.js +++ b/src/stores/bos-loader.js @@ -1,9 +1,9 @@ -import { create } from 'zustand'; +import { create } from "zustand"; export const useBosLoaderStore = create((set) => ({ failedToLoad: false, hasResolved: false, - loaderUrl: '', + loaderUrl: "", redirectMap: {}, set: (state) => set((previousState) => ({ ...previousState, ...state })), -})); \ No newline at end of file +})); diff --git a/src/utils/keypom-options.js b/src/utils/keypom-options.js index 00903744..a0136d44 100644 --- a/src/utils/keypom-options.js +++ b/src/utils/keypom-options.js @@ -1,54 +1,59 @@ export const KEYPOM_OPTIONS = (networkId) => { - return { - beginTrial: { - landing: { - title: "Create an Account", - body: "To start, enter a username.", - fieldPlaceholder: "Account ID", - buttonText: "Create", - }, - claiming: { - title: "Creating Account", - body: "Your account is being created. Please wait...", - }, - claimed: { - title: "You're all set! 🎉", - body: "Your account has been successfully created.", - buttonText: "Continue to app" - } + return { + beginTrial: { + landing: { + title: "Create an Account", + body: "To start, enter a username.", + fieldPlaceholder: "Account ID", + buttonText: "Create", + }, + claiming: { + title: "Creating Account", + body: "Your account is being created. Please wait...", + }, + claimed: { + title: "You're all set! 🎉", + body: "Your account has been successfully created.", + buttonText: "Continue to app", + }, + }, + trialOver: { + mainBody: { + title: "Your trial has ended", + body: "Choose a wallet provider and onboard fully into the NEAR ecosystem.", + imageOne: { + title: "Secure Your Digital Assets", + body: "Now that your trial is over, secure your account with an official wallet provider!", }, - trialOver: { - mainBody: { - title: "Your trial has ended", - body: "Choose a wallet provider and onboard fully into the NEAR ecosystem.", - imageOne: { - title: "Secure Your Digital Assets", - body: "Now that your trial is over, secure your account with an official wallet provider!" - }, - imageTwo: { - title: "Log In to Any NEAR App", - body: "Once your account is secured, you can use any app on NEAR!" - } - }, - offboardingOptions: { - title: "Choose a Wallet", - } + imageTwo: { + title: "Log In to Any NEAR App", + body: "Once your account is secured, you can use any app on NEAR!", }, - invalidAction: { - title: "Invalid Action", - body: "Your trial does not allow you to perform this action. For more information, please contact the site administrator." - }, - insufficientBalance: { - title: "Insufficient Balance", - body: "Your account does not have enough balance for the action you are trying to perform. Please try again with a different action. For more information, please contact the site administrator." - }, - wallets: [ - { - name: "MyNEARWallet", - description: "Secure your account with a Seed Phrase", - iconUrl: "data:image/png;base64,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", - redirectUrl: `${networkId == "testnet" ? "https://testnet.mynearwallet.com" : "https://app.mynearwallet.com"}/linkdrop/ACCOUNT_ID/SECRET_KEY` - } - ] - } -} \ No newline at end of file + }, + offboardingOptions: { + title: "Choose a Wallet", + }, + }, + invalidAction: { + title: "Invalid Action", + body: "Your trial does not allow you to perform this action. For more information, please contact the site administrator.", + }, + insufficientBalance: { + title: "Insufficient Balance", + body: "Your account does not have enough balance for the action you are trying to perform. Please try again with a different action. For more information, please contact the site administrator.", + }, + wallets: [ + { + name: "MyNEARWallet", + description: "Secure your account with a Seed Phrase", + iconUrl: + "data:image/png;base64,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", + redirectUrl: `${ + networkId == "testnet" + ? "https://testnet.mynearwallet.com" + : "https://app.mynearwallet.com" + }/linkdrop/ACCOUNT_ID/SECRET_KEY`, + }, + ], + }; +};