diff --git a/apps/builddao/widget/Notification/Item/Left.jsx b/apps/builddao/widget/Notification/Item/Left.jsx new file mode 100644 index 00000000..ea3c7e3e --- /dev/null +++ b/apps/builddao/widget/Notification/Item/Left.jsx @@ -0,0 +1,9 @@ +const { href } = VM.require("buildhub.near/widget/lib.url") || { + href: () => {} +}; + +if (!props.type) { + return "Loading ..."; +} + +return <>{props.message}; diff --git a/apps/builddao/widget/Notification/Item/Right.jsx b/apps/builddao/widget/Notification/Item/Right.jsx new file mode 100644 index 00000000..4c941075 --- /dev/null +++ b/apps/builddao/widget/Notification/Item/Right.jsx @@ -0,0 +1,24 @@ +const { href } = VM.require("buildhub.near/widget/lib.url") || { + href: () => {} +}; + +if (!props.type) { + return "Loading ..."; +} + +return ( + + View + +); diff --git a/apps/builddao/widget/Notification/Item/buildhub.jsx b/apps/builddao/widget/Notification/Item/buildhub.jsx new file mode 100644 index 00000000..058712ed --- /dev/null +++ b/apps/builddao/widget/Notification/Item/buildhub.jsx @@ -0,0 +1,22 @@ +const { value } = props; + +return ( + + ), + R: ( + + ), + ...props + }} + /> +); diff --git a/apps/builddao/widget/Notification/NotificationRolesSelector.jsx b/apps/builddao/widget/Notification/NotificationRolesSelector.jsx new file mode 100644 index 00000000..5d96449a --- /dev/null +++ b/apps/builddao/widget/Notification/NotificationRolesSelector.jsx @@ -0,0 +1,173 @@ +const DaoSDK = VM.require("sdks.near/widget/SDKs.Sputnik.DaoSDK"); +const { InputField } = VM.require("buildhub.near/widget/components") || { + InputField: <> +}; + +if (!DaoSDK) { + return <>; +} +const [groupsAndMembers, setGroupsAndMembers] = useState([]); +const [selectedRoles, setSelectedRoles] = useState({}); // { role:boolean } +const daoId = props.daoId || "build.sputnik-dao.near"; +const accountId = props.accountId ?? context.accountId; +const onUpdate = props.onUpdate ?? (() => {}); +const proposalType = props.proposalType; +const [message, setMessage] = useState( + `${accountId} created ${proposalType} proposal for ${daoId}` +); +const bootstrapTheme = props.bootstrapTheme || "dark"; + +const sdk = DaoSDK(daoId); + +const group = sdk.getGroupsAndMembers(); +if (group === null || !group.length) { + return; +} +setGroupsAndMembers(group); + +const handleCheckboxChange = (role) => { + setSelectedRoles((prevRoles) => { + if (prevRoles.hasOwnProperty(role)) { + return { + ...prevRoles, + [role]: !prevRoles[role] + }; + } else { + return { + ...prevRoles, + [role]: true + }; + } + }); +}; + +const ThemeContainer = + props.ThemeContainer || + styled.div` + --primary-color: rgb(255, 175, 81); + `; + +const Wrapper = styled.div` + .checked > span:first-child { + background: var(--primary-color) !important; + border-color: var(--primary-color) !important; + } + + .cbx:hover span:first-child { + border-color: var(--primary-color) !important; + } + + button[type="checkbox"]:hover { + background: none !important; + } + + label { + font-size: 13px; + } +`; + +const createNotificationsData = () => { + const someRoleSelected = Object.values(selectedRoles).some( + (value) => value === true + ); + if (!someRoleSelected) { + return null; + } + const membersToNotify = []; + Object.keys(selectedRoles).map((item) => { + if (selectedRoles[item] === true) { + membersToNotify = membersToNotify.concat( + groupsAndMembers.find((group) => group.name === item).members + ); + } + }); + const uniqueMembersArray = [...new Set(membersToNotify)]; + const notification = { + [accountId]: { + index: { + notify: JSON.stringify( + uniqueMembersArray.map((account) => { + return { + key: account, + value: { + message: message, + params: { + daoId: daoId, + tab: "proposals", + page: "proposal" + }, + type: "buildhub/custom", + widget: "buildhub.near/widget/home" + } + }; + }) + ) + } + } + }; + const call = [ + { + contractName: "social.near", + methodName: "set", + args: { data: notification, options: { refund_unused_deposit: true } }, + deposit: 200000000000000000000000 + } + ]; + return call; +}; + +useEffect(() => { + onUpdate(createNotificationsData()); +}, [selectedRoles]); + +const capitalizeFirstLetter = (string) => { + return string.charAt(0).toUpperCase() + string.slice(1); +}; + +const groupList = useMemo(() => { + return ( + Array.isArray(groupsAndMembers) && + groupsAndMembers.map((group) => { + const membersLength = group?.members.length; + if (!membersLength) { + return null; + } + return ( +
+ + {capitalizeFirstLetter(group.name)} ({membersLength} members) +
+ ), + onChange: (checked) => handleCheckboxChange(group.name), + checked: selectedRoles[group.name] ?? false + }} + /> + + ); + }) + ); +}, [groupsAndMembers, selectedRoles]); + +return ( + + +
Send notification to following roles: (Optional)
+
+ + setMessage(e.target.value)} + /> +
+
{groupList}
+
+
+); diff --git a/apps/builddao/widget/Proposals.jsx b/apps/builddao/widget/Proposals.jsx index dda124f5..4bda8cd1 100644 --- a/apps/builddao/widget/Proposals.jsx +++ b/apps/builddao/widget/Proposals.jsx @@ -178,7 +178,9 @@ const handleVote = ({ action, proposalId, proposer, showNotification }) => { data: notification, options: { refund_unused_deposit: true }, }, - deposit: 100000000000000000000000, + deposit: Big(JSON.stringify(notification).length * 16) + .mul(Big(10).pow(20)) + .toString(), }, ] : null, @@ -339,9 +341,9 @@ return ( }} />
-
-

Proposals

-
+
+

Proposals

+
diff --git a/apps/builddao/widget/components/modals/propose/AddMember.jsx b/apps/builddao/widget/components/modals/propose/AddMember.jsx index 9d09a08d..fd16192d 100644 --- a/apps/builddao/widget/components/modals/propose/AddMember.jsx +++ b/apps/builddao/widget/components/modals/propose/AddMember.jsx @@ -29,6 +29,7 @@ useEffect(() => { }, [props.item]); const memoizedKey = useMemo((editorKey) => editorKey, [editorKey]); const [validatedAddresss, setValidatedAddresss] = useState(true); +const [notificationsData, setNotificationData] = useState(null); const regex = /.{1}\.near$/; useEffect(() => { @@ -221,12 +222,21 @@ return ( embedCss: props.customCSS || MarkdownEditor, onChange: (v) => { setText(v); - }, + } }} />
- + { + setNotificationData(v); + }, + proposalType: "Add Member" + }} + />
diff --git a/apps/builddao/widget/components/modals/propose/FunctionCall.jsx b/apps/builddao/widget/components/modals/propose/FunctionCall.jsx index d93af195..a4f8d9b0 100644 --- a/apps/builddao/widget/components/modals/propose/FunctionCall.jsx +++ b/apps/builddao/widget/components/modals/propose/FunctionCall.jsx @@ -14,6 +14,7 @@ const [deposit, setDeposit] = useState(0); const [validatedAddresss, setValidatedAddress] = useState(true); const [text, setText] = useState(""); const [editorKey, setEditorKey] = useState(0); +const [notificationsData, setNotificationData] = useState(null); const bootstrapTheme = props.bootstrapTheme; @@ -249,11 +250,21 @@ return ( embedCss: props.customCSS || MarkdownEditor, onChange: (v) => { setText(v); - }, + } }} />
+ { + setNotificationData(v); + }, + proposalType: "Function Call" + }} + />
diff --git a/apps/builddao/widget/components/modals/propose/RemoveMember.jsx b/apps/builddao/widget/components/modals/propose/RemoveMember.jsx index 7b859eee..cdfdc20c 100644 --- a/apps/builddao/widget/components/modals/propose/RemoveMember.jsx +++ b/apps/builddao/widget/components/modals/propose/RemoveMember.jsx @@ -15,6 +15,7 @@ const sdk = DaoSDK(selectedDAO); const [text, setText] = useState(""); const [editorKey, setEditorKey] = useState(0); +const [notificationsData, setNotificationData] = useState(null); const bootstrapTheme = props.bootstrapTheme; useEffect(() => { @@ -223,12 +224,21 @@ return ( embedCss: props.customCSS || MarkdownEditor, onChange: (v) => { setText(v); - }, + } }} /> - + { + setNotificationData(v); + }, + proposalType: "Remove Member" + }} + />
diff --git a/apps/builddao/widget/components/modals/propose/Text.jsx b/apps/builddao/widget/components/modals/propose/Text.jsx index 051f34c1..e7ebac68 100644 --- a/apps/builddao/widget/components/modals/propose/Text.jsx +++ b/apps/builddao/widget/components/modals/propose/Text.jsx @@ -19,6 +19,7 @@ useEffect(() => { }, [props.item]); const memoizedKey = useMemo((editorKey) => editorKey, [editorKey]); const selectedDAO = props.selectedDAO; +const [notificationsData, setNotificationData] = useState(null); const sdk = DaoSDK(selectedDAO); const MarkdownEditor = ` @@ -165,10 +166,21 @@ return ( embedCss: props.customCSS || MarkdownEditor, onChange: (v) => { setText(v); - }, + } }} /> + { + setNotificationData(v); + }, + proposalType: "Add Member" + }} + /> + {console.log(notificationsData)}
diff --git a/apps/builddao/widget/components/modals/propose/Transfer.jsx b/apps/builddao/widget/components/modals/propose/Transfer.jsx index 85a9172b..3b042e9d 100644 --- a/apps/builddao/widget/components/modals/propose/Transfer.jsx +++ b/apps/builddao/widget/components/modals/propose/Transfer.jsx @@ -17,6 +17,8 @@ const bootstrapTheme = props.bootstrapTheme; const [text, setText] = useState(""); const [editorKey, setEditorKey] = useState(0); +const [notificationsData, setNotificationData] = useState(null); + useEffect(() => { if (!props.item) { return; @@ -37,8 +39,8 @@ const tokensData = [ icon: "", name: "NEAR", symbol: "NEAR", - tokenId: NearTokenId, - }, + tokenId: NearTokenId + } ]; if (res.body) { res.body?.tokens?.fts.map((item) => { @@ -262,11 +264,21 @@ return ( embedCss: props.customCSS || MarkdownEditor, onChange: (v) => { setText(v); - }, + } }} /> + { + setNotificationData(v); + }, + proposalType: "Add Member" + }} + />