From 33174a6c90efca3848d2741dd2e02fff4bec6ed7 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Thu, 23 Mar 2023 14:30:52 +0330
Subject: [PATCH 001/167] fix time
---
src/helpers/time.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/helpers/time.ts b/src/helpers/time.ts
index ab7c9b64cc..3f456f82bf 100644
--- a/src/helpers/time.ts
+++ b/src/helpers/time.ts
@@ -1,5 +1,4 @@
import { captureException } from '@sentry/nextjs';
-import config from '@/configuration';
let initialized = false;
let timeDifference = 0;
@@ -24,7 +23,7 @@ const fetchServerTime = async () => {
try {
fetching = true;
- const response = await fetch(`${config.BASE_ROUTE}/api/time`, {
+ const response = await fetch(`/api/time`, {
mode: 'cors',
cache: 'no-cache',
credentials: 'same-origin',
From f6d6fcb454922d3b168834d8d4903dfaca943170 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Thu, 23 Mar 2023 14:31:13 +0330
Subject: [PATCH 002/167] add buildUsersPfpInfoQuery
---
src/lib/subgraph/pfpQueryBuilder.ts | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
create mode 100644 src/lib/subgraph/pfpQueryBuilder.ts
diff --git a/src/lib/subgraph/pfpQueryBuilder.ts b/src/lib/subgraph/pfpQueryBuilder.ts
new file mode 100644
index 0000000000..605c01013e
--- /dev/null
+++ b/src/lib/subgraph/pfpQueryBuilder.ts
@@ -0,0 +1,22 @@
+export function buildUsersPfpInfoQuery(users: string[]) {
+ const query = `query {
+ ${users.map(user => {
+ const _user = user.toLowerCase();
+ return `
+ user_${_user}: giversPFPTokens(
+ first: 5
+ where: {user: "${_user}" }
+ ) {
+ id
+ user {
+ id
+ }
+ tokenId
+ imageIpfs
+ }
+ }
+ `;
+ })}
+ `;
+ return query;
+}
From ec2ec71ef2ae1e31a743d3044c18fd2e4ac784f8 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Thu, 23 Mar 2023 14:31:26 +0330
Subject: [PATCH 003/167] use buildUsersPfpInfoQuery
---
.../views/userProfile/UserProfile.view.tsx | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/components/views/userProfile/UserProfile.view.tsx b/src/components/views/userProfile/UserProfile.view.tsx
index cdcff57c3b..3f6969d632 100644
--- a/src/components/views/userProfile/UserProfile.view.tsx
+++ b/src/components/views/userProfile/UserProfile.view.tsx
@@ -27,6 +27,9 @@ import ExternalLink from '@/components/ExternalLink';
import IncompleteProfileToast from '@/components/views/userProfile/IncompleteProfileToast';
import { useAppDispatch, useAppSelector } from '@/features/hooks';
import { setShowSignWithWallet } from '@/features/modal/modal.slice';
+import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
+import { gqlRequest } from '@/helpers/requests';
+import config from '@/configuration';
export enum EOrderBy {
TokenAmount = 'TokenAmount',
@@ -50,7 +53,7 @@ const UserProfileView: FC = ({ myAccount, user }) => {
const { isSignedIn } = useAppSelector(state => state.user);
const { formatMessage } = useIntl();
- const { chainId } = useWeb3React();
+ const { chainId, account } = useWeb3React();
const [showModal, setShowModal] = useState(false); // follow this state to refresh user content on screen
const [showIncompleteWarning, setShowIncompleteWarning] = useState(true);
@@ -63,6 +66,15 @@ const UserProfileView: FC = ({ myAccount, user }) => {
}
}, [user, isSignedIn]);
+ useEffect(() => {
+ if (account) {
+ const query = buildUsersPfpInfoQuery([account]);
+ gqlRequest(config.MAINNET_CONFIG.subgraphAddress, false, query)
+ .then(data => console.log('data', data))
+ .catch(err => console.log('err', err));
+ }
+ }, [account]);
+
if (myAccount && !isSignedIn)
return (
From 401754862cc1bb395d3f3aace1c03781ac0b9229 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Thu, 23 Mar 2023 14:40:48 +0330
Subject: [PATCH 004/167] remove limit
---
src/lib/subgraph/pfpQueryBuilder.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/lib/subgraph/pfpQueryBuilder.ts b/src/lib/subgraph/pfpQueryBuilder.ts
index 605c01013e..c13b2bf192 100644
--- a/src/lib/subgraph/pfpQueryBuilder.ts
+++ b/src/lib/subgraph/pfpQueryBuilder.ts
@@ -4,7 +4,6 @@ export function buildUsersPfpInfoQuery(users: string[]) {
const _user = user.toLowerCase();
return `
user_${_user}: giversPFPTokens(
- first: 5
where: {user: "${_user}" }
) {
id
From d2f10756edcc07ac24848e917d738cabb1a744f1 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Thu, 23 Mar 2023 15:12:26 +0330
Subject: [PATCH 005/167] add IGiversPFPToken and IUserPFPTokens
---
src/apollo/types/types.ts | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/apollo/types/types.ts b/src/apollo/types/types.ts
index 6fda2750db..6c8ce29937 100644
--- a/src/apollo/types/types.ts
+++ b/src/apollo/types/types.ts
@@ -353,3 +353,15 @@ export interface IRecentDonation {
user: { walletAddress: string };
valueUsd: number | null;
}
+
+export interface IGiversPFPToken {
+ user: {
+ id: string;
+ };
+ tokenId: string;
+ imageIpfs: string;
+}
+
+export interface IUserPFPTokens {
+ [key: string]: IGiversPFPToken;
+}
From 61611ab5c54bb4516b113aca035d052565aa60f9 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Thu, 23 Mar 2023 15:12:53 +0330
Subject: [PATCH 006/167] use try catch
---
.../views/userProfile/UserProfile.view.tsx | 33 +++++++++++++------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/src/components/views/userProfile/UserProfile.view.tsx b/src/components/views/userProfile/UserProfile.view.tsx
index 3f6969d632..ebac9af9c3 100644
--- a/src/components/views/userProfile/UserProfile.view.tsx
+++ b/src/components/views/userProfile/UserProfile.view.tsx
@@ -53,7 +53,7 @@ const UserProfileView: FC = ({ myAccount, user }) => {
const { isSignedIn } = useAppSelector(state => state.user);
const { formatMessage } = useIntl();
- const { chainId, account } = useWeb3React();
+ const { chainId } = useWeb3React();
const [showModal, setShowModal] = useState(false); // follow this state to refresh user content on screen
const [showIncompleteWarning, setShowIncompleteWarning] = useState(true);
@@ -61,19 +61,32 @@ const UserProfileView: FC = ({ myAccount, user }) => {
!isUserRegistered(user) && showIncompleteWarning && myAccount;
useEffect(() => {
+ const fetchPFPInfo = async (walletAddress: string) => {
+ try {
+ const query = buildUsersPfpInfoQuery([walletAddress]);
+ const { data } = await gqlRequest(
+ config.MAINNET_CONFIG.subgraphAddress,
+ false,
+ query,
+ );
+ if (data[`user_${walletAddress}`]) {
+ console.log(
+ 'data[`user_${walletAddress}`]',
+ data[`user_${walletAddress}`],
+ user,
+ );
+ }
+ } catch (error) {
+ console.error('error', error);
+ }
+ };
if (myAccount && !isSignedIn) {
dispatch(setShowSignWithWallet(true));
}
- }, [user, isSignedIn]);
-
- useEffect(() => {
- if (account) {
- const query = buildUsersPfpInfoQuery([account]);
- gqlRequest(config.MAINNET_CONFIG.subgraphAddress, false, query)
- .then(data => console.log('data', data))
- .catch(err => console.log('err', err));
+ if (user?.walletAddress) {
+ fetchPFPInfo(user.walletAddress);
}
- }, [account]);
+ }, [user, isSignedIn, myAccount, dispatch]);
if (myAccount && !isSignedIn)
return (
From b7997ba1aa1c9da8256ca2d12b4eb311afbaf8f0 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 16:33:40 +0330
Subject: [PATCH 007/167] created upload profile pic modal
---
.../modals/UploadProfilePicModal.tsx | 78 +++++++++++++++++++
1 file changed, 78 insertions(+)
create mode 100644 src/components/modals/UploadProfilePicModal.tsx
diff --git a/src/components/modals/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal.tsx
new file mode 100644
index 0000000000..9ee5c1335e
--- /dev/null
+++ b/src/components/modals/UploadProfilePicModal.tsx
@@ -0,0 +1,78 @@
+import { Button, mediaQueries } from '@giveth/ui-design-system';
+import React from 'react';
+import styled from 'styled-components';
+import { useIntl } from 'react-intl';
+import useUpload from '@/hooks/useUpload';
+import ImageUploader from '../ImageUploader';
+import { Flex } from '../styled-components/Flex';
+import { Modal } from './Modal';
+import { IUser } from '@/apollo/types/types';
+import { IModal } from '@/types/common';
+import { useModalAnimation } from '@/hooks/useModalAnimation';
+
+interface IUploadProfilePicModal extends IModal {
+ user: IUser;
+}
+
+const UploadProfilePicModal = ({
+ setShowModal,
+ user,
+}: IUploadProfilePicModal) => {
+ const useUploadProps = useUpload();
+ const { formatMessage } = useIntl();
+ const { isAnimating, closeModal } = useModalAnimation(setShowModal);
+
+ const { url, onDelete } = useUploadProps;
+
+ console.log('user', user);
+
+ return (
+
+
+
+
+
+ {
+ onDelete();
+ }}
+ />
+
+
+
+ );
+};
+
+export default UploadProfilePicModal;
+
+const Wrapper = styled.div`
+ padding: 24px;
+ ${mediaQueries.tablet} {
+ width: 448px;
+ }
+`;
+
+const TextButton = styled(Button)<{ color?: string }>`
+ color: ${props => props.color};
+ text-transform: uppercase;
+
+ &:hover {
+ background-color: transparent;
+ color: ${props => props.color};
+ }
+`;
From b5d7615ac48af1ac7f77060d65aeeb40d58afda4 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 16:34:09 +0330
Subject: [PATCH 008/167] added profilepicmodal to UserProfileView
---
src/components/views/userProfile/UserProfile.view.tsx | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/components/views/userProfile/UserProfile.view.tsx b/src/components/views/userProfile/UserProfile.view.tsx
index ebac9af9c3..9322de1300 100644
--- a/src/components/views/userProfile/UserProfile.view.tsx
+++ b/src/components/views/userProfile/UserProfile.view.tsx
@@ -30,6 +30,7 @@ import { setShowSignWithWallet } from '@/features/modal/modal.slice';
import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
import { gqlRequest } from '@/helpers/requests';
import config from '@/configuration';
+import UploadProfilePicModa from '@/components/modals/UploadProfilePicModal';
export enum EOrderBy {
TokenAmount = 'TokenAmount',
@@ -56,6 +57,7 @@ const UserProfileView: FC = ({ myAccount, user }) => {
const { chainId } = useWeb3React();
const [showModal, setShowModal] = useState(false); // follow this state to refresh user content on screen
+ const [showUploadProfileModal, setShowUploadProfileModal] = useState(false);
const [showIncompleteWarning, setShowIncompleteWarning] = useState(true);
const showCompleteProfile =
!isUserRegistered(user) && showIncompleteWarning && myAccount;
@@ -153,6 +155,12 @@ const UserProfileView: FC = ({ myAccount, user }) => {
{showModal && (
)}
+ {showUploadProfileModal && (
+
+ )}
>
);
};
From 3064087ad38b622ac53115cac8e5780bd10c403e Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 16:45:02 +0330
Subject: [PATCH 009/167] Seperated ProfilePic modal from EditUserModal
---
src/components/modals/EditUserModal.tsx | 175 ++++++++++--------------
1 file changed, 73 insertions(+), 102 deletions(-)
diff --git a/src/components/modals/EditUserModal.tsx b/src/components/modals/EditUserModal.tsx
index 6950f731f5..9102ca9cff 100644
--- a/src/components/modals/EditUserModal.tsx
+++ b/src/components/modals/EditUserModal.tsx
@@ -11,8 +11,7 @@ import { Modal } from './Modal';
import { client } from '@/apollo/apolloClient';
import { UPDATE_USER } from '@/apollo/gql/gqlUser';
import { IUser } from '@/apollo/types/types';
-import { FlexCenter, Flex } from '@/components/styled-components/Flex';
-import ImageUploader from '../ImageUploader';
+import { FlexCenter } from '@/components/styled-components/Flex';
import { gToast, ToastType } from '../toasts';
import { mediaQueries } from '@/lib/constants/constants';
import { IModal } from '@/types/common';
@@ -23,13 +22,9 @@ import { requiredOptions, validators } from '@/lib/constants/regex';
import { useModalAnimation } from '@/hooks/useModalAnimation';
import useUpload from '@/hooks/useUpload';
-enum EditStatusType {
- INFO,
- PHOTO,
-}
-
interface IEditUserModal extends IModal {
user: IUser;
+ setShowProfilePicModal: (showModal: boolean) => void;
}
type Inputs = {
@@ -40,13 +35,13 @@ type Inputs = {
url: string;
};
-const EditUserModal = ({ setShowModal, user }: IEditUserModal) => {
+const EditUserModal = ({
+ setShowModal,
+ user,
+ setShowProfilePicModal,
+}: IEditUserModal) => {
const { formatMessage } = useIntl();
const [isLoading, setIsLoading] = useState(false);
- const [editStatus, setEditStatus] = useState(
- EditStatusType.INFO,
- );
-
const useUploadProps = useUpload();
const { url, onDelete } = useUploadProps;
@@ -69,7 +64,6 @@ const EditUserModal = ({ setShowModal, user }: IEditUserModal) => {
});
if (response.updateUser) {
account && dispatch(fetchUserByAddress(account));
- setEditStatus(EditStatusType.INFO);
gToast('Profile Photo updated.', {
type: ToastType.SUCCESS,
title: 'Success',
@@ -135,101 +129,78 @@ const EditUserModal = ({ setShowModal, user }: IEditUserModal) => {
headerTitlePosition='left'
>
- {editStatus === EditStatusType.PHOTO ? (
-
-
-
- {
- onDelete();
- setEditStatus(EditStatusType.INFO);
- }}
+ <>
+
+
-
- ) : (
- <>
-
-
+ {
+ setShowProfilePicModal(true);
+ closeModal();
+ }}
+ />
+
-
-
- setEditStatus(EditStatusType.PHOTO)
- }
- />
-
-
-
+ >
);
From e704e7167a6a777ce1c4d62e89f8eb1a2c115e77 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 17:19:25 +0330
Subject: [PATCH 010/167] Update the design
---
.../modals/UploadProfilePicModal.tsx | 38 +++++++++----------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal.tsx
index 9ee5c1335e..8db526b7fd 100644
--- a/src/components/modals/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal.tsx
@@ -30,28 +30,28 @@ const UploadProfilePicModal = ({
-
- {
- onDelete();
- }}
- />
+
+
+ {
+ onDelete();
+ }}
+ />
+
@@ -62,8 +62,8 @@ export default UploadProfilePicModal;
const Wrapper = styled.div`
padding: 24px;
- ${mediaQueries.tablet} {
- width: 448px;
+ ${mediaQueries.laptopL} {
+ width: 1100px;
}
`;
From 406bf4659596b8ad5844dddf78b5d6e9d18f46a9 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 17:50:08 +0330
Subject: [PATCH 011/167] added tabs
---
.../modals/UploadProfilePicModal.tsx | 85 ++++++++++++++-----
1 file changed, 66 insertions(+), 19 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal.tsx
index 8db526b7fd..748613d9bf 100644
--- a/src/components/modals/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal.tsx
@@ -9,11 +9,17 @@ import { Modal } from './Modal';
import { IUser } from '@/apollo/types/types';
import { IModal } from '@/types/common';
import { useModalAnimation } from '@/hooks/useModalAnimation';
+import { TabItem } from '../styled-components/Tabs';
interface IUploadProfilePicModal extends IModal {
user: IUser;
}
+const tabs = [
+ { id: 1, title: 'Upload Image' },
+ { id: 2, title: 'My NFTs' },
+];
+
const UploadProfilePicModal = ({
setShowModal,
user,
@@ -21,7 +27,7 @@ const UploadProfilePicModal = ({
const useUploadProps = useUpload();
const { formatMessage } = useIntl();
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
-
+ const [activeTab, setActiveTab] = React.useState(1);
const { url, onDelete } = useUploadProps;
console.log('user', user);
@@ -34,25 +40,66 @@ const UploadProfilePicModal = ({
headerTitlePosition='left'
>
-
-
-
-
- {
- onDelete();
- }}
- />
-
+
+ {tabs.map(i => (
+ setActiveTab(i.id)}
+ className={activeTab === i.id ? 'active' : ''}
+ key={i.id}
+ active={activeTab === i.id}
+ >
+ {i.title}
+
+ ))}
+ {activeTab === 1 && (
+
+
+
+
+ {
+ onDelete();
+ }}
+ />
+
+
+ )}
+ {activeTab === 2 && (
+
+
+
+
+ {
+ onDelete();
+ }}
+ />
+
+
+ )}
);
From 961326e04d82bbc6216c58675e1743b2aa4d3425 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 17:50:25 +0330
Subject: [PATCH 012/167] handled modals
---
src/components/views/userProfile/UserProfile.view.tsx | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/components/views/userProfile/UserProfile.view.tsx b/src/components/views/userProfile/UserProfile.view.tsx
index 9322de1300..233c39109e 100644
--- a/src/components/views/userProfile/UserProfile.view.tsx
+++ b/src/components/views/userProfile/UserProfile.view.tsx
@@ -30,7 +30,7 @@ import { setShowSignWithWallet } from '@/features/modal/modal.slice';
import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
import { gqlRequest } from '@/helpers/requests';
import config from '@/configuration';
-import UploadProfilePicModa from '@/components/modals/UploadProfilePicModal';
+import UploadProfilePicModal from '@/components/modals/UploadProfilePicModal';
export enum EOrderBy {
TokenAmount = 'TokenAmount',
@@ -153,10 +153,14 @@ const UserProfileView: FC = ({ myAccount, user }) => {
{showModal && (
-
+
)}
{showUploadProfileModal && (
-
From fad5ab55773e503e250146f693984d68c0d1aec7 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 18:37:11 +0330
Subject: [PATCH 013/167] added pfpData to props
---
src/components/modals/UploadProfilePicModal.tsx | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal.tsx
index 748613d9bf..db3637d47f 100644
--- a/src/components/modals/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal.tsx
@@ -10,9 +10,11 @@ import { IUser } from '@/apollo/types/types';
import { IModal } from '@/types/common';
import { useModalAnimation } from '@/hooks/useModalAnimation';
import { TabItem } from '../styled-components/Tabs';
+import { IUserNFT } from '../views/userProfile/UserProfile.view';
interface IUploadProfilePicModal extends IModal {
user: IUser;
+ pfpData?: IUserNFT[];
}
const tabs = [
@@ -78,7 +80,8 @@ const UploadProfilePicModal = ({
)}
{activeTab === 2 && (
-
+ NFT
+ {/* */}
Date: Thu, 23 Mar 2023 18:37:41 +0330
Subject: [PATCH 014/167] set and pass pfp data
---
src/components/views/userProfile/UserProfile.view.tsx | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/components/views/userProfile/UserProfile.view.tsx b/src/components/views/userProfile/UserProfile.view.tsx
index 233c39109e..7cc469fb2c 100644
--- a/src/components/views/userProfile/UserProfile.view.tsx
+++ b/src/components/views/userProfile/UserProfile.view.tsx
@@ -49,6 +49,12 @@ export interface IUserProfileView {
myAccount?: boolean;
}
+export interface IUserNFT {
+ id: string;
+ imageIpfs: string;
+ tokenId: number;
+}
+
const UserProfileView: FC = ({ myAccount, user }) => {
const dispatch = useAppDispatch();
const { isSignedIn } = useAppSelector(state => state.user);
@@ -58,6 +64,8 @@ const UserProfileView: FC = ({ myAccount, user }) => {
const [showModal, setShowModal] = useState(false); // follow this state to refresh user content on screen
const [showUploadProfileModal, setShowUploadProfileModal] = useState(false);
+ const [pfpData, setPfpData] = useState();
+
const [showIncompleteWarning, setShowIncompleteWarning] = useState(true);
const showCompleteProfile =
!isUserRegistered(user) && showIncompleteWarning && myAccount;
@@ -78,6 +86,8 @@ const UserProfileView: FC = ({ myAccount, user }) => {
user,
);
}
+ console.log('data', data);
+ setPfpData(data[`user_${walletAddress}`]);
} catch (error) {
console.error('error', error);
}
@@ -163,6 +173,7 @@ const UserProfileView: FC = ({ myAccount, user }) => {
)}
>
From efb01ab7ec1b0f88c2d3693838f90ac90bd07327 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 19:08:14 +0330
Subject: [PATCH 015/167] added pfp item
---
.../modals/UploadProfilePicModal/PfpItem.tsx | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 src/components/modals/UploadProfilePicModal/PfpItem.tsx
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
new file mode 100644
index 0000000000..0fc025496a
--- /dev/null
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -0,0 +1,21 @@
+import Image from 'next/image';
+import React from 'react';
+import styled from 'styled-components';
+
+interface IPfpItemProps {
+ image: string;
+}
+
+const PfpItem = ({ image }: IPfpItemProps) => {
+ return (
+
+
+
+ );
+};
+
+export default PfpItem;
+
+const Container = styled.div`
+ background-color: white;
+`;
From 131b553852e39b740dffb89eb886ff0c33ed6b20 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 19:08:48 +0330
Subject: [PATCH 016/167] moved Modal to folder
---
.../UploadProfilePicModal.tsx | 142 ++++++++++++++++++
1 file changed, 142 insertions(+)
create mode 100644 src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
new file mode 100644
index 0000000000..9ea507b9f1
--- /dev/null
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -0,0 +1,142 @@
+import { Button, H5, mediaQueries } from '@giveth/ui-design-system';
+import React from 'react';
+import styled from 'styled-components';
+import { useIntl } from 'react-intl';
+import useUpload from '@/hooks/useUpload';
+import ImageUploader from '../../ImageUploader';
+import { Flex } from '../../styled-components/Flex';
+import { Modal } from '../Modal';
+import { IUser } from '@/apollo/types/types';
+import { IModal } from '@/types/common';
+import { useModalAnimation } from '@/hooks/useModalAnimation';
+import { TabItem } from '../../styled-components/Tabs';
+import { IUserNFT } from '../../views/userProfile/UserProfile.view';
+import PfpItem from './PfpItem';
+
+interface IUploadProfilePicModal extends IModal {
+ user: IUser;
+ pfpData?: IUserNFT[];
+}
+
+const tabs = [
+ { id: 1, title: 'Upload Image' },
+ { id: 2, title: 'My NFTs' },
+];
+
+const UploadProfilePicModal = ({
+ setShowModal,
+ user,
+ pfpData,
+}: IUploadProfilePicModal) => {
+ const useUploadProps = useUpload();
+ const { formatMessage } = useIntl();
+ const { isAnimating, closeModal } = useModalAnimation(setShowModal);
+ const [activeTab, setActiveTab] = React.useState(1);
+ const { url, onDelete } = useUploadProps;
+
+ console.log('user', user);
+
+ return (
+
+
+
+ {tabs.map(i => (
+ setActiveTab(i.id)}
+ className={activeTab === i.id ? 'active' : ''}
+ key={i.id}
+ active={activeTab === i.id}
+ >
+ {i.title}
+
+ ))}
+
+ {activeTab === 1 && (
+
+
+
+
+ {
+ onDelete();
+ }}
+ />
+
+
+ )}
+ {activeTab === 2 && (
+
+ Your Unique Giveth’s PFP Artwork
+
+ {pfpData?.map(pfp => (
+
+ ))}
+
+
+
+ {
+ onDelete();
+ }}
+ />
+
+
+ )}
+
+
+ );
+};
+
+export default UploadProfilePicModal;
+
+const Wrapper = styled.div`
+ padding: 24px;
+ ${mediaQueries.laptopL} {
+ width: 1100px;
+ }
+`;
+
+const TextButton = styled(Button)<{ color?: string }>`
+ color: ${props => props.color};
+ text-transform: uppercase;
+
+ &:hover {
+ background-color: transparent;
+ color: ${props => props.color};
+ }
+`;
+
+const CustomH5 = styled(H5)`
+ text-align: left;
+ margin-top: 40px;
+`;
From 2a5e9a785e245da73fa43b031bd641a8493547f9 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Thu, 23 Mar 2023 19:09:04 +0330
Subject: [PATCH 017/167] moved modal to folder
---
.../modals/UploadProfilePicModal.tsx | 128 ------------------
.../views/userProfile/UserProfile.view.tsx | 2 +-
2 files changed, 1 insertion(+), 129 deletions(-)
delete mode 100644 src/components/modals/UploadProfilePicModal.tsx
diff --git a/src/components/modals/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal.tsx
deleted file mode 100644
index db3637d47f..0000000000
--- a/src/components/modals/UploadProfilePicModal.tsx
+++ /dev/null
@@ -1,128 +0,0 @@
-import { Button, mediaQueries } from '@giveth/ui-design-system';
-import React from 'react';
-import styled from 'styled-components';
-import { useIntl } from 'react-intl';
-import useUpload from '@/hooks/useUpload';
-import ImageUploader from '../ImageUploader';
-import { Flex } from '../styled-components/Flex';
-import { Modal } from './Modal';
-import { IUser } from '@/apollo/types/types';
-import { IModal } from '@/types/common';
-import { useModalAnimation } from '@/hooks/useModalAnimation';
-import { TabItem } from '../styled-components/Tabs';
-import { IUserNFT } from '../views/userProfile/UserProfile.view';
-
-interface IUploadProfilePicModal extends IModal {
- user: IUser;
- pfpData?: IUserNFT[];
-}
-
-const tabs = [
- { id: 1, title: 'Upload Image' },
- { id: 2, title: 'My NFTs' },
-];
-
-const UploadProfilePicModal = ({
- setShowModal,
- user,
-}: IUploadProfilePicModal) => {
- const useUploadProps = useUpload();
- const { formatMessage } = useIntl();
- const { isAnimating, closeModal } = useModalAnimation(setShowModal);
- const [activeTab, setActiveTab] = React.useState(1);
- const { url, onDelete } = useUploadProps;
-
- console.log('user', user);
-
- return (
-
-
-
- {tabs.map(i => (
- setActiveTab(i.id)}
- className={activeTab === i.id ? 'active' : ''}
- key={i.id}
- active={activeTab === i.id}
- >
- {i.title}
-
- ))}
-
- {activeTab === 1 && (
-
-
-
-
- {
- onDelete();
- }}
- />
-
-
- )}
- {activeTab === 2 && (
-
- NFT
- {/* */}
-
-
- {
- onDelete();
- }}
- />
-
-
- )}
-
-
- );
-};
-
-export default UploadProfilePicModal;
-
-const Wrapper = styled.div`
- padding: 24px;
- ${mediaQueries.laptopL} {
- width: 1100px;
- }
-`;
-
-const TextButton = styled(Button)<{ color?: string }>`
- color: ${props => props.color};
- text-transform: uppercase;
-
- &:hover {
- background-color: transparent;
- color: ${props => props.color};
- }
-`;
diff --git a/src/components/views/userProfile/UserProfile.view.tsx b/src/components/views/userProfile/UserProfile.view.tsx
index 7cc469fb2c..2ba3ed5687 100644
--- a/src/components/views/userProfile/UserProfile.view.tsx
+++ b/src/components/views/userProfile/UserProfile.view.tsx
@@ -30,7 +30,7 @@ import { setShowSignWithWallet } from '@/features/modal/modal.slice';
import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
import { gqlRequest } from '@/helpers/requests';
import config from '@/configuration';
-import UploadProfilePicModal from '@/components/modals/UploadProfilePicModal';
+import UploadProfilePicModal from '@/components/modals/UploadProfilePicModal/UploadProfilePicModal';
export enum EOrderBy {
TokenAmount = 'TokenAmount',
From 17d7efca073fee255cd51bb4e41ea9c450d06d31 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 12:53:43 +0330
Subject: [PATCH 018/167] created convertIPFSToHTTPS
---
src/helpers/blockchain.ts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/helpers/blockchain.ts b/src/helpers/blockchain.ts
index f060b8667a..8bff81ee2e 100644
--- a/src/helpers/blockchain.ts
+++ b/src/helpers/blockchain.ts
@@ -95,3 +95,7 @@ export const networksParams: {
export const gwei2wei = (gweiAmount: string): string =>
ethers.utils.parseUnits(gweiAmount, 'gwei').toString();
+
+export const convertIPFSToHTTPS = (url: string) => {
+ return url.replace('ipfs://', 'https://ipfs.io/ipfs/');
+};
From 7273619603a8b46b218cac27981c075cc0879c65 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 12:58:56 +0330
Subject: [PATCH 019/167] added ipfs.io to domains
---
next.config.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/next.config.js b/next.config.js
index 50a800de69..b4871564c5 100644
--- a/next.config.js
+++ b/next.config.js
@@ -26,6 +26,7 @@ const moduleExports = withBundleAnalyzer({
'tgb-preproduction-formio.s3.amazonaws.com',
'dashboard.tgb-preprod.com',
'cdn-images-1.medium.com',
+ 'ipfs.io',
],
},
compiler: {
From f44112591d32ae5e4033f834641c5db85b571334 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 12:59:04 +0330
Subject: [PATCH 020/167] use converted image
---
src/components/modals/UploadProfilePicModal/PfpItem.tsx | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
index 0fc025496a..98828a0e7c 100644
--- a/src/components/modals/UploadProfilePicModal/PfpItem.tsx
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -1,15 +1,17 @@
import Image from 'next/image';
import React from 'react';
import styled from 'styled-components';
+import { convertIPFSToHTTPS } from '@/helpers/blockchain';
interface IPfpItemProps {
image: string;
}
const PfpItem = ({ image }: IPfpItemProps) => {
+ const convertedImage = convertIPFSToHTTPS(image);
return (
-
+
);
};
From d9bb27c0c6fb00b46a2df362a92f497df4926b94 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 13:28:51 +0330
Subject: [PATCH 021/167] added styles to PFPItem
---
.../modals/UploadProfilePicModal/PfpItem.tsx | 20 +++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
index 98828a0e7c..88c54cf5d7 100644
--- a/src/components/modals/UploadProfilePicModal/PfpItem.tsx
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -1,7 +1,9 @@
import Image from 'next/image';
import React from 'react';
import styled from 'styled-components';
+import { neutralColors } from '@giveth/ui-design-system';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
+import { Shadow } from '@/components/styled-components/Shadow';
interface IPfpItemProps {
image: string;
@@ -11,7 +13,12 @@ const PfpItem = ({ image }: IPfpItemProps) => {
const convertedImage = convertIPFSToHTTPS(image);
return (
-
+
);
};
@@ -19,5 +26,14 @@ const PfpItem = ({ image }: IPfpItemProps) => {
export default PfpItem;
const Container = styled.div`
- background-color: white;
+ background-color: ${neutralColors.gray[100]};
+ width: 250px;
+ height: 300px;
+ box-shadow: ${Shadow.Neutral[500]};
+`;
+
+const ImageContainer = styled(Image)`
+ box-shadow: 0px 1px 21px 1px rgba(225, 69, 141, 0.63);
+ border-radius: 8px;
+ margin-top: 24px;
`;
From cfb68c8e659585a2fab93c31a2627f5e4a2c79ab Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 14:19:56 +0330
Subject: [PATCH 022/167] added isSelected prop
---
src/components/modals/UploadProfilePicModal/PfpItem.tsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
index 88c54cf5d7..703dcadf12 100644
--- a/src/components/modals/UploadProfilePicModal/PfpItem.tsx
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -7,9 +7,10 @@ import { Shadow } from '@/components/styled-components/Shadow';
interface IPfpItemProps {
image: string;
+ isSelected: boolean;
}
-const PfpItem = ({ image }: IPfpItemProps) => {
+const PfpItem = ({ image, isSelected }: IPfpItemProps) => {
const convertedImage = convertIPFSToHTTPS(image);
return (
From 67204ccadf619795564adabf6067e3b179a1c3b3 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 15:05:26 +0330
Subject: [PATCH 023/167] Added flex container
---
.../modals/UploadProfilePicModal/PfpItem.tsx | 27 ++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
index 703dcadf12..05f4ddc5cd 100644
--- a/src/components/modals/UploadProfilePicModal/PfpItem.tsx
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -1,7 +1,11 @@
import Image from 'next/image';
import React from 'react';
import styled from 'styled-components';
-import { neutralColors } from '@giveth/ui-design-system';
+import {
+ brandColors,
+ IconCheck16,
+ neutralColors,
+} from '@giveth/ui-design-system';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import { Shadow } from '@/components/styled-components/Shadow';
@@ -20,6 +24,9 @@ const PfpItem = ({ image, isSelected }: IPfpItemProps) => {
width={210}
height={210}
/>
+
+
+
);
};
@@ -31,6 +38,9 @@ const Container = styled.div`
width: 250px;
height: 300px;
box-shadow: ${Shadow.Neutral[500]};
+ border-radius: 8px;
+ border: 3px solid ${brandColors.pinky[400]};
+ position: relative;
`;
const ImageContainer = styled(Image)`
@@ -38,3 +48,18 @@ const ImageContainer = styled(Image)`
border-radius: 8px;
margin-top: 24px;
`;
+
+const SmallCircleWithCheckIconInIt = styled.div`
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ background-color: ${brandColors.pinky[400]};
+ position: absolute;
+ top: 0;
+ right: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ transform: translate(50%, -50%);
+ border: 3px solid ${brandColors.pinky[200]};
+`;
From e586867c093a7a86f545e445aa18a6ac64f7b848 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 15:05:48 +0330
Subject: [PATCH 024/167] added flex container
---
.../modals/UploadProfilePicModal/UploadProfilePicModal.tsx | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 9ea507b9f1..caa647872e 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -83,14 +83,15 @@ const UploadProfilePicModal = ({
{activeTab === 2 && (
Your Unique Giveth’s PFP Artwork
-
+
{pfpData?.map(pfp => (
))}
-
+
Date: Sun, 26 Mar 2023 15:09:46 +0330
Subject: [PATCH 025/167] added id
---
src/components/modals/UploadProfilePicModal/PfpItem.tsx | 8 +++++++-
.../UploadProfilePicModal/UploadProfilePicModal.tsx | 1 +
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
index 05f4ddc5cd..0f0c1bfbcc 100644
--- a/src/components/modals/UploadProfilePicModal/PfpItem.tsx
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable react/jsx-no-undef */
import Image from 'next/image';
import React from 'react';
import styled from 'styled-components';
@@ -5,6 +6,7 @@ import {
brandColors,
IconCheck16,
neutralColors,
+ P,
} from '@giveth/ui-design-system';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import { Shadow } from '@/components/styled-components/Shadow';
@@ -12,9 +14,10 @@ import { Shadow } from '@/components/styled-components/Shadow';
interface IPfpItemProps {
image: string;
isSelected: boolean;
+ id: number;
}
-const PfpItem = ({ image, isSelected }: IPfpItemProps) => {
+const PfpItem = ({ image, isSelected, id }: IPfpItemProps) => {
const convertedImage = convertIPFSToHTTPS(image);
return (
@@ -27,6 +30,8 @@ const PfpItem = ({ image, isSelected }: IPfpItemProps) => {
+
+ The Givers Collection #{id}
);
};
@@ -47,6 +52,7 @@ const ImageContainer = styled(Image)`
box-shadow: 0px 1px 21px 1px rgba(225, 69, 141, 0.63);
border-radius: 8px;
margin-top: 24px;
+ margin-bottom: 16px;
`;
const SmallCircleWithCheckIconInIt = styled.div`
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index caa647872e..1e21319e7b 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -89,6 +89,7 @@ const UploadProfilePicModal = ({
image={pfp.imageIpfs}
key={pfp.tokenId}
isSelected={true}
+ id={pfp.tokenId}
/>
))}
From 24789a9a9c66ba70b2ea696b87a815f1d6ccf37d Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 16:01:55 +0330
Subject: [PATCH 026/167] added selected NFT state
---
.../modals/UploadProfilePicModal/UploadProfilePicModal.tsx | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 1e21319e7b..bf00c05b62 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -1,5 +1,5 @@
import { Button, H5, mediaQueries } from '@giveth/ui-design-system';
-import React from 'react';
+import { useState } from 'react';
import styled from 'styled-components';
import { useIntl } from 'react-intl';
import useUpload from '@/hooks/useUpload';
@@ -31,10 +31,13 @@ const UploadProfilePicModal = ({
const useUploadProps = useUpload();
const { formatMessage } = useIntl();
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
- const [activeTab, setActiveTab] = React.useState(1);
+ const [activeTab, setActiveTab] = useState(1);
+ const [selectedPFP, setSelectedPFP] = useState();
+
const { url, onDelete } = useUploadProps;
console.log('user', user);
+ console.log('data', pfpData);
return (
Date: Sun, 26 Mar 2023 16:09:39 +0330
Subject: [PATCH 027/167] handle isSelected
---
.../modals/UploadProfilePicModal/PfpItem.tsx | 18 +++++++++++-------
.../UploadProfilePicModal.tsx | 5 ++++-
2 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
index 0f0c1bfbcc..bfb0df2870 100644
--- a/src/components/modals/UploadProfilePicModal/PfpItem.tsx
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -15,21 +15,24 @@ interface IPfpItemProps {
image: string;
isSelected: boolean;
id: number;
+ onClick: () => void;
}
-const PfpItem = ({ image, isSelected, id }: IPfpItemProps) => {
+const PfpItem = ({ image, isSelected, id, onClick }: IPfpItemProps) => {
const convertedImage = convertIPFSToHTTPS(image);
return (
-
+
-
-
-
+ {isSelected && (
+
+
+
+ )}
The Givers Collection #{id}
@@ -38,13 +41,14 @@ const PfpItem = ({ image, isSelected, id }: IPfpItemProps) => {
export default PfpItem;
-const Container = styled.div`
+const Container = styled.div<{ isSelected: boolean }>`
background-color: ${neutralColors.gray[100]};
width: 250px;
height: 300px;
box-shadow: ${Shadow.Neutral[500]};
border-radius: 8px;
- border: 3px solid ${brandColors.pinky[400]};
+ border: ${props =>
+ props.isSelected ? `3px solid ${brandColors.pinky[400]}` : 'none'};
position: relative;
`;
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index bf00c05b62..ef79272cea 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -89,9 +89,12 @@ const UploadProfilePicModal = ({
{pfpData?.map(pfp => (
setSelectedPFP(pfp)}
image={pfp.imageIpfs}
key={pfp.tokenId}
- isSelected={true}
+ isSelected={
+ pfp.tokenId === selectedPFP?.tokenId
+ }
id={pfp.tokenId}
/>
))}
From 4573a4471e0014b827a1cc7b13b2d032110a992b Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 26 Mar 2023 16:42:06 +0330
Subject: [PATCH 028/167] handle saving avatar
---
.../UploadProfilePicModal.tsx | 53 ++++++++++++++++++-
1 file changed, 52 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index ef79272cea..e94f0d628b 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -2,6 +2,9 @@ import { Button, H5, mediaQueries } from '@giveth/ui-design-system';
import { useState } from 'react';
import styled from 'styled-components';
import { useIntl } from 'react-intl';
+import { useMutation } from '@apollo/client';
+import { captureException } from '@sentry/nextjs';
+import { useWeb3React } from '@web3-react/core';
import useUpload from '@/hooks/useUpload';
import ImageUploader from '../../ImageUploader';
import { Flex } from '../../styled-components/Flex';
@@ -12,6 +15,11 @@ import { useModalAnimation } from '@/hooks/useModalAnimation';
import { TabItem } from '../../styled-components/Tabs';
import { IUserNFT } from '../../views/userProfile/UserProfile.view';
import PfpItem from './PfpItem';
+import { UPDATE_USER } from '@/apollo/gql/gqlUser';
+import { gToast, ToastType } from '@/components/toasts';
+import { fetchUserByAddress } from '@/features/user/user.thunks';
+import { useAppDispatch } from '@/features/hooks';
+import { convertIPFSToHTTPS } from '@/helpers/blockchain';
interface IUploadProfilePicModal extends IModal {
user: IUser;
@@ -34,11 +42,52 @@ const UploadProfilePicModal = ({
const [activeTab, setActiveTab] = useState(1);
const [selectedPFP, setSelectedPFP] = useState();
+ const dispatch = useAppDispatch();
+ const { account } = useWeb3React();
+ const [updateUser] = useMutation(UPDATE_USER);
+
const { url, onDelete } = useUploadProps;
console.log('user', user);
console.log('data', pfpData);
+ const nftUrl = selectedPFP?.imageIpfs
+ ? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
+ : undefined;
+ console.log('nftUrl', nftUrl);
+ const onSaveAvatar = async () => {
+ try {
+ console.log('Saving');
+ const { data: response } = await updateUser({
+ variables: {
+ avatar: nftUrl ? nftUrl : url,
+ },
+ });
+ console.log('Res', response);
+ if (response.updateUser) {
+ account && dispatch(fetchUserByAddress(account));
+ gToast('Profile Photo updated.', {
+ type: ToastType.SUCCESS,
+ title: 'Success',
+ });
+ onDelete();
+ } else {
+ throw 'updateUser false';
+ }
+ } catch (error: any) {
+ gToast('Failed to update your information. Please try again.', {
+ type: ToastType.DANGER,
+ title: error.message,
+ });
+ console.log(error);
+ captureException(error, {
+ tags: {
+ section: 'onSaveAvatar',
+ },
+ });
+ }
+ };
+
return (
Date: Mon, 27 Mar 2023 11:33:08 +0330
Subject: [PATCH 029/167] added handleAvatar
---
.../UploadProfilePicModal/UploadProfilePicModal.tsx | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index e94f0d628b..b70d4c9cff 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -55,12 +55,21 @@ const UploadProfilePicModal = ({
? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
: undefined;
console.log('nftUrl', nftUrl);
+
+ const handleAvatar = () => {
+ if (activeTab === 1) {
+ return url;
+ } else {
+ return nftUrl;
+ }
+ };
+
const onSaveAvatar = async () => {
try {
console.log('Saving');
const { data: response } = await updateUser({
variables: {
- avatar: nftUrl ? nftUrl : url,
+ avatar: handleAvatar(),
},
});
console.log('Res', response);
From ea0a64a69445817076aa11297054b32c6de93b9e Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 27 Mar 2023 12:01:28 +0330
Subject: [PATCH 030/167] Fixed onClick Function
---
.../modals/UploadProfilePicModal/UploadProfilePicModal.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index b70d4c9cff..ab5da16390 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -174,7 +174,7 @@ const UploadProfilePicModal = ({
id: 'label.cancel',
})}
onClick={() => {
- onDelete();
+ setSelectedPFP(undefined);
}}
/>
From bf497a1fa302fc670aaba9aa44c740b446fdc691 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 27 Mar 2023 14:40:35 +0330
Subject: [PATCH 031/167] Added base NoNFT container and logic
---
.../UploadProfilePicModal.tsx | 108 +++++++++++-------
1 file changed, 69 insertions(+), 39 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index ab5da16390..870ede124c 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -1,4 +1,10 @@
-import { Button, H5, mediaQueries } from '@giveth/ui-design-system';
+import {
+ brandColors,
+ Button,
+ H5,
+ mediaQueries,
+ neutralColors,
+} from '@giveth/ui-design-system';
import { useState } from 'react';
import styled from 'styled-components';
import { useIntl } from 'react-intl';
@@ -7,7 +13,7 @@ import { captureException } from '@sentry/nextjs';
import { useWeb3React } from '@web3-react/core';
import useUpload from '@/hooks/useUpload';
import ImageUploader from '../../ImageUploader';
-import { Flex } from '../../styled-components/Flex';
+import { Flex, FlexCenter } from '../../styled-components/Flex';
import { Modal } from '../Modal';
import { IUser } from '@/apollo/types/types';
import { IModal } from '@/types/common';
@@ -49,7 +55,7 @@ const UploadProfilePicModal = ({
const { url, onDelete } = useUploadProps;
console.log('user', user);
- console.log('data', pfpData);
+ console.log('dataaaaa', pfpData);
const nftUrl = selectedPFP?.imageIpfs
? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
@@ -143,42 +149,51 @@ const UploadProfilePicModal = ({
)}
{activeTab === 2 && (
-
- Your Unique Giveth’s PFP Artwork
-
- {pfpData?.map(pfp => (
- setSelectedPFP(pfp)}
- image={pfp.imageIpfs}
- key={pfp.tokenId}
- isSelected={
- pfp.tokenId === selectedPFP?.tokenId
- }
- id={pfp.tokenId}
- />
- ))}
-
-
-
- {
- setSelectedPFP(undefined);
- }}
- />
-
-
+ <>
+ {pfpData && pfpData.length > 0 ? (
+
+
+ Your Unique Giveth’s PFP Artwork
+
+
+ {pfpData?.map(pfp => (
+ setSelectedPFP(pfp)}
+ image={pfp.imageIpfs}
+ key={pfp.tokenId}
+ isSelected={
+ pfp.tokenId ===
+ selectedPFP?.tokenId
+ }
+ id={pfp.tokenId}
+ />
+ ))}
+
+
+
+ {
+ setSelectedPFP(undefined);
+ }}
+ />
+
+
+ ) : (
+ Test
+ )}
+ >
)}
@@ -208,3 +223,18 @@ const CustomH5 = styled(H5)`
text-align: left;
margin-top: 40px;
`;
+
+const NoNFTContainer = styled(FlexCenter)`
+ flex-direction: column;
+ border: 1px dotted ${neutralColors.gray[400]};
+ margin: 24px 0 16px 0;
+ padding: 64px 20px;
+ color: ${brandColors.deep[500]};
+ img {
+ margin: 0 0 30px 0;
+ }
+ span {
+ cursor: pointer;
+ color: ${brandColors.pinky[500]};
+ }
+`;
From 0edf2c30501cc4d780679d4dcd7f193bc6e3ef11 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 16:58:49 +0330
Subject: [PATCH 032/167] fix buildUsersPfpInfoQuery
---
src/lib/subgraph/pfpQueryBuilder.ts | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/src/lib/subgraph/pfpQueryBuilder.ts b/src/lib/subgraph/pfpQueryBuilder.ts
index c13b2bf192..8eb00f215c 100644
--- a/src/lib/subgraph/pfpQueryBuilder.ts
+++ b/src/lib/subgraph/pfpQueryBuilder.ts
@@ -1,21 +1,19 @@
export function buildUsersPfpInfoQuery(users: string[]) {
const query = `query {
- ${users.map(user => {
- const _user = user.toLowerCase();
- return `
- user_${_user}: giversPFPTokens(
- where: {user: "${_user}" }
- ) {
+ ${users
+ .map(user => {
+ const _user = user.toLowerCase();
+ return `user_${_user}: giversPFPTokens(where: {user: "${_user}" }) {
id
user {
- id
+ id
}
tokenId
imageIpfs
}
- }
`;
- })}
+ })
+ .join('')}}
`;
return query;
}
From ed95213deb55711e18c46541a7dfd537101a41f6 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 16:59:10 +0330
Subject: [PATCH 033/167] add PFP_POLLING_INTERVAL
---
src/configuration.ts | 1 +
src/types/config.ts | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/configuration.ts b/src/configuration.ts
index 6b22871688..c8e5ce48af 100644
--- a/src/configuration.ts
+++ b/src/configuration.ts
@@ -11,6 +11,7 @@ const config: GlobalConfig = {
WEB3_POLLING_INTERVAL: 15000,
SUBGRAPH_POLLING_INTERVAL: 5000,
NOTIFICATION_POLLING_INTERVAL: 5000,
+ PFP_POLLING_INTERVAL: 2000,
TOKEN_PRECISION: 2,
...envConfig,
NETWORKS_CONFIG: {
diff --git a/src/types/config.ts b/src/types/config.ts
index 0d55b101c1..16eff92e8c 100644
--- a/src/types/config.ts
+++ b/src/types/config.ts
@@ -188,6 +188,7 @@ export interface GlobalConfig extends EnvConfig {
WEB3_POLLING_INTERVAL: number;
SUBGRAPH_POLLING_INTERVAL: number;
NOTIFICATION_POLLING_INTERVAL: number;
+ PFP_POLLING_INTERVAL: number;
TOKEN_PRECISION: number;
NETWORKS_CONFIG: {
[key: number]: MainnetNetworkConfig | XDaiNetworkConfig;
From c6393e35bc9f7863f3e42b2d39e6defc476f302e Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 16:59:37 +0330
Subject: [PATCH 034/167] separate IAdminUser
---
src/apollo/types/types.ts | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/apollo/types/types.ts b/src/apollo/types/types.ts
index 6c8ce29937..01b70ba9b8 100644
--- a/src/apollo/types/types.ts
+++ b/src/apollo/types/types.ts
@@ -13,6 +13,13 @@ export interface IProjectPower {
round: number;
}
+export interface IAdminUser {
+ id?: string;
+ email?: string;
+ name?: string;
+ walletAddress?: string;
+}
+
export interface IProject {
id?: string;
title?: string;
@@ -32,12 +39,7 @@ export interface IProject {
categories: ICategory[];
reaction?: IReaction;
totalReactions: number;
- adminUser: {
- id?: string;
- email?: string;
- name?: string;
- walletAddress?: string;
- };
+ adminUser: IAdminUser;
donations: {
id?: string;
}[];
From 78395997c6ec9285f9316603b583055a57e44f58 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 16:59:50 +0330
Subject: [PATCH 035/167] remove react import
---
src/components/GIVpowerRank.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/GIVpowerRank.tsx b/src/components/GIVpowerRank.tsx
index fc71e35487..f3662b7a3e 100644
--- a/src/components/GIVpowerRank.tsx
+++ b/src/components/GIVpowerRank.tsx
@@ -7,7 +7,7 @@ import {
IconRocketInSpace32,
IconRocketInSpace16,
} from '@giveth/ui-design-system';
-import React, { FC } from 'react';
+import { FC } from 'react';
import styled, { css } from 'styled-components';
import { IProjectPower } from '@/apollo/types/types';
import { Flex } from './styled-components/Flex';
From 9a8f685daea29135fb07ed612abe9ffda9ec8d67 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 17:00:12 +0330
Subject: [PATCH 036/167] add pfp slice
---
src/features/pfp/pfp.slice.ts | 36 +++++++++++++++++++++++++++++++++++
src/features/store.ts | 2 ++
2 files changed, 38 insertions(+)
create mode 100644 src/features/pfp/pfp.slice.ts
diff --git a/src/features/pfp/pfp.slice.ts b/src/features/pfp/pfp.slice.ts
new file mode 100644
index 0000000000..71c5719469
--- /dev/null
+++ b/src/features/pfp/pfp.slice.ts
@@ -0,0 +1,36 @@
+import { createSlice } from '@reduxjs/toolkit';
+
+interface IPfpInfo {}
+
+interface IPfpState {
+ [key: string]: IPfpInfo | undefined;
+}
+
+const initialState: {
+ pendingList: string[];
+ List: IPfpState[];
+} = {
+ pendingList: [],
+ List: [],
+};
+
+export const pfpSlice = createSlice({
+ name: 'pfp',
+ initialState,
+ reducers: {
+ addAccountToPfpPending: (state, action) => {
+ state.pendingList.push(action.payload.toLowerCase());
+ },
+ clearPfpPendingList: state => {
+ state.pendingList = [];
+ },
+ updatePfpList: (state, action) => {
+ state.List.push(action.payload);
+ },
+ },
+});
+
+export const { addAccountToPfpPending, clearPfpPendingList, updatePfpList } =
+ pfpSlice.actions;
+
+export default pfpSlice.reducer;
diff --git a/src/features/store.ts b/src/features/store.ts
index 3a3942706f..6bb277539b 100644
--- a/src/features/store.ts
+++ b/src/features/store.ts
@@ -11,6 +11,7 @@ import userReducer from './user/user.slice';
import priceReducer from './price/price.slice';
import generalReducer from './general/general.slice';
import notificationReducer from './notification/notification.slice';
+import pfpReducer from './pfp/pfp.slice';
const rootReducer = combineReducers({
subgraph: subgraphReducer,
@@ -19,6 +20,7 @@ const rootReducer = combineReducers({
price: priceReducer,
general: generalReducer,
notification: notificationReducer,
+ pfp: pfpReducer,
});
export const setupStore = (preloadedState?: PreloadedState) => {
From 08bce74ee74a45199d5b3746d9397c5f235a03a9 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 17:00:33 +0330
Subject: [PATCH 037/167] init pfp controller
---
pages/_app.tsx | 4 ++-
src/components/controller/pfp.ctrl.tsx | 46 ++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 1 deletion(-)
create mode 100644 src/components/controller/pfp.ctrl.tsx
diff --git a/pages/_app.tsx b/pages/_app.tsx
index d549228774..9ee34fa923 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -23,9 +23,10 @@ import UserController from '@/components/controller/user.ctrl';
import ModalController from '@/components/controller/modal.ctrl';
import PriceController from '@/components/controller/price.ctrl';
import GeneralController from '@/components/controller/general.ctrl';
+import NotificationController from '@/components/controller/pfp.ctrl';
+import PfpController from '@/components/controller/notification.ctrl';
import ErrorsIndex from '@/components/views/Errors/ErrorsIndex';
import StorageLabel from '@/lib/localStorage';
-import NotificationController from '@/components/controller/notification.ctrl';
import { isGIVeconomyRoute } from '@/lib/helpers';
import GIVeconomyTab from '@/components/GIVeconomyTab';
@@ -141,6 +142,7 @@ function MyApp({ Component, pageProps }: AppProps) {
+
diff --git a/src/components/controller/pfp.ctrl.tsx b/src/components/controller/pfp.ctrl.tsx
new file mode 100644
index 0000000000..40855bc4e3
--- /dev/null
+++ b/src/components/controller/pfp.ctrl.tsx
@@ -0,0 +1,46 @@
+import { useEffect } from 'react';
+import { useAppDispatch, useAppSelector } from '@/features/hooks';
+import config from '@/configuration';
+import { gqlRequest } from '@/helpers/requests';
+import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
+import { clearPfpPendingList } from '@/features/pfp/pfp.slice';
+
+const PfpController = () => {
+ const dispatch = useAppDispatch();
+ const { pendingList } = useAppSelector(state => state.pfp);
+
+ useEffect(() => {
+ let interval: NodeJS.Timer;
+ if (pendingList && pendingList.length > 0) {
+ interval = setInterval(async () => {
+ console.log('pendingList', pendingList);
+ try {
+ const query = buildUsersPfpInfoQuery(pendingList);
+ console.log('query', query);
+ const { data } = await gqlRequest(
+ config.MAINNET_CONFIG.subgraphAddress,
+ false,
+ query,
+ );
+ console.log('data', data);
+ dispatch(clearPfpPendingList());
+ // if (data[`user_${walletAddress}`]) {
+ // console.log(
+ // 'data[`user_${walletAddress}`]',
+ // data[`user_${walletAddress}`],
+ // user,
+ // );
+ // }
+ } catch (error) {
+ console.error('error', error);
+ }
+ }, config.PFP_POLLING_INTERVAL);
+ }
+ return () => {
+ if (interval) clearInterval(interval);
+ };
+ }, [pendingList]);
+ return null;
+};
+
+export default PfpController;
From 5b228dd0092b803f7c22170233acac8af444ab80 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 17:01:16 +0330
Subject: [PATCH 038/167] separate project card owner
---
src/components/project-card/ProjectCard.tsx | 47 ++++----------
.../project-card/ProjectCardUserName.tsx | 65 +++++++++++++++++++
2 files changed, 78 insertions(+), 34 deletions(-)
create mode 100644 src/components/project-card/ProjectCardUserName.tsx
diff --git a/src/components/project-card/ProjectCard.tsx b/src/components/project-card/ProjectCard.tsx
index 8ea4b6e5b3..ae88e6d24d 100644
--- a/src/components/project-card/ProjectCard.tsx
+++ b/src/components/project-card/ProjectCard.tsx
@@ -1,7 +1,6 @@
import { useState } from 'react';
import styled from 'styled-components';
import {
- GLink,
P,
H6,
brandColors,
@@ -23,14 +22,11 @@ import ProjectCardOrgBadge from './ProjectCardOrgBadge';
import { IProject } from '@/apollo/types/types';
import { timeFromNow } from '@/lib/helpers';
import ProjectCardImage from './ProjectCardImage';
-import {
- addressToUserView,
- slugToProjectDonate,
- slugToProjectView,
-} from '@/lib/routeCreators';
+import { slugToProjectDonate, slugToProjectView } from '@/lib/routeCreators';
import { ORGANIZATION } from '@/lib/constants/organizations';
import { mediaQueries } from '@/lib/constants/constants';
import { Flex } from '../styled-components/Flex';
+import { ProjectCardUserName } from './ProjectCardUserName';
const cardRadius = '12px';
const imgHeight = '226px';
@@ -107,22 +103,12 @@ const ProjectCard = (props: IProjectCard) => {
-
- {adminUser?.name && !isForeignOrg && (
-
- {name || '\u200C'}
-
- )}
-
-
-
-
-
-
+
{descriptionSummary}
@@ -268,10 +254,12 @@ enum ECardBodyHover {
FULL,
}
-const CardBody = styled.div<{
+interface ICardBody {
isOtherOrganization?: boolean | '';
isHover: ECardBodyHover;
-}>`
+}
+
+const CardBody = styled.div`
position: absolute;
left: 0;
right: 0;
@@ -305,15 +293,6 @@ const Title = styled(H6)<{ isHover?: boolean }>`
}
`;
-const Author = styled(GLink)`
- color: ${neutralColors.gray[700]};
- margin-bottom: 16px;
- display: block;
- &:hover {
- color: ${brandColors.pinky[500]};
- }
-`;
-
const ImagePlaceholder = styled.div`
height: ${imgHeight};
width: 100%;
@@ -343,7 +322,7 @@ const GivpowerRankContainer = styled(Flex)`
margin-left: auto;
`;
-const PaddedRow = styled(Flex)`
+export const PaddedRow = styled(Flex)`
padding: 0 ${SIDE_PADDING};
`;
diff --git a/src/components/project-card/ProjectCardUserName.tsx b/src/components/project-card/ProjectCardUserName.tsx
new file mode 100644
index 0000000000..9e295eb753
--- /dev/null
+++ b/src/components/project-card/ProjectCardUserName.tsx
@@ -0,0 +1,65 @@
+import { FC, useEffect } from 'react';
+import { GLink, neutralColors, brandColors } from '@giveth/ui-design-system';
+import Link from 'next/link';
+import styled from 'styled-components';
+import { addressToUserView, slugToProjectView } from '@/lib/routeCreators';
+import { PaddedRow } from './ProjectCard';
+import { IAdminUser } from '@/apollo/types/types';
+import { useAppDispatch, useAppSelector } from '@/features/hooks';
+import { addAccountToPfpPending } from '@/features/pfp/pfp.slice';
+
+interface IProjectCardUserName {
+ adminUser?: IAdminUser;
+ slug: string;
+ isForeignOrg?: boolean;
+ name?: string;
+}
+
+export const ProjectCardUserName: FC = ({
+ adminUser,
+ slug,
+ isForeignOrg,
+ name,
+}) => {
+ const { List } = useAppSelector(state => state.pfp);
+ const dispatch = useAppDispatch();
+
+ useEffect(() => {
+ const pfp = List.find(
+ p => p.walletAddress === adminUser?.walletAddress,
+ );
+ if (pfp) {
+ console.log(pfp);
+ } else {
+ dispatch(addAccountToPfpPending(adminUser?.walletAddress));
+ }
+ }, [List, adminUser?.walletAddress, dispatch]);
+
+ return (
+
+ {adminUser?.name && !isForeignOrg && (
+
+ {name || '\u200C'}
+
+ )}
+
+
+
+
+
+
+ );
+};
+
+const Author = styled(GLink)`
+ color: ${neutralColors.gray[700]};
+ margin-bottom: 16px;
+ display: block;
+ &:hover {
+ color: ${brandColors.pinky[500]};
+ }
+`;
From a773edd6113df97d1a4b5da3a74d64f434bb6f5b Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 17:32:45 +0330
Subject: [PATCH 039/167] fetch avatar in adminUser
---
src/apollo/gql/gqlProjects.ts | 1 +
src/apollo/types/types.ts | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/apollo/gql/gqlProjects.ts b/src/apollo/gql/gqlProjects.ts
index ae7ba9e80a..f49bcc4d05 100644
--- a/src/apollo/gql/gqlProjects.ts
+++ b/src/apollo/gql/gqlProjects.ts
@@ -25,6 +25,7 @@ export const PROJECT_CARD_FIELDS = gql`
adminUser {
name
walletAddress
+ avatar
}
updatedAt
organization {
diff --git a/src/apollo/types/types.ts b/src/apollo/types/types.ts
index 01b70ba9b8..62000e811e 100644
--- a/src/apollo/types/types.ts
+++ b/src/apollo/types/types.ts
@@ -18,6 +18,7 @@ export interface IAdminUser {
email?: string;
name?: string;
walletAddress?: string;
+ avatar?: string;
}
export interface IProject {
From 57ba14769c81d1e993ea1cab86ccf8791d258a8f Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 27 Mar 2023 18:03:50 +0330
Subject: [PATCH 040/167] added selected pfp link
---
.../UploadProfilePicModal.tsx | 53 ++++++++++++++++++-
1 file changed, 52 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 870ede124c..46e4d6722c 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -2,8 +2,11 @@ import {
brandColors,
Button,
H5,
+ H6,
+ IconExternalLink16,
mediaQueries,
neutralColors,
+ P,
} from '@giveth/ui-design-system';
import { useState } from 'react';
import styled from 'styled-components';
@@ -26,6 +29,7 @@ import { gToast, ToastType } from '@/components/toasts';
import { fetchUserByAddress } from '@/features/user/user.thunks';
import { useAppDispatch } from '@/features/hooks';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
+import config from '@/configuration';
interface IUploadProfilePicModal extends IModal {
user: IUser;
@@ -169,6 +173,36 @@ const UploadProfilePicModal = ({
/>
))}
+ {selectedPFP && (
+
+
+
+ The The Givers Collection #
+ {selectedPFP.tokenId}
+
+
+ Short information/summary about
+ the selected PFP
+
+
+ View on OpenSea{' '}
+
+
+
+
+ )}
`
const CustomH5 = styled(H5)`
text-align: left;
- margin-top: 40px;
+ margin-top: 16px;
`;
const NoNFTContainer = styled(FlexCenter)`
@@ -238,3 +272,20 @@ const NoNFTContainer = styled(FlexCenter)`
color: ${brandColors.pinky[500]};
}
`;
+
+const SelectedPFPContainer = styled.div`
+ background-color: ${neutralColors.gray[200]};
+ border-left: 6px solid ${brandColors.pinky[500]};
+ margin-top: 8px;
+ padding: 16px 24px;
+ border-radius: 8px;
+ text-align: left;
+`;
+
+const CustomLink = styled.a`
+ color: ${brandColors.pinky[500]};
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ max-width: fit-content;
+`;
From d9130c3edf76ba6aec586ca9f37d9f1c4b09649c Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Mon, 27 Mar 2023 19:25:37 +0330
Subject: [PATCH 041/167] added NO NFT
---
.../UploadProfilePicModal.tsx | 48 ++++++++++++++++++-
1 file changed, 47 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 46e4d6722c..c6d6aa79eb 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -4,6 +4,7 @@ import {
H5,
H6,
IconExternalLink16,
+ IconImage32,
mediaQueries,
neutralColors,
P,
@@ -14,6 +15,7 @@ import { useIntl } from 'react-intl';
import { useMutation } from '@apollo/client';
import { captureException } from '@sentry/nextjs';
import { useWeb3React } from '@web3-react/core';
+import Link from 'next/link';
import useUpload from '@/hooks/useUpload';
import ImageUploader from '../../ImageUploader';
import { Flex, FlexCenter } from '../../styled-components/Flex';
@@ -30,6 +32,7 @@ import { fetchUserByAddress } from '@/features/user/user.thunks';
import { useAppDispatch } from '@/features/hooks';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import config from '@/configuration';
+import Routes from '@/lib/constants/Routes';
interface IUploadProfilePicModal extends IModal {
user: IUser;
@@ -225,7 +228,45 @@ const UploadProfilePicModal = ({
) : (
- Test
+
+
+ Your Unique Giveth’s PFP Artwork
+
+
+
+
+
+ Sorry!!
+
+ This wallet address does not have a
+ unique Giveth’s NFT Yet.
+
+
+
+ Mint{' '}
+
+ yours now on the NFT minter page.
+
+
+
+
+
+
+
+
+
+
+
)}
>
)}
@@ -289,3 +330,8 @@ const CustomLink = styled.a`
gap: 8px;
max-width: fit-content;
`;
+
+const MintLink = styled(Link)`
+ max-width: fit-content;
+ color: ${brandColors.pinky[500]};
+`;
From 77015f008c4eae6d661c79e8739f005bf67e1677 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 23:46:26 +0330
Subject: [PATCH 042/167] update types
---
src/apollo/types/types.ts | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/apollo/types/types.ts b/src/apollo/types/types.ts
index 62000e811e..c15224eee9 100644
--- a/src/apollo/types/types.ts
+++ b/src/apollo/types/types.ts
@@ -357,7 +357,8 @@ export interface IRecentDonation {
valueUsd: number | null;
}
-export interface IGiversPFPToken {
+export interface IGiverPFPToken {
+ id: string;
user: {
id: string;
};
@@ -365,6 +366,6 @@ export interface IGiversPFPToken {
imageIpfs: string;
}
-export interface IUserPFPTokens {
- [key: string]: IGiversPFPToken;
+export interface IUsersPFPTokens {
+ [key: string]: IGiverPFPToken[];
}
From 313c37976cbd374d74bf18a9d0c8ca2d2dd14e32 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 23:46:51 +0330
Subject: [PATCH 043/167] use object instead of array
---
src/features/pfp/pfp.slice.ts | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/src/features/pfp/pfp.slice.ts b/src/features/pfp/pfp.slice.ts
index 71c5719469..dfd7b39102 100644
--- a/src/features/pfp/pfp.slice.ts
+++ b/src/features/pfp/pfp.slice.ts
@@ -1,17 +1,20 @@
import { createSlice } from '@reduxjs/toolkit';
+import { IGiverPFPToken } from '@/apollo/types/types';
-interface IPfpInfo {}
+export interface IPfpList {
+ [key: string]: IGiverPFPToken | false;
+}
-interface IPfpState {
- [key: string]: IPfpInfo | undefined;
+interface IPfpPending {
+ [key: string]: string;
}
const initialState: {
- pendingList: string[];
- List: IPfpState[];
+ pendingList: IPfpPending;
+ List: IPfpList;
} = {
- pendingList: [],
- List: [],
+ pendingList: {},
+ List: {},
};
export const pfpSlice = createSlice({
@@ -19,13 +22,14 @@ export const pfpSlice = createSlice({
initialState,
reducers: {
addAccountToPfpPending: (state, action) => {
- state.pendingList.push(action.payload.toLowerCase());
+ state.pendingList[action.payload.address.toLowerCase()] =
+ action.payload.avatar;
},
clearPfpPendingList: state => {
- state.pendingList = [];
+ state.pendingList = {};
},
updatePfpList: (state, action) => {
- state.List.push(action.payload);
+ state.List = { ...state.List, ...action.payload };
},
},
});
From 35406e1afd8ca10f121de5e81bbeeebfec1e0dbc Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 23:47:32 +0330
Subject: [PATCH 044/167] update PfpController to fetch pending pfp list
---
src/components/controller/pfp.ctrl.tsx | 51 ++++++++++++++++++--------
1 file changed, 36 insertions(+), 15 deletions(-)
diff --git a/src/components/controller/pfp.ctrl.tsx b/src/components/controller/pfp.ctrl.tsx
index 40855bc4e3..f1c321164c 100644
--- a/src/components/controller/pfp.ctrl.tsx
+++ b/src/components/controller/pfp.ctrl.tsx
@@ -3,7 +3,12 @@ import { useAppDispatch, useAppSelector } from '@/features/hooks';
import config from '@/configuration';
import { gqlRequest } from '@/helpers/requests';
import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
-import { clearPfpPendingList } from '@/features/pfp/pfp.slice';
+import {
+ clearPfpPendingList,
+ IPfpList,
+ updatePfpList,
+} from '@/features/pfp/pfp.slice';
+import { IUsersPFPTokens } from '@/apollo/types/types';
const PfpController = () => {
const dispatch = useAppDispatch();
@@ -11,26 +16,42 @@ const PfpController = () => {
useEffect(() => {
let interval: NodeJS.Timer;
- if (pendingList && pendingList.length > 0) {
+ const _pendingList = Object.keys(pendingList);
+ if (_pendingList && _pendingList.length > 0) {
interval = setInterval(async () => {
- console.log('pendingList', pendingList);
try {
- const query = buildUsersPfpInfoQuery(pendingList);
- console.log('query', query);
- const { data } = await gqlRequest(
+ const query = buildUsersPfpInfoQuery(_pendingList);
+ const res = await gqlRequest(
config.MAINNET_CONFIG.subgraphAddress,
false,
query,
);
- console.log('data', data);
+ const data: IUsersPFPTokens = res.data;
+ const pfpList: IPfpList = {};
+ for (const key in data) {
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
+ const userPFPTokens = data[key];
+ const address = key.slice(5);
+ if (userPFPTokens && userPFPTokens.length > 0) {
+ const userPFPToken = userPFPTokens.find(
+ _userPFPTokens => {
+ const avatarHash =
+ pendingList[address].slice(21);
+ const imageIpfsHash =
+ _userPFPTokens.imageIpfs.slice(7);
+ return avatarHash === imageIpfsHash;
+ },
+ );
+ if (userPFPToken) {
+ pfpList[address] = userPFPToken;
+ continue;
+ }
+ }
+ pfpList[address] = false;
+ }
+ }
+ dispatch(updatePfpList(pfpList));
dispatch(clearPfpPendingList());
- // if (data[`user_${walletAddress}`]) {
- // console.log(
- // 'data[`user_${walletAddress}`]',
- // data[`user_${walletAddress}`],
- // user,
- // );
- // }
} catch (error) {
console.error('error', error);
}
@@ -39,7 +60,7 @@ const PfpController = () => {
return () => {
if (interval) clearInterval(interval);
};
- }, [pendingList]);
+ }, [dispatch, pendingList]);
return null;
};
From 5fe8951895f1657992afa4a4e523ab98df26c320 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 27 Mar 2023 23:50:04 +0330
Subject: [PATCH 045/167] get user from list
---
.../project-card/ProjectCardUserName.tsx | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/components/project-card/ProjectCardUserName.tsx b/src/components/project-card/ProjectCardUserName.tsx
index 9e295eb753..9cfae0cfc5 100644
--- a/src/components/project-card/ProjectCardUserName.tsx
+++ b/src/components/project-card/ProjectCardUserName.tsx
@@ -25,13 +25,20 @@ export const ProjectCardUserName: FC = ({
const dispatch = useAppDispatch();
useEffect(() => {
- const pfp = List.find(
- p => p.walletAddress === adminUser?.walletAddress,
+ if (!adminUser || !adminUser.walletAddress || !adminUser.avatar) return;
+ console.log(
+ 'List[adminUser.walletAddress.toLowerCase()]',
+ List[adminUser.walletAddress.toLowerCase()],
);
- if (pfp) {
- console.log(pfp);
+ if (List[adminUser.walletAddress.toLowerCase()] !== undefined) {
+ console.log();
} else {
- dispatch(addAccountToPfpPending(adminUser?.walletAddress));
+ dispatch(
+ addAccountToPfpPending({
+ address: adminUser.walletAddress,
+ avatar: adminUser.avatar,
+ }),
+ );
}
}, [List, adminUser?.walletAddress, dispatch]);
From 45d543b4171b599f71593311a2929064824d01ca Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 00:34:32 +0330
Subject: [PATCH 046/167] update interval
---
src/components/controller/pfp.ctrl.tsx | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/src/components/controller/pfp.ctrl.tsx b/src/components/controller/pfp.ctrl.tsx
index f1c321164c..6af93375ef 100644
--- a/src/components/controller/pfp.ctrl.tsx
+++ b/src/components/controller/pfp.ctrl.tsx
@@ -15,11 +15,10 @@ const PfpController = () => {
const { pendingList } = useAppSelector(state => state.pfp);
useEffect(() => {
- let interval: NodeJS.Timer;
const _pendingList = Object.keys(pendingList);
- if (_pendingList && _pendingList.length > 0) {
- interval = setInterval(async () => {
- try {
+ const interval: NodeJS.Timer = setInterval(async () => {
+ try {
+ if (_pendingList && _pendingList.length > 0) {
const query = buildUsersPfpInfoQuery(_pendingList);
const res = await gqlRequest(
config.MAINNET_CONFIG.subgraphAddress,
@@ -52,11 +51,11 @@ const PfpController = () => {
}
dispatch(updatePfpList(pfpList));
dispatch(clearPfpPendingList());
- } catch (error) {
- console.error('error', error);
}
- }, config.PFP_POLLING_INTERVAL);
- }
+ } catch (error) {
+ console.error('error', error);
+ }
+ }, config.PFP_POLLING_INTERVAL);
return () => {
if (interval) clearInterval(interval);
};
From 946c435b70dac8dc12fc0e09eed4d7e861cb2f69 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 00:35:09 +0330
Subject: [PATCH 047/167] show pfp on project card
---
.../project-card/ProjectCardUserName.tsx | 50 +++++++++++++------
1 file changed, 36 insertions(+), 14 deletions(-)
diff --git a/src/components/project-card/ProjectCardUserName.tsx b/src/components/project-card/ProjectCardUserName.tsx
index 9cfae0cfc5..1ad4dc3b33 100644
--- a/src/components/project-card/ProjectCardUserName.tsx
+++ b/src/components/project-card/ProjectCardUserName.tsx
@@ -1,15 +1,18 @@
-import { FC, useEffect } from 'react';
+import { FC, useEffect, useState } from 'react';
import { GLink, neutralColors, brandColors } from '@giveth/ui-design-system';
import Link from 'next/link';
import styled from 'styled-components';
+import Image from 'next/image';
import { addressToUserView, slugToProjectView } from '@/lib/routeCreators';
import { PaddedRow } from './ProjectCard';
-import { IAdminUser } from '@/apollo/types/types';
+import { IAdminUser, IGiverPFPToken } from '@/apollo/types/types';
import { useAppDispatch, useAppSelector } from '@/features/hooks';
import { addAccountToPfpPending } from '@/features/pfp/pfp.slice';
+import { convertIPFSToHTTPS } from '@/helpers/blockchain';
+import { Flex } from '../styled-components/Flex';
interface IProjectCardUserName {
- adminUser?: IAdminUser;
+ adminUser: IAdminUser;
slug: string;
isForeignOrg?: boolean;
name?: string;
@@ -21,26 +24,26 @@ export const ProjectCardUserName: FC = ({
isForeignOrg,
name,
}) => {
+ const [pfpToken, setPfpToken] = useState(null);
const { List } = useAppSelector(state => state.pfp);
const dispatch = useAppDispatch();
useEffect(() => {
- if (!adminUser || !adminUser.walletAddress || !adminUser.avatar) return;
- console.log(
- 'List[adminUser.walletAddress.toLowerCase()]',
- List[adminUser.walletAddress.toLowerCase()],
- );
- if (List[adminUser.walletAddress.toLowerCase()] !== undefined) {
- console.log();
- } else {
+ if (!adminUser.walletAddress || !adminUser.avatar) return;
+ const _pfpToken = List[adminUser.walletAddress.toLowerCase()];
+ if (_pfpToken === undefined) {
dispatch(
addAccountToPfpPending({
address: adminUser.walletAddress,
avatar: adminUser.avatar,
}),
);
+ } else {
+ if (_pfpToken !== false) {
+ setPfpToken(_pfpToken);
+ }
}
- }, [List, adminUser?.walletAddress, dispatch]);
+ }, [List, adminUser, adminUser.walletAddress, dispatch]);
return (
@@ -50,7 +53,21 @@ export const ProjectCardUserName: FC = ({
adminUser?.walletAddress?.toLowerCase(),
)}
>
- {name || '\u200C'}
+ {pfpToken ? (
+
+
+
+ {name || '\u200C'}
+
+
+ ) : (
+ {name || '\u200C'}
+ )}
)}
@@ -62,11 +79,16 @@ export const ProjectCardUserName: FC = ({
);
};
-const Author = styled(GLink)`
+interface IAuthor {
+ bold?: boolean;
+}
+
+const Author = styled(GLink)`
color: ${neutralColors.gray[700]};
margin-bottom: 16px;
display: block;
&:hover {
color: ${brandColors.pinky[500]};
}
+ font-weight: ${props => (props.bold ? 500 : 400)};
`;
From 7f76a4e7a88542088d7211cb704569b2b53a0962 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 13:26:20 +0330
Subject: [PATCH 048/167] add useGiverPFPToken
---
src/hooks/useGiverPFPToken.ts | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 src/hooks/useGiverPFPToken.ts
diff --git a/src/hooks/useGiverPFPToken.ts b/src/hooks/useGiverPFPToken.ts
new file mode 100644
index 0000000000..e6866d08fa
--- /dev/null
+++ b/src/hooks/useGiverPFPToken.ts
@@ -0,0 +1,28 @@
+import { useState, useEffect } from 'react';
+import { IGiverPFPToken } from '@/apollo/types/types';
+import { useAppSelector, useAppDispatch } from '@/features/hooks';
+import { addAccountToPfpPending } from '@/features/pfp/pfp.slice';
+
+export const useGiverPFPToken = (walletAddress?: string, avatar?: string) => {
+ const [pfpToken, setPfpToken] = useState(null);
+ const { List } = useAppSelector(state => state.pfp);
+ const dispatch = useAppDispatch();
+
+ useEffect(() => {
+ if (!walletAddress || !avatar) return;
+ const _pfpToken = List[walletAddress.toLowerCase()];
+ if (_pfpToken === undefined) {
+ dispatch(
+ addAccountToPfpPending({
+ address: walletAddress,
+ avatar: avatar,
+ }),
+ );
+ } else {
+ if (_pfpToken !== false) {
+ setPfpToken(_pfpToken);
+ }
+ }
+ }, [List, walletAddress, avatar, dispatch]);
+ return pfpToken;
+};
From 5282309e1449d9e900cb0330e5c3a58251153760 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 13:26:34 +0330
Subject: [PATCH 049/167] use useGiverPFPToken in ProjectCardUserName
---
.../project-card/ProjectCardUserName.tsx | 31 +++++--------------
1 file changed, 7 insertions(+), 24 deletions(-)
diff --git a/src/components/project-card/ProjectCardUserName.tsx b/src/components/project-card/ProjectCardUserName.tsx
index 1ad4dc3b33..04dc534d94 100644
--- a/src/components/project-card/ProjectCardUserName.tsx
+++ b/src/components/project-card/ProjectCardUserName.tsx
@@ -1,15 +1,14 @@
-import { FC, useEffect, useState } from 'react';
+import { FC } from 'react';
import { GLink, neutralColors, brandColors } from '@giveth/ui-design-system';
import Link from 'next/link';
import styled from 'styled-components';
import Image from 'next/image';
import { addressToUserView, slugToProjectView } from '@/lib/routeCreators';
import { PaddedRow } from './ProjectCard';
-import { IAdminUser, IGiverPFPToken } from '@/apollo/types/types';
-import { useAppDispatch, useAppSelector } from '@/features/hooks';
-import { addAccountToPfpPending } from '@/features/pfp/pfp.slice';
+import { IAdminUser } from '@/apollo/types/types';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import { Flex } from '../styled-components/Flex';
+import { useGiverPFPToken } from '@/hooks/useGiverPFPToken';
interface IProjectCardUserName {
adminUser: IAdminUser;
@@ -24,26 +23,10 @@ export const ProjectCardUserName: FC = ({
isForeignOrg,
name,
}) => {
- const [pfpToken, setPfpToken] = useState(null);
- const { List } = useAppSelector(state => state.pfp);
- const dispatch = useAppDispatch();
-
- useEffect(() => {
- if (!adminUser.walletAddress || !adminUser.avatar) return;
- const _pfpToken = List[adminUser.walletAddress.toLowerCase()];
- if (_pfpToken === undefined) {
- dispatch(
- addAccountToPfpPending({
- address: adminUser.walletAddress,
- avatar: adminUser.avatar,
- }),
- );
- } else {
- if (_pfpToken !== false) {
- setPfpToken(_pfpToken);
- }
- }
- }, [List, adminUser, adminUser.walletAddress, dispatch]);
+ const pfpToken = useGiverPFPToken(
+ adminUser?.walletAddress,
+ adminUser?.avatar,
+ );
return (
From 6fd83b439988ff91dfe21f88e335d7d1e177ac41 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:10:34 +0330
Subject: [PATCH 050/167] fetch avatar on FETCH_PROJECT_DONATIONS
---
src/apollo/gql/gqlDonations.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/apollo/gql/gqlDonations.ts b/src/apollo/gql/gqlDonations.ts
index 04877bfd60..f4dbb21124 100644
--- a/src/apollo/gql/gqlDonations.ts
+++ b/src/apollo/gql/gqlDonations.ts
@@ -41,6 +41,7 @@ export const FETCH_PROJECT_DONATIONS = gql`
user {
name
walletAddress
+ avatar
}
}
totalCount
From c972243e75dbef2aeb2d3447b1dcbe13da994d4e Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:10:44 +0330
Subject: [PATCH 051/167] add ProjectDonationUserName
---
.../ProjectDonationUserName.tsx | 41 +++++++++++++++++++
1 file changed, 41 insertions(+)
create mode 100644 src/components/views/project/projectDonations/ProjectDonationUserName.tsx
diff --git a/src/components/views/project/projectDonations/ProjectDonationUserName.tsx b/src/components/views/project/projectDonations/ProjectDonationUserName.tsx
new file mode 100644
index 0000000000..5ea50771ee
--- /dev/null
+++ b/src/components/views/project/projectDonations/ProjectDonationUserName.tsx
@@ -0,0 +1,41 @@
+import React, { FC } from 'react';
+import Image from 'next/image';
+import styled from 'styled-components';
+import { IAdminUser } from '@/apollo/types/types';
+import { useGiverPFPToken } from '@/hooks/useGiverPFPToken';
+import { Flex } from '@/components/styled-components/Flex';
+import { convertIPFSToHTTPS } from '@/helpers/blockchain';
+import { shortenAddress } from '@/lib/helpers';
+
+interface IProjectDonationUserName {
+ donor: IAdminUser;
+}
+
+export const ProjectDonationUserName: FC = ({
+ donor,
+}) => {
+ const pfpToken = useGiverPFPToken(donor?.walletAddress, donor?.avatar);
+ const name =
+ donor?.name || shortenAddress(donor.walletAddress?.toLowerCase());
+ return pfpToken ? (
+
+
+ {name || '\u200C'}
+
+ ) : (
+ {name || '\u200C'}
+ );
+};
+
+const Bold = styled.span`
+ font-weight: 400;
+`;
+
+const NoAvatar = styled.span`
+ padding-left: 32px;
+`;
From a31a297574e348064f1d0c032cd21dc0c856485f Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:10:56 +0330
Subject: [PATCH 052/167] use ProjectDonationUserName
---
.../projectDonations/ProjectDonationTable.tsx | 22 ++++++++++---------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/src/components/views/project/projectDonations/ProjectDonationTable.tsx b/src/components/views/project/projectDonations/ProjectDonationTable.tsx
index 3a66a26b60..27bb5c6975 100644
--- a/src/components/views/project/projectDonations/ProjectDonationTable.tsx
+++ b/src/components/views/project/projectDonations/ProjectDonationTable.tsx
@@ -17,7 +17,6 @@ import {
formatTxLink,
compareAddresses,
formatUSD,
- shortenAddress,
} from '@/lib/helpers';
import {
EDirection,
@@ -37,6 +36,7 @@ import {
import { useProjectContext } from '@/context/project.context';
import NetworkLogo from '@/components/NetworkLogo';
import { networksParams } from '@/helpers/blockchain';
+import { ProjectDonationUserName } from './ProjectDonationUserName';
const itemPerPage = 10;
@@ -129,6 +129,8 @@ const ProjectDonationTable = ({
if (page !== 0) setPage(0);
}, [searchTerm]);
+ console.log('donation.user', donations);
+
return (
{donation.donationType ===
- EDonationType.POIGNART
- ? 'PoignART'
- : donation.anonymous
- ? 'Anonymous'
- : donation.user?.name ||
- donation.user?.firstName ||
- shortenAddress(
- donation.user.walletAddress?.toLowerCase(),
- )}
+ EDonationType.POIGNART ? (
+ 'PoignART'
+ ) : donation.anonymous ? (
+ 'Anonymous'
+ ) : (
+
+ )}
{isAdmin && (
From 04f223cb572c48d8f380fda1bbfc38206ce2d8f0 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:24:04 +0330
Subject: [PATCH 053/167] add hover to pfp avatar
---
.../projectDonations/ProjectDonationTable.tsx | 3 +++
.../projectDonations/ProjectDonationUserName.tsx | 12 +++++++++---
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/components/views/project/projectDonations/ProjectDonationTable.tsx b/src/components/views/project/projectDonations/ProjectDonationTable.tsx
index 27bb5c6975..53bedcb97e 100644
--- a/src/components/views/project/projectDonations/ProjectDonationTable.tsx
+++ b/src/components/views/project/projectDonations/ProjectDonationTable.tsx
@@ -283,6 +283,9 @@ const DonationRowWrapper = styled(RowWrapper)`
background-color: ${neutralColors.gray[300]};
color: ${brandColors.pinky[500]};
}
+ &:hover #pfp-avatar {
+ box-shadow: 0px 0.762881px 4.57729px 1.14432px rgba(225, 69, 141, 0.5);
+ }
`;
const DonationTableCell = styled(TableCell)`
diff --git a/src/components/views/project/projectDonations/ProjectDonationUserName.tsx b/src/components/views/project/projectDonations/ProjectDonationUserName.tsx
index 5ea50771ee..59bf4fc7a6 100644
--- a/src/components/views/project/projectDonations/ProjectDonationUserName.tsx
+++ b/src/components/views/project/projectDonations/ProjectDonationUserName.tsx
@@ -19,11 +19,12 @@ export const ProjectDonationUserName: FC = ({
donor?.name || shortenAddress(donor.walletAddress?.toLowerCase());
return pfpToken ? (
-
{name || '\u200C'}
@@ -32,10 +33,15 @@ export const ProjectDonationUserName: FC = ({
);
};
+const StyledImage = styled(Image)`
+ margin-left: 8px;
+ transition: box-shadow 0.2s ease;
+`;
+
const Bold = styled.span`
- font-weight: 400;
+ font-weight: 500;
`;
const NoAvatar = styled.span`
- padding-left: 32px;
+ padding-left: 40px;
`;
From e41bb5e27025bd45d2d6c2f1e7a41c2760b6d729 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:37:42 +0330
Subject: [PATCH 054/167] change ProjectDonationUserName to UserWithPFPInCell
---
...ectDonationUserName.tsx => UserWithPFPInCell.tsx} | 12 +++++-------
.../projectDonations/ProjectDonationTable.tsx | 6 ++----
2 files changed, 7 insertions(+), 11 deletions(-)
rename src/components/{views/project/projectDonations/ProjectDonationUserName.tsx => UserWithPFPInCell.tsx} (75%)
diff --git a/src/components/views/project/projectDonations/ProjectDonationUserName.tsx b/src/components/UserWithPFPInCell.tsx
similarity index 75%
rename from src/components/views/project/projectDonations/ProjectDonationUserName.tsx
rename to src/components/UserWithPFPInCell.tsx
index 59bf4fc7a6..6c0f1b7fee 100644
--- a/src/components/views/project/projectDonations/ProjectDonationUserName.tsx
+++ b/src/components/UserWithPFPInCell.tsx
@@ -7,16 +7,14 @@ import { Flex } from '@/components/styled-components/Flex';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import { shortenAddress } from '@/lib/helpers';
-interface IProjectDonationUserName {
- donor: IAdminUser;
+interface IUserWithPFPInCell {
+ user: IAdminUser;
}
-export const ProjectDonationUserName: FC = ({
- donor,
-}) => {
- const pfpToken = useGiverPFPToken(donor?.walletAddress, donor?.avatar);
+export const UserWithPFPInCell: FC = ({ user }) => {
+ const pfpToken = useGiverPFPToken(user?.walletAddress, user?.avatar);
const name =
- donor?.name || shortenAddress(donor.walletAddress?.toLowerCase());
+ user?.name || shortenAddress(user.walletAddress?.toLowerCase());
return pfpToken ? (
+
)}
{isAdmin && (
From fad00f47e9b9a8c6e15e28530444b6593b9ba5f4 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:38:07 +0330
Subject: [PATCH 055/167] get avatar in FETCH_PROJECT_BOOSTERS
---
src/apollo/gql/gqlPowerBoosting.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/apollo/gql/gqlPowerBoosting.ts b/src/apollo/gql/gqlPowerBoosting.ts
index dfab7abc3d..e0e04fbf86 100644
--- a/src/apollo/gql/gqlPowerBoosting.ts
+++ b/src/apollo/gql/gqlPowerBoosting.ts
@@ -97,6 +97,7 @@ export const FETCH_PROJECT_BOOSTERS = gql`
user {
name
walletAddress
+ avatar
}
percentage
}
From 7a85b85549d45ad32df2f966571081a96033c4ee Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:38:23 +0330
Subject: [PATCH 056/167] use UserWithPFPInCell in GIVPowerTable
---
.../views/project/projectGIVPower/GIVPowerTable.tsx | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/components/views/project/projectGIVPower/GIVPowerTable.tsx b/src/components/views/project/projectGIVPower/GIVPowerTable.tsx
index fffeda87f2..f82995e1ea 100644
--- a/src/components/views/project/projectGIVPower/GIVPowerTable.tsx
+++ b/src/components/views/project/projectGIVPower/GIVPowerTable.tsx
@@ -8,6 +8,7 @@ import {
} from '@giveth/ui-design-system';
import { RowWrapper } from '@/components/styled-components/Table';
import { formatWeiHelper } from '@/helpers/number';
+import { UserWithPFPInCell } from '@/components/UserWithPFPInCell';
import { IPowerBoostingWithUserGIVpower } from '.';
interface IGIVPowerTableProps {
@@ -28,7 +29,9 @@ const GIVPowerTable: FC = ({
{powerBoostings?.map(({ id, user }) => (
- {user.name || 'Anonymous'}
+
+
+
{formatWeiHelper(user.allocated)}
))}
From ab8e3abf90c471dd285ed8b183184d7b8fe11531 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 14:40:43 +0330
Subject: [PATCH 057/167] add hover
---
.../views/project/projectGIVPower/GIVPowerTable.tsx | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/components/views/project/projectGIVPower/GIVPowerTable.tsx b/src/components/views/project/projectGIVPower/GIVPowerTable.tsx
index f82995e1ea..c9d7a6f73a 100644
--- a/src/components/views/project/projectGIVPower/GIVPowerTable.tsx
+++ b/src/components/views/project/projectGIVPower/GIVPowerTable.tsx
@@ -60,6 +60,10 @@ const GIVpowerRowWrapper = styled(RowWrapper)`
&:hover > div {
background-color: ${neutralColors.gray[300]};
}
+
+ &:hover #pfp-avatar {
+ box-shadow: 0px 0.762881px 4.57729px 1.14432px rgba(225, 69, 141, 0.5);
+ }
`;
const Container = styled.div`
From cf7a6953aa9ebf55e795dea1299487ff24e5bce8 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 28 Mar 2023 14:49:15 +0330
Subject: [PATCH 058/167] check pfp ids and select the selected pfp
---
.../UploadProfilePicModal.tsx | 21 ++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index c6d6aa79eb..5a400e7dcb 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -9,7 +9,7 @@ import {
neutralColors,
P,
} from '@giveth/ui-design-system';
-import { useState } from 'react';
+import { useEffect, useState } from 'react';
import styled from 'styled-components';
import { useIntl } from 'react-intl';
import { useMutation } from '@apollo/client';
@@ -63,6 +63,7 @@ const UploadProfilePicModal = ({
console.log('user', user);
console.log('dataaaaa', pfpData);
+ console.log('dataaaaa Selected', selectedPFP);
const nftUrl = selectedPFP?.imageIpfs
? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
@@ -73,6 +74,7 @@ const UploadProfilePicModal = ({
if (activeTab === 1) {
return url;
} else {
+ console.log('Nft URL', nftUrl);
return nftUrl;
}
};
@@ -110,6 +112,23 @@ const UploadProfilePicModal = ({
}
};
+ useEffect(() => {
+ const compareHashes = () => {
+ const regex = /(\d+)\.\w+$/;
+ const selectedAvatarHash = user.avatar?.match(regex)?.[0] ?? null;
+ if (pfpData && pfpData.length > 0) {
+ pfpData.find(pfp => {
+ const pfpHash =
+ pfp.imageIpfs.match(regex)?.[0] ?? undefined;
+ if (pfpHash === selectedAvatarHash) {
+ setSelectedPFP(pfp);
+ }
+ });
+ }
+ };
+ compareHashes();
+ }, []);
+
return (
Date: Tue, 28 Mar 2023 15:19:21 +0330
Subject: [PATCH 059/167] handle responsiveness
---
.../modals/UploadProfilePicModal/UploadProfilePicModal.tsx | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 5a400e7dcb..1ac3871f2d 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -33,6 +33,7 @@ import { useAppDispatch } from '@/features/hooks';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import config from '@/configuration';
import Routes from '@/lib/constants/Routes';
+import useDetectDevice from '@/hooks/useDetectDevice';
interface IUploadProfilePicModal extends IModal {
user: IUser;
@@ -58,7 +59,7 @@ const UploadProfilePicModal = ({
const dispatch = useAppDispatch();
const { account } = useWeb3React();
const [updateUser] = useMutation(UPDATE_USER);
-
+ const { isMobile } = useDetectDevice();
const { url, onDelete } = useUploadProps;
console.log('user', user);
@@ -181,7 +182,7 @@ const UploadProfilePicModal = ({
Your Unique Giveth’s PFP Artwork
-
+
{pfpData?.map(pfp => (
setSelectedPFP(pfp)}
@@ -245,6 +246,7 @@ const UploadProfilePicModal = ({
}}
/>
+ {isMobile &&
}
) : (
From eff6554567da22581ded194939b14db159bbaa3c Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 15:21:58 +0330
Subject: [PATCH 060/167] fetch avatar in FETCH_PROJECT_BY_SLUG
---
src/apollo/gql/gqlProjects.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/apollo/gql/gqlProjects.ts b/src/apollo/gql/gqlProjects.ts
index f49bcc4d05..3eaec48d2a 100644
--- a/src/apollo/gql/gqlProjects.ts
+++ b/src/apollo/gql/gqlProjects.ts
@@ -106,6 +106,7 @@ export const FETCH_PROJECT_BY_SLUG = gql`
id
name
walletAddress
+ avatar
}
status {
id
From d0622513a474d8e40824dd15417242936710e285 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 15:22:12 +0330
Subject: [PATCH 061/167] add ProjectOwnerWithPfp
---
.../views/project/ProjectOwnerWithPfp.tsx | 45 +++++++++++++++++++
1 file changed, 45 insertions(+)
create mode 100644 src/components/views/project/ProjectOwnerWithPfp.tsx
diff --git a/src/components/views/project/ProjectOwnerWithPfp.tsx b/src/components/views/project/ProjectOwnerWithPfp.tsx
new file mode 100644
index 0000000000..72afded00b
--- /dev/null
+++ b/src/components/views/project/ProjectOwnerWithPfp.tsx
@@ -0,0 +1,45 @@
+import React, { FC } from 'react';
+import { P, brandColors } from '@giveth/ui-design-system';
+import Link from 'next/link';
+import styled from 'styled-components';
+import Image from 'next/image';
+import { addressToUserView } from '@/lib/routeCreators';
+import { IAdminUser } from '@/apollo/types/types';
+import { useGiverPFPToken } from '@/hooks/useGiverPFPToken';
+import { Flex } from '@/components/styled-components/Flex';
+import { convertIPFSToHTTPS } from '@/helpers/blockchain';
+import { shortenAddress } from '@/lib/helpers';
+
+interface IProjectOwnerWithPfpProps {
+ user?: IAdminUser;
+}
+
+export const ProjectOwnerWithPfp: FC = ({
+ user,
+}) => {
+ const pfpToken = useGiverPFPToken(user?.walletAddress, user?.avatar);
+ const name =
+ user?.name || shortenAddress(user?.walletAddress?.toLowerCase());
+ return (
+
+ {pfpToken ? (
+
+
+ {name || '\u200C'}
+
+ ) : (
+ {name || '\u200C'}
+ )}
+
+ );
+};
+
+const Author = styled(P)`
+ color: ${brandColors.pinky[500]};
+ cursor: pointer;
+`;
From a2722220a040aca5b20aa034bcd8925c64ce864b Mon Sep 17 00:00:00 2001
From: Cherik
Date: Tue, 28 Mar 2023 15:22:22 +0330
Subject: [PATCH 062/167] use ProjectOwnerWithPfp in ProjectHeader
---
.../views/project/ProjectHeader.tsx | 20 +++----------------
1 file changed, 3 insertions(+), 17 deletions(-)
diff --git a/src/components/views/project/ProjectHeader.tsx b/src/components/views/project/ProjectHeader.tsx
index b7ada3d1bf..74b9b5a68b 100644
--- a/src/components/views/project/ProjectHeader.tsx
+++ b/src/components/views/project/ProjectHeader.tsx
@@ -1,13 +1,12 @@
import { useEffect, useRef, useState } from 'react';
-import Link from 'next/link';
-import { P, brandColors, H3, neutralColors } from '@giveth/ui-design-system';
+import { brandColors, H3, neutralColors } from '@giveth/ui-design-system';
import styled from 'styled-components';
import VerificationBadge from '@/components/badges/VerificationBadge';
import { isNoImg, noImgColor, noImgIcon } from '@/lib/helpers';
import { mediaQueries } from '@/lib/constants/constants';
-import { addressToUserView } from '@/lib/routeCreators';
import { useProjectContext } from '@/context/project.context';
+import { ProjectOwnerWithPfp } from './ProjectOwnerWithPfp';
const ProjectHeader = () => {
const { projectData } = useProjectContext();
@@ -15,8 +14,6 @@ const ProjectHeader = () => {
const [adjustTitle, setAdjustTitle] = useState(false);
const containerRef = useRef(null);
- const name = adminUser?.name;
-
useEffect(() => {
const observerHandler = (entries: IntersectionObserverEntry[]) => {
const [entry] = entries;
@@ -45,13 +42,7 @@ const ProjectHeader = () => {
{title}
-
- {name}
-
+
@@ -121,9 +112,4 @@ const Title = styled(H3)<{ fixSize: boolean }>`
margin: ${props => (props.fixSize ? '8px 0' : '16px 0')};
`;
-const Author = styled(P)`
- color: ${brandColors.pinky[500]};
- cursor: pointer;
-`;
-
export default ProjectHeader;
From 343c62bd3899a5422945d772bee3fea5df19fcff Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 28 Mar 2023 15:59:41 +0330
Subject: [PATCH 063/167] added cursor pointer
---
src/components/modals/UploadProfilePicModal/PfpItem.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/components/modals/UploadProfilePicModal/PfpItem.tsx b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
index bfb0df2870..ade0ee66f8 100644
--- a/src/components/modals/UploadProfilePicModal/PfpItem.tsx
+++ b/src/components/modals/UploadProfilePicModal/PfpItem.tsx
@@ -50,6 +50,7 @@ const Container = styled.div<{ isSelected: boolean }>`
border: ${props =>
props.isSelected ? `3px solid ${brandColors.pinky[400]}` : 'none'};
position: relative;
+ cursor: pointer;
`;
const ImageContainer = styled(Image)`
From 7af293a809a525c40f99898797d4c04fff727c0b Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 28 Mar 2023 17:35:54 +0330
Subject: [PATCH 064/167] used css instead of js
---
.../UploadProfilePicModal.tsx | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 1ac3871f2d..98ba75b48f 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -33,7 +33,6 @@ import { useAppDispatch } from '@/features/hooks';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import config from '@/configuration';
import Routes from '@/lib/constants/Routes';
-import useDetectDevice from '@/hooks/useDetectDevice';
interface IUploadProfilePicModal extends IModal {
user: IUser;
@@ -59,7 +58,7 @@ const UploadProfilePicModal = ({
const dispatch = useAppDispatch();
const { account } = useWeb3React();
const [updateUser] = useMutation(UPDATE_USER);
- const { isMobile } = useDetectDevice();
+
const { url, onDelete } = useUploadProps;
console.log('user', user);
@@ -226,7 +225,7 @@ const UploadProfilePicModal = ({
)}
-
@@ -245,8 +244,7 @@ const UploadProfilePicModal = ({
setSelectedPFP(undefined);
}}
/>
-
- {isMobile &&
}
+
) : (
@@ -356,3 +354,11 @@ const MintLink = styled(Link)`
max-width: fit-content;
color: ${brandColors.pinky[500]};
`;
+
+const NFTsButtonsContainer = styled(Flex)`
+ margin-bottom: 60px;
+
+ ${mediaQueries.tablet} {
+ margin-bottom: 0;
+ }
+`;
From 275913b35a5ef75822add4f07801391116e64600 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 28 Mar 2023 17:42:04 +0330
Subject: [PATCH 065/167] removed logs
---
.../UploadProfilePicModal/UploadProfilePicModal.tsx | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 98ba75b48f..087344c8ab 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -61,33 +61,26 @@ const UploadProfilePicModal = ({
const { url, onDelete } = useUploadProps;
- console.log('user', user);
- console.log('dataaaaa', pfpData);
- console.log('dataaaaa Selected', selectedPFP);
-
const nftUrl = selectedPFP?.imageIpfs
? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
: undefined;
- console.log('nftUrl', nftUrl);
const handleAvatar = () => {
if (activeTab === 1) {
return url;
} else {
- console.log('Nft URL', nftUrl);
return nftUrl;
}
};
const onSaveAvatar = async () => {
try {
- console.log('Saving');
const { data: response } = await updateUser({
variables: {
avatar: handleAvatar(),
},
});
- console.log('Res', response);
+
if (response.updateUser) {
account && dispatch(fetchUserByAddress(account));
gToast('Profile Photo updated.', {
@@ -103,7 +96,6 @@ const UploadProfilePicModal = ({
type: ToastType.DANGER,
title: error.message,
});
- console.log(error);
captureException(error, {
tags: {
section: 'onSaveAvatar',
From 8de8b0d23326f05ec790ed94b0fb592c451a3f88 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Wed, 29 Mar 2023 12:40:00 +0330
Subject: [PATCH 066/167] update Heading styles
---
src/components/views/nft/overview/SayHello.tsx | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/components/views/nft/overview/SayHello.tsx b/src/components/views/nft/overview/SayHello.tsx
index 1ab0b55c42..ad7c8376ac 100644
--- a/src/components/views/nft/overview/SayHello.tsx
+++ b/src/components/views/nft/overview/SayHello.tsx
@@ -1,6 +1,12 @@
import React from 'react';
import styled from 'styled-components';
-import { ButtonLink, Container, H1, QuoteText } from '@giveth/ui-design-system';
+import {
+ brandColors,
+ ButtonLink,
+ Container,
+ D3,
+ QuoteText,
+} from '@giveth/ui-design-system';
import Link from 'next/link';
import Image from 'next/image';
import { Flex } from '@/components/styled-components/Flex';
@@ -14,9 +20,8 @@ const SayHelloSection = () => {
-
- Say Hello to...
The Givers{' '}
-
+ Say Hello to...
+ The Givers
Show your support for the Future of Giving and
unlock your unique Giveth flair by minting one of
@@ -90,4 +95,8 @@ const CustomImage = styled(Image)`
}
`;
+const ColoredD3 = styled(D3)`
+ color: ${brandColors.deep[100]};
+`;
+
export default SayHelloSection;
From ce136f2cb51bb8798ccb6f07c3be21ce49c804dd Mon Sep 17 00:00:00 2001
From: Cherik
Date: Wed, 29 Mar 2023 14:42:32 +0330
Subject: [PATCH 067/167] fix build issue
---
.../modals/UploadProfilePicModal/UploadProfilePicModal.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 087344c8ab..1b6b80535b 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -173,7 +173,7 @@ const UploadProfilePicModal = ({
Your Unique Giveth’s PFP Artwork
-
+
{pfpData?.map(pfp => (
setSelectedPFP(pfp)}
From 0e33a1a914c4fb224f7c7008179f20e9ef268f74 Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 2 Apr 2023 12:27:46 +0330
Subject: [PATCH 068/167] Fixed padding
---
src/components/views/nft/overview/SayHello.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/views/nft/overview/SayHello.tsx b/src/components/views/nft/overview/SayHello.tsx
index ad7c8376ac..0e262437db 100644
--- a/src/components/views/nft/overview/SayHello.tsx
+++ b/src/components/views/nft/overview/SayHello.tsx
@@ -60,7 +60,7 @@ const SayHelloSection = () => {
};
const OverviewContainer = styled.div`
- padding-top: 200px;
+ padding-top: 100px;
position: relative;
::before {
content: ' ';
From 99e3c853fbc3c3f2b8df2bab8544fc86373ebdfc Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 2 Apr 2023 12:29:08 +0330
Subject: [PATCH 069/167] Fix padding
---
src/components/views/nft/mint/NFTMintIndex.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/views/nft/mint/NFTMintIndex.tsx b/src/components/views/nft/mint/NFTMintIndex.tsx
index 251309ca84..131e5bff8f 100644
--- a/src/components/views/nft/mint/NFTMintIndex.tsx
+++ b/src/components/views/nft/mint/NFTMintIndex.tsx
@@ -194,7 +194,7 @@ const MintViewContainer = styled.div`
`;
const MintContainer = styled(Container)`
- padding-top: 200px;
+ padding-top: 100px;
position: relative;
`;
From 3d43c3fb7d587fb29c0cd8b9c1aecba06884ef1d Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Sun, 2 Apr 2023 12:32:46 +0330
Subject: [PATCH 070/167] update typography
---
src/components/views/nft/mint/NFTMintIndex.tsx | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/components/views/nft/mint/NFTMintIndex.tsx b/src/components/views/nft/mint/NFTMintIndex.tsx
index 131e5bff8f..2e70c978d8 100644
--- a/src/components/views/nft/mint/NFTMintIndex.tsx
+++ b/src/components/views/nft/mint/NFTMintIndex.tsx
@@ -5,7 +5,7 @@ import {
Button,
ButtonLink,
ButtonText,
- H1,
+ D3,
Lead,
mediaQueries,
} from '@giveth/ui-design-system';
@@ -22,8 +22,8 @@ import { Flex } from '@/components/styled-components/Flex';
export const NFTMintIndex = () => {
// const [showEligibilityModal, setShowEligibilityModal] = useState(false);
const { formatMessage } = useIntl();
- const { account, library, chainId } = useWeb3React();
- const { step, setStep, qty, tx: txHash, setIsEligible } = usePFPMintData();
+ const { account } = useWeb3React();
+ const { step, setStep, qty, tx: txHash } = usePFPMintData();
// useEffect(() => {
// const checkAddress = async () => {
@@ -198,7 +198,7 @@ const MintContainer = styled(Container)`
position: relative;
`;
-const Title = styled(H1)`
+const Title = styled(D3)`
font-weight: 700;
color: ${brandColors.deep[100]};
margin-bottom: 22px;
From 835a4dddb974f3b318fda69883c37807325a2e2d Mon Sep 17 00:00:00 2001
From: Cherik
Date: Sun, 2 Apr 2023 19:45:27 +0330
Subject: [PATCH 071/167] change opensea to rarible
---
src/config/development.ts | 2 +-
src/config/production.ts | 2 +-
src/types/config.ts | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/config/development.ts b/src/config/development.ts
index fabf85f563..f30e8b78c6 100644
--- a/src/config/development.ts
+++ b/src/config/development.ts
@@ -36,7 +36,7 @@ const config: EnvConfig = {
GARDEN_LINK:
'https://gardens-staging.1hive.org/#/xdai/garden/0x16388d99199a74810fc572049b3d4d657e7d5deb',
- OPENSEA_ADDRESS: 'https://testnets.opensea.io/',
+ RARIBLE_ADDRESS: 'https://testnet.rarible.com/',
MAINNET_CONFIG: {
...networksParams[5],
DAI_CONTRACT_ADDRESS: '0xdc31Ee1784292379Fbb2964b3B9C4124D8F89C60',
diff --git a/src/config/production.ts b/src/config/production.ts
index 525eeb15c2..c00e344b04 100644
--- a/src/config/production.ts
+++ b/src/config/production.ts
@@ -37,7 +37,7 @@ const config: EnvConfig = {
GARDEN_LINK:
'https://gardens.1hive.org/#/xdai/garden/0xb25f0ee2d26461e2b5b3d3ddafe197a0da677b98',
- OPENSEA_ADDRESS: 'https://rarible.com/user/',
+ RARIBLE_ADDRESS: 'https://rarible.com/',
MAINNET_CONFIG: {
...networksParams[1],
diff --git a/src/types/config.ts b/src/types/config.ts
index 63d7bd0257..4a8dd4731b 100644
--- a/src/types/config.ts
+++ b/src/types/config.ts
@@ -174,7 +174,7 @@ export interface EnvConfig {
BACKEND_LINK: string;
FRONTEND_LINK: string;
MICROSERVICES: MicroservicesConfig;
- OPENSEA_ADDRESS: string;
+ RARIBLE_ADDRESS: string;
}
export interface GlobalConfig extends EnvConfig {
From 588c42c8dd6781f4a1b78677ac9fdc70ba238985 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Sun, 2 Apr 2023 19:46:00 +0330
Subject: [PATCH 072/167] fix nfts link
---
.../UploadProfilePicModal/UploadProfilePicModal.tsx | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 1b6b80535b..d278beb4f5 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -200,18 +200,17 @@ const UploadProfilePicModal = ({
- View on OpenSea{' '}
+ View on Rarible{' '}
From 0fac3c87d80433d020abf20190856a3df2691c92 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Sun, 2 Apr 2023 19:46:18 +0330
Subject: [PATCH 073/167] add rarible to cspell
---
.vscode/settings.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 2cd9ce85af..36d87f7fe8 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -18,6 +18,7 @@
"SUSHISWAP",
"swiper",
"texty",
- "xdai"
+ "xdai",
+ "rarible"
]
}
From 9881f4ee4f7d432c4b8f72e0a235c7c1a7c6ca85 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Sun, 2 Apr 2023 19:50:01 +0330
Subject: [PATCH 074/167] fix use nfts link
---
src/components/views/nft/mint/NFTMintIndex.tsx | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/components/views/nft/mint/NFTMintIndex.tsx b/src/components/views/nft/mint/NFTMintIndex.tsx
index 8096391038..a16b4eb073 100644
--- a/src/components/views/nft/mint/NFTMintIndex.tsx
+++ b/src/components/views/nft/mint/NFTMintIndex.tsx
@@ -99,13 +99,18 @@ export const NFTMintIndex = () => {
)}
-
+
View on Rarible
-
+
Date: Sun, 2 Apr 2023 23:35:18 +0330
Subject: [PATCH 075/167] separate UploadSelectProfilePic from its modal
---
src/components/UploadSelectProfilePic.tsx | 334 +++++++++++++++++
.../UploadProfilePicModal.tsx | 338 +-----------------
2 files changed, 340 insertions(+), 332 deletions(-)
create mode 100644 src/components/UploadSelectProfilePic.tsx
diff --git a/src/components/UploadSelectProfilePic.tsx b/src/components/UploadSelectProfilePic.tsx
new file mode 100644
index 0000000000..8584c15895
--- /dev/null
+++ b/src/components/UploadSelectProfilePic.tsx
@@ -0,0 +1,334 @@
+import {
+ brandColors,
+ Button,
+ H5,
+ H6,
+ IconExternalLink16,
+ IconImage32,
+ mediaQueries,
+ neutralColors,
+ P,
+} from '@giveth/ui-design-system';
+import { FC, useEffect, useState } from 'react';
+import styled from 'styled-components';
+import { useIntl } from 'react-intl';
+import { useMutation } from '@apollo/client';
+import { captureException } from '@sentry/nextjs';
+import { useWeb3React } from '@web3-react/core';
+import Link from 'next/link';
+import useUpload from '@/hooks/useUpload';
+import { UPDATE_USER } from '@/apollo/gql/gqlUser';
+import { gToast, ToastType } from '@/components/toasts';
+import { fetchUserByAddress } from '@/features/user/user.thunks';
+import { useAppDispatch } from '@/features/hooks';
+import { convertIPFSToHTTPS } from '@/helpers/blockchain';
+import config from '@/configuration';
+import Routes from '@/lib/constants/Routes';
+import ImageUploader from './ImageUploader';
+import PfpItem from './modals/UploadProfilePicModal/PfpItem';
+import { Flex, FlexCenter } from './styled-components/Flex';
+import { TabItem } from './styled-components/Tabs';
+import { IUserNFT } from './views/userProfile/UserProfile.view';
+import { IUser } from '@/apollo/types/types';
+
+const tabs = [
+ { id: 1, title: 'Upload Image' },
+ { id: 2, title: 'My NFTs' },
+];
+
+export interface IUploadSelectProfilePic {
+ user: IUser;
+ pfpData?: IUserNFT[];
+}
+
+export const UploadSelectProfilePic: FC = ({
+ user,
+ pfpData,
+}) => {
+ const useUploadProps = useUpload();
+ const { formatMessage } = useIntl();
+ const [activeTab, setActiveTab] = useState(1);
+ const [selectedPFP, setSelectedPFP] = useState();
+
+ const dispatch = useAppDispatch();
+ const { account } = useWeb3React();
+ const [updateUser] = useMutation(UPDATE_USER);
+
+ const { url, onDelete } = useUploadProps;
+
+ const nftUrl = selectedPFP?.imageIpfs
+ ? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
+ : undefined;
+
+ const handleAvatar = () => {
+ if (activeTab === 1) {
+ return url;
+ } else {
+ return nftUrl;
+ }
+ };
+
+ const onSaveAvatar = async () => {
+ try {
+ const { data: response } = await updateUser({
+ variables: {
+ avatar: handleAvatar(),
+ },
+ });
+
+ if (response.updateUser) {
+ account && dispatch(fetchUserByAddress(account));
+ gToast('Profile Photo updated.', {
+ type: ToastType.SUCCESS,
+ title: 'Success',
+ });
+ onDelete();
+ } else {
+ throw 'updateUser false';
+ }
+ } catch (error: any) {
+ gToast('Failed to update your information. Please try again.', {
+ type: ToastType.DANGER,
+ title: error.message,
+ });
+ captureException(error, {
+ tags: {
+ section: 'onSaveAvatar',
+ },
+ });
+ }
+ };
+
+ useEffect(() => {
+ const compareHashes = () => {
+ const regex = /(\d+)\.\w+$/;
+ const selectedAvatarHash = user.avatar?.match(regex)?.[0] ?? null;
+ if (pfpData && pfpData.length > 0) {
+ pfpData.find(pfp => {
+ const pfpHash =
+ pfp.imageIpfs.match(regex)?.[0] ?? undefined;
+ if (pfpHash === selectedAvatarHash) {
+ setSelectedPFP(pfp);
+ }
+ });
+ }
+ };
+ compareHashes();
+ }, []);
+ return (
+
+
+ {tabs.map(i => (
+ setActiveTab(i.id)}
+ className={activeTab === i.id ? 'active' : ''}
+ key={i.id}
+ active={activeTab === i.id}
+ >
+ {i.title}
+
+ ))}
+
+ {activeTab === 1 && (
+
+
+
+
+ {
+ onDelete();
+ }}
+ />
+
+
+ )}
+ {activeTab === 2 && (
+ <>
+ {pfpData && pfpData.length > 0 ? (
+
+
+ Your Unique Giveth’s PFP Artwork
+
+
+ {pfpData?.map(pfp => (
+ setSelectedPFP(pfp)}
+ image={pfp.imageIpfs}
+ key={pfp.tokenId}
+ isSelected={
+ pfp.tokenId === selectedPFP?.tokenId
+ }
+ id={pfp.tokenId}
+ />
+ ))}
+
+ {selectedPFP && (
+
+
+
+ The The Givers Collection #
+ {selectedPFP.tokenId}
+
+
+ Short information/summary about the
+ selected PFP
+
+
+ View on OpenSea{' '}
+
+
+
+
+ )}
+
+
+ {
+ setSelectedPFP(undefined);
+ }}
+ />
+
+
+ ) : (
+
+
+ Your Unique Giveth’s PFP Artwork
+
+
+
+
+
+ Sorry!!
+
+ This wallet address does not have a
+ unique Giveth’s NFT Yet.
+
+
+
+ Mint{' '}
+
+ yours now on the NFT minter page.
+
+
+
+
+
+
+
+
+
+
+
+ )}
+ >
+ )}
+
+ );
+};
+
+const Wrapper = styled.div`
+ padding: 24px;
+ ${mediaQueries.laptopL} {
+ width: 1100px;
+ }
+`;
+
+const TextButton = styled(Button)<{ color?: string }>`
+ color: ${props => props.color};
+ text-transform: uppercase;
+
+ &:hover {
+ background-color: transparent;
+ color: ${props => props.color};
+ }
+`;
+
+const CustomH5 = styled(H5)`
+ text-align: left;
+ margin-top: 16px;
+`;
+
+const NoNFTContainer = styled(FlexCenter)`
+ flex-direction: column;
+ border: 1px dotted ${neutralColors.gray[400]};
+ margin: 24px 0 16px 0;
+ padding: 64px 20px;
+ color: ${brandColors.deep[500]};
+ img {
+ margin: 0 0 30px 0;
+ }
+ span {
+ cursor: pointer;
+ color: ${brandColors.pinky[500]};
+ }
+`;
+
+const SelectedPFPContainer = styled.div`
+ background-color: ${neutralColors.gray[200]};
+ border-left: 6px solid ${brandColors.pinky[500]};
+ margin-top: 8px;
+ padding: 16px 24px;
+ border-radius: 8px;
+ text-align: left;
+`;
+
+const CustomLink = styled.a`
+ color: ${brandColors.pinky[500]};
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ max-width: fit-content;
+`;
+
+const MintLink = styled(Link)`
+ max-width: fit-content;
+ color: ${brandColors.pinky[500]};
+`;
+
+const NFTsButtonsContainer = styled(Flex)`
+ margin-bottom: 60px;
+
+ ${mediaQueries.tablet} {
+ margin-bottom: 0;
+ }
+`;
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 1b6b80535b..44f3fc87ab 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -1,125 +1,19 @@
-import {
- brandColors,
- Button,
- H5,
- H6,
- IconExternalLink16,
- IconImage32,
- mediaQueries,
- neutralColors,
- P,
-} from '@giveth/ui-design-system';
-import { useEffect, useState } from 'react';
-import styled from 'styled-components';
-import { useIntl } from 'react-intl';
-import { useMutation } from '@apollo/client';
-import { captureException } from '@sentry/nextjs';
-import { useWeb3React } from '@web3-react/core';
-import Link from 'next/link';
-import useUpload from '@/hooks/useUpload';
-import ImageUploader from '../../ImageUploader';
-import { Flex, FlexCenter } from '../../styled-components/Flex';
import { Modal } from '../Modal';
-import { IUser } from '@/apollo/types/types';
import { IModal } from '@/types/common';
import { useModalAnimation } from '@/hooks/useModalAnimation';
-import { TabItem } from '../../styled-components/Tabs';
-import { IUserNFT } from '../../views/userProfile/UserProfile.view';
-import PfpItem from './PfpItem';
-import { UPDATE_USER } from '@/apollo/gql/gqlUser';
-import { gToast, ToastType } from '@/components/toasts';
-import { fetchUserByAddress } from '@/features/user/user.thunks';
-import { useAppDispatch } from '@/features/hooks';
-import { convertIPFSToHTTPS } from '@/helpers/blockchain';
-import config from '@/configuration';
-import Routes from '@/lib/constants/Routes';
-
-interface IUploadProfilePicModal extends IModal {
- user: IUser;
- pfpData?: IUserNFT[];
-}
+import {
+ IUploadSelectProfilePic,
+ UploadSelectProfilePic,
+} from '@/components/UploadSelectProfilePic';
-const tabs = [
- { id: 1, title: 'Upload Image' },
- { id: 2, title: 'My NFTs' },
-];
+interface IUploadProfilePicModal extends IModal, IUploadSelectProfilePic {}
const UploadProfilePicModal = ({
setShowModal,
user,
pfpData,
}: IUploadProfilePicModal) => {
- const useUploadProps = useUpload();
- const { formatMessage } = useIntl();
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
- const [activeTab, setActiveTab] = useState(1);
- const [selectedPFP, setSelectedPFP] = useState();
-
- const dispatch = useAppDispatch();
- const { account } = useWeb3React();
- const [updateUser] = useMutation(UPDATE_USER);
-
- const { url, onDelete } = useUploadProps;
-
- const nftUrl = selectedPFP?.imageIpfs
- ? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
- : undefined;
-
- const handleAvatar = () => {
- if (activeTab === 1) {
- return url;
- } else {
- return nftUrl;
- }
- };
-
- const onSaveAvatar = async () => {
- try {
- const { data: response } = await updateUser({
- variables: {
- avatar: handleAvatar(),
- },
- });
-
- if (response.updateUser) {
- account && dispatch(fetchUserByAddress(account));
- gToast('Profile Photo updated.', {
- type: ToastType.SUCCESS,
- title: 'Success',
- });
- onDelete();
- } else {
- throw 'updateUser false';
- }
- } catch (error: any) {
- gToast('Failed to update your information. Please try again.', {
- type: ToastType.DANGER,
- title: error.message,
- });
- captureException(error, {
- tags: {
- section: 'onSaveAvatar',
- },
- });
- }
- };
-
- useEffect(() => {
- const compareHashes = () => {
- const regex = /(\d+)\.\w+$/;
- const selectedAvatarHash = user.avatar?.match(regex)?.[0] ?? null;
- if (pfpData && pfpData.length > 0) {
- pfpData.find(pfp => {
- const pfpHash =
- pfp.imageIpfs.match(regex)?.[0] ?? undefined;
- if (pfpHash === selectedAvatarHash) {
- setSelectedPFP(pfp);
- }
- });
- }
- };
- compareHashes();
- }, []);
return (
-
-
- {tabs.map(i => (
- setActiveTab(i.id)}
- className={activeTab === i.id ? 'active' : ''}
- key={i.id}
- active={activeTab === i.id}
- >
- {i.title}
-
- ))}
-
- {activeTab === 1 && (
-
-
-
-
- {
- onDelete();
- }}
- />
-
-
- )}
- {activeTab === 2 && (
- <>
- {pfpData && pfpData.length > 0 ? (
-
-
- Your Unique Giveth’s PFP Artwork
-
-
- {pfpData?.map(pfp => (
- setSelectedPFP(pfp)}
- image={pfp.imageIpfs}
- key={pfp.tokenId}
- isSelected={
- pfp.tokenId ===
- selectedPFP?.tokenId
- }
- id={pfp.tokenId}
- />
- ))}
-
- {selectedPFP && (
-
-
-
- The The Givers Collection #
- {selectedPFP.tokenId}
-
-
- Short information/summary about
- the selected PFP
-
-
- View on OpenSea{' '}
-
-
-
-
- )}
-
-
- {
- setSelectedPFP(undefined);
- }}
- />
-
-
- ) : (
-
-
- Your Unique Giveth’s PFP Artwork
-
-
-
-
-
- Sorry!!
-
- This wallet address does not have a
- unique Giveth’s NFT Yet.
-
-
-
- Mint{' '}
-
- yours now on the NFT minter page.
-
-
-
-
-
-
-
-
-
-
-
- )}
- >
- )}
-
+
);
};
export default UploadProfilePicModal;
-
-const Wrapper = styled.div`
- padding: 24px;
- ${mediaQueries.laptopL} {
- width: 1100px;
- }
-`;
-
-const TextButton = styled(Button)<{ color?: string }>`
- color: ${props => props.color};
- text-transform: uppercase;
-
- &:hover {
- background-color: transparent;
- color: ${props => props.color};
- }
-`;
-
-const CustomH5 = styled(H5)`
- text-align: left;
- margin-top: 16px;
-`;
-
-const NoNFTContainer = styled(FlexCenter)`
- flex-direction: column;
- border: 1px dotted ${neutralColors.gray[400]};
- margin: 24px 0 16px 0;
- padding: 64px 20px;
- color: ${brandColors.deep[500]};
- img {
- margin: 0 0 30px 0;
- }
- span {
- cursor: pointer;
- color: ${brandColors.pinky[500]};
- }
-`;
-
-const SelectedPFPContainer = styled.div`
- background-color: ${neutralColors.gray[200]};
- border-left: 6px solid ${brandColors.pinky[500]};
- margin-top: 8px;
- padding: 16px 24px;
- border-radius: 8px;
- text-align: left;
-`;
-
-const CustomLink = styled.a`
- color: ${brandColors.pinky[500]};
- display: flex;
- align-items: center;
- gap: 8px;
- max-width: fit-content;
-`;
-
-const MintLink = styled(Link)`
- max-width: fit-content;
- color: ${brandColors.pinky[500]};
-`;
-
-const NFTsButtonsContainer = styled(Flex)`
- margin-bottom: 60px;
-
- ${mediaQueries.tablet} {
- margin-bottom: 0;
- }
-`;
From 968baf2d3a0efb56a08303f95663067b43f35603 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Sun, 2 Apr 2023 23:51:21 +0330
Subject: [PATCH 076/167] change tokenId type to number
---
src/apollo/types/types.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/apollo/types/types.ts b/src/apollo/types/types.ts
index 0e6191092f..045e605055 100644
--- a/src/apollo/types/types.ts
+++ b/src/apollo/types/types.ts
@@ -363,7 +363,7 @@ export interface IGiverPFPToken {
user: {
id: string;
};
- tokenId: string;
+ tokenId: number;
imageIpfs: string;
}
From 6f90ffebcd0d2e322d2580c886353b7636c9e5f2 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Sun, 2 Apr 2023 23:52:08 +0330
Subject: [PATCH 077/167] move fetching pfp to upload photo modal
---
src/components/UploadSelectProfilePic.tsx | 56 +++++++++++++++----
.../UploadProfilePicModal.tsx | 3 +-
.../views/userProfile/UserProfile.view.tsx | 37 +-----------
3 files changed, 47 insertions(+), 49 deletions(-)
diff --git a/src/components/UploadSelectProfilePic.tsx b/src/components/UploadSelectProfilePic.tsx
index 8584c15895..a4880b2b70 100644
--- a/src/components/UploadSelectProfilePic.tsx
+++ b/src/components/UploadSelectProfilePic.tsx
@@ -28,34 +28,67 @@ import ImageUploader from './ImageUploader';
import PfpItem from './modals/UploadProfilePicModal/PfpItem';
import { Flex, FlexCenter } from './styled-components/Flex';
import { TabItem } from './styled-components/Tabs';
-import { IUserNFT } from './views/userProfile/UserProfile.view';
-import { IUser } from '@/apollo/types/types';
+import { IGiverPFPToken, IUser } from '@/apollo/types/types';
+import { gqlRequest } from '@/helpers/requests';
+import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
+
+enum EProfilePicTab {
+ LOADING,
+ UPLOAD,
+ PFP,
+}
const tabs = [
- { id: 1, title: 'Upload Image' },
- { id: 2, title: 'My NFTs' },
+ { id: EProfilePicTab.LOADING, title: 'Upload Image' },
+ { id: EProfilePicTab.PFP, title: 'My NFTs' },
];
export interface IUploadSelectProfilePic {
user: IUser;
- pfpData?: IUserNFT[];
}
export const UploadSelectProfilePic: FC = ({
user,
- pfpData,
}) => {
const useUploadProps = useUpload();
const { formatMessage } = useIntl();
- const [activeTab, setActiveTab] = useState(1);
- const [selectedPFP, setSelectedPFP] = useState();
+ const [activeTab, setActiveTab] = useState(EProfilePicTab.LOADING);
+ const [selectedPFP, setSelectedPFP] = useState();
+ const [pfpData, setPfpData] = useState();
const dispatch = useAppDispatch();
const { account } = useWeb3React();
const [updateUser] = useMutation(UPDATE_USER);
-
const { url, onDelete } = useUploadProps;
+ useEffect(() => {
+ const fetchPFPInfo = async (walletAddress: string) => {
+ try {
+ const query = buildUsersPfpInfoQuery([walletAddress]);
+ const { data } = await gqlRequest(
+ config.MAINNET_CONFIG.subgraphAddress,
+ false,
+ query,
+ );
+ if (data[`user_${walletAddress}`]) {
+ console.log(
+ 'data[`user_${walletAddress}`]',
+ data[`user_${walletAddress}`],
+ user,
+ );
+ setPfpData(data[`user_${walletAddress}`]);
+ }
+ console.log('data', data);
+ } catch (error) {
+ console.error('error', error);
+ }
+ };
+ if (user?.walletAddress) {
+ fetchPFPInfo(user.walletAddress);
+ }
+ }, [user, dispatch]);
+ console.log('pfpData', pfpData);
+
const nftUrl = selectedPFP?.imageIpfs
? convertIPFSToHTTPS(selectedPFP?.imageIpfs)
: undefined;
@@ -115,6 +148,7 @@ export const UploadSelectProfilePic: FC = ({
};
compareHashes();
}, []);
+
return (
@@ -129,7 +163,7 @@ export const UploadSelectProfilePic: FC = ({
))}
- {activeTab === 1 && (
+ {activeTab === EProfilePicTab.UPLOAD && (
@@ -151,7 +185,7 @@ export const UploadSelectProfilePic: FC = ({
)}
- {activeTab === 2 && (
+ {activeTab === EProfilePicTab.PFP && (
<>
{pfpData && pfpData.length > 0 ? (
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 44f3fc87ab..50b9904a39 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -11,7 +11,6 @@ interface IUploadProfilePicModal extends IModal, IUploadSelectProfilePic {}
const UploadProfilePicModal = ({
setShowModal,
user,
- pfpData,
}: IUploadProfilePicModal) => {
const { isAnimating, closeModal } = useModalAnimation(setShowModal);
@@ -22,7 +21,7 @@ const UploadProfilePicModal = ({
headerTitle='Upload Your Images or NFTs'
headerTitlePosition='left'
>
-
+
);
};
diff --git a/src/components/views/userProfile/UserProfile.view.tsx b/src/components/views/userProfile/UserProfile.view.tsx
index 9065cacd1d..42d1793e61 100644
--- a/src/components/views/userProfile/UserProfile.view.tsx
+++ b/src/components/views/userProfile/UserProfile.view.tsx
@@ -27,9 +27,6 @@ import ExternalLink from '@/components/ExternalLink';
import IncompleteProfileToast from '@/components/views/userProfile/IncompleteProfileToast';
import { useAppDispatch, useAppSelector } from '@/features/hooks';
import { setShowSignWithWallet } from '@/features/modal/modal.slice';
-import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
-import { gqlRequest } from '@/helpers/requests';
-import config from '@/configuration';
import UploadProfilePicModal from '@/components/modals/UploadProfilePicModal/UploadProfilePicModal';
export enum EOrderBy {
@@ -49,12 +46,6 @@ export interface IUserProfileView {
myAccount?: boolean;
}
-export interface IUserNFT {
- id: string;
- imageIpfs: string;
- tokenId: number;
-}
-
const UserProfileView: FC = ({ myAccount, user }) => {
const dispatch = useAppDispatch();
const { isSignedIn } = useAppSelector(state => state.user);
@@ -64,41 +55,16 @@ const UserProfileView: FC = ({ myAccount, user }) => {
const [showModal, setShowModal] = useState(false); // follow this state to refresh user content on screen
const [showUploadProfileModal, setShowUploadProfileModal] = useState(false);
- const [pfpData, setPfpData] = useState();
const [showIncompleteWarning, setShowIncompleteWarning] = useState(true);
const showCompleteProfile =
!isUserRegistered(user) && showIncompleteWarning && myAccount;
useEffect(() => {
- const fetchPFPInfo = async (walletAddress: string) => {
- try {
- const query = buildUsersPfpInfoQuery([walletAddress]);
- const { data } = await gqlRequest(
- config.MAINNET_CONFIG.subgraphAddress,
- false,
- query,
- );
- if (data[`user_${walletAddress}`]) {
- console.log(
- 'data[`user_${walletAddress}`]',
- data[`user_${walletAddress}`],
- user,
- );
- }
- console.log('data', data);
- setPfpData(data[`user_${walletAddress}`]);
- } catch (error) {
- console.error('error', error);
- }
- };
if (myAccount && !isSignedIn) {
dispatch(setShowSignWithWallet(true));
}
- if (user?.walletAddress) {
- fetchPFPInfo(user.walletAddress);
- }
- }, [user, isSignedIn, myAccount, dispatch]);
+ }, [dispatch, isSignedIn, myAccount]);
if (myAccount && !isSignedIn)
return (
@@ -175,7 +141,6 @@ const UserProfileView: FC = ({ myAccount, user }) => {
)}
>
From 7609e2badd9cdbf77aff97f5c6c250e956da8b8e Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 3 Apr 2023 00:11:04 +0330
Subject: [PATCH 078/167] fix tab states
---
src/components/UploadSelectProfilePic.tsx | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/components/UploadSelectProfilePic.tsx b/src/components/UploadSelectProfilePic.tsx
index a4880b2b70..ed2e93a1f3 100644
--- a/src/components/UploadSelectProfilePic.tsx
+++ b/src/components/UploadSelectProfilePic.tsx
@@ -39,7 +39,7 @@ enum EProfilePicTab {
}
const tabs = [
- { id: EProfilePicTab.LOADING, title: 'Upload Image' },
+ { id: EProfilePicTab.UPLOAD, title: 'Upload Image' },
{ id: EProfilePicTab.PFP, title: 'My NFTs' },
];
@@ -70,17 +70,23 @@ export const UploadSelectProfilePic: FC = ({
false,
query,
);
- if (data[`user_${walletAddress}`]) {
+ if (
+ data[`user_${walletAddress}`] &&
+ data[`user_${walletAddress}`].length > 0
+ ) {
console.log(
'data[`user_${walletAddress}`]',
data[`user_${walletAddress}`],
user,
);
setPfpData(data[`user_${walletAddress}`]);
+ setActiveTab(EProfilePicTab.PFP);
+ } else {
+ setActiveTab(EProfilePicTab.UPLOAD);
}
- console.log('data', data);
} catch (error) {
console.error('error', error);
+ setActiveTab(EProfilePicTab.UPLOAD);
}
};
if (user?.walletAddress) {
@@ -163,6 +169,7 @@ export const UploadSelectProfilePic: FC = ({
))}
+ {activeTab === EProfilePicTab.LOADING && }
{activeTab === EProfilePicTab.UPLOAD && (
From 1881bc0719540843f8374e2802f80719f5380e41 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 3 Apr 2023 13:40:59 +0330
Subject: [PATCH 079/167] rename to SetProfilePic
---
.../UploadProfilePicModal.tsx | 10 +++++-----
.../SetProfilePic.tsx} | 17 ++++++++---------
.../views/onboarding/Onboarding.view.tsx | 9 ++++-----
3 files changed, 17 insertions(+), 19 deletions(-)
rename src/components/{UploadSelectProfilePic.tsx => setProfilePic/SetProfilePic.tsx} (95%)
diff --git a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
index 50b9904a39..c1540ba209 100644
--- a/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
+++ b/src/components/modals/UploadProfilePicModal/UploadProfilePicModal.tsx
@@ -2,11 +2,11 @@ import { Modal } from '../Modal';
import { IModal } from '@/types/common';
import { useModalAnimation } from '@/hooks/useModalAnimation';
import {
- IUploadSelectProfilePic,
- UploadSelectProfilePic,
-} from '@/components/UploadSelectProfilePic';
+ ISetProfilePic,
+ SetProfilePic,
+} from '@/components/setProfilePic/SetProfilePic';
-interface IUploadProfilePicModal extends IModal, IUploadSelectProfilePic {}
+interface IUploadProfilePicModal extends IModal, ISetProfilePic {}
const UploadProfilePicModal = ({
setShowModal,
@@ -21,7 +21,7 @@ const UploadProfilePicModal = ({
headerTitle='Upload Your Images or NFTs'
headerTitlePosition='left'
>
-
+
);
};
diff --git a/src/components/UploadSelectProfilePic.tsx b/src/components/setProfilePic/SetProfilePic.tsx
similarity index 95%
rename from src/components/UploadSelectProfilePic.tsx
rename to src/components/setProfilePic/SetProfilePic.tsx
index ed2e93a1f3..a6b0af8c34 100644
--- a/src/components/UploadSelectProfilePic.tsx
+++ b/src/components/setProfilePic/SetProfilePic.tsx
@@ -24,13 +24,14 @@ import { useAppDispatch } from '@/features/hooks';
import { convertIPFSToHTTPS } from '@/helpers/blockchain';
import config from '@/configuration';
import Routes from '@/lib/constants/Routes';
-import ImageUploader from './ImageUploader';
-import PfpItem from './modals/UploadProfilePicModal/PfpItem';
-import { Flex, FlexCenter } from './styled-components/Flex';
-import { TabItem } from './styled-components/Tabs';
+import ImageUploader from '../ImageUploader';
+import PfpItem from '../modals/UploadProfilePicModal/PfpItem';
+import { Flex, FlexCenter } from '../styled-components/Flex';
+import { TabItem } from '../styled-components/Tabs';
import { IGiverPFPToken, IUser } from '@/apollo/types/types';
import { gqlRequest } from '@/helpers/requests';
import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
+import Spinner from '../Spinner';
enum EProfilePicTab {
LOADING,
@@ -43,13 +44,11 @@ const tabs = [
{ id: EProfilePicTab.PFP, title: 'My NFTs' },
];
-export interface IUploadSelectProfilePic {
+export interface ISetProfilePic {
user: IUser;
}
-export const UploadSelectProfilePic: FC = ({
- user,
-}) => {
+export const SetProfilePic: FC = ({ user }) => {
const useUploadProps = useUpload();
const { formatMessage } = useIntl();
const [activeTab, setActiveTab] = useState(EProfilePicTab.LOADING);
@@ -169,7 +168,7 @@ export const UploadSelectProfilePic: FC = ({
))}
- {activeTab === EProfilePicTab.LOADING && }
+ {activeTab === EProfilePicTab.LOADING && }
{activeTab === EProfilePicTab.UPLOAD && (
diff --git a/src/components/views/onboarding/Onboarding.view.tsx b/src/components/views/onboarding/Onboarding.view.tsx
index d7bbe397f8..611c9d4afa 100644
--- a/src/components/views/onboarding/Onboarding.view.tsx
+++ b/src/components/views/onboarding/Onboarding.view.tsx
@@ -11,7 +11,6 @@ import WalletNotConnected from '@/components/WalletNotConnected';
import UserNotSignedIn from '@/components/UserNotSignedIn';
import { useAppSelector } from '@/features/hooks';
import { isUserRegistered } from '@/lib/helpers';
-import AlreadyRegistered from '@/components/views/onboarding/AlreadyRegistered';
const StatesLabel = [
'Register on Giveth',
@@ -32,7 +31,7 @@ export interface IOnboard {
}
const OnboardView = () => {
- const [step, setStep] = useState(OnboardSteps.INFO);
+ const [step, setStep] = useState(OnboardSteps.PHOTO);
const [isFirstRegistration, setFirstRegistration] = useState(true);
const [firstLoading, setFirstLoading] = useState(true); // To prevent first flickering
@@ -46,7 +45,7 @@ const OnboardView = () => {
if (userData?.isSignedIn) {
// Do not show "Already completed profile" message when user completes first step
setFirstRegistration(!isRegistered);
- setStep(OnboardSteps.INFO);
+ setStep(OnboardSteps.PHOTO);
setFirstLoading(false);
}
}, [userData?.isSignedIn]);
@@ -57,8 +56,8 @@ const OnboardView = () => {
return ;
} else if (!isSignedIn) {
return ;
- } else if (isRegistered && !isFirstRegistration) {
- return ;
+ // } else if (isRegistered && !isFirstRegistration) {
+ // return ;
}
return (
From c4ba15af5962c58439cd3b0569fe3f0c7925e9f8 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 3 Apr 2023 13:45:07 +0330
Subject: [PATCH 080/167] update to rarible
---
src/components/setProfilePic/SetProfilePic.tsx | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/components/setProfilePic/SetProfilePic.tsx b/src/components/setProfilePic/SetProfilePic.tsx
index a6b0af8c34..e690b70367 100644
--- a/src/components/setProfilePic/SetProfilePic.tsx
+++ b/src/components/setProfilePic/SetProfilePic.tsx
@@ -224,15 +224,13 @@ export const SetProfilePic: FC = ({ user }) => {
- View on OpenSea{' '}
+ View on Rarible{' '}
From a8d59bd8cf02efee9accaf4b6fad872bebc051d6 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 3 Apr 2023 13:48:39 +0330
Subject: [PATCH 081/167] fix selected issue
---
src/components/setProfilePic/SetProfilePic.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/setProfilePic/SetProfilePic.tsx b/src/components/setProfilePic/SetProfilePic.tsx
index e690b70367..e2db522251 100644
--- a/src/components/setProfilePic/SetProfilePic.tsx
+++ b/src/components/setProfilePic/SetProfilePic.tsx
@@ -152,7 +152,7 @@ export const SetProfilePic: FC = ({ user }) => {
}
};
compareHashes();
- }, []);
+ }, [pfpData, user.avatar]);
return (
From 6b9b840593aa50f6ebda746ece2c2f8c122de575 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 3 Apr 2023 14:14:27 +0330
Subject: [PATCH 082/167] separate no pfp
---
src/components/setProfilePic/NoPFP.tsx | 54 +++++++++++++++++++
.../setProfilePic/SetProfilePic.tsx | 49 ++---------------
2 files changed, 58 insertions(+), 45 deletions(-)
create mode 100644 src/components/setProfilePic/NoPFP.tsx
diff --git a/src/components/setProfilePic/NoPFP.tsx b/src/components/setProfilePic/NoPFP.tsx
new file mode 100644
index 0000000000..3fab328bc5
--- /dev/null
+++ b/src/components/setProfilePic/NoPFP.tsx
@@ -0,0 +1,54 @@
+import {
+ IconImage32,
+ neutralColors,
+ P,
+ brandColors,
+} from '@giveth/ui-design-system';
+import Link from 'next/link';
+import styled from 'styled-components';
+import Routes from '@/lib/constants/Routes';
+import { FlexCenter } from '../styled-components/Flex';
+import { CustomH5 } from './SetProfilePic';
+
+export const NoPFP = () => {
+ return (
+ <>
+ Your Unique Giveth’s PFP Artwork
+
+
+
+
+ Sorry!!
+
+ This wallet address does not have a unique Giveth’s NFT
+ Yet.
+
+
+ Mint
+ yours now on the NFT minter page.
+
+
+
+ >
+ );
+};
+
+const NoNFTContainer = styled(FlexCenter)`
+ flex-direction: column;
+ border: 1px dotted ${neutralColors.gray[400]};
+ margin: 24px 0 16px 0;
+ padding: 64px 20px;
+ color: ${brandColors.deep[500]};
+ img {
+ margin: 0 0 30px 0;
+ }
+ span {
+ cursor: pointer;
+ color: ${brandColors.pinky[500]};
+ }
+`;
+
+const MintLink = styled(Link)`
+ max-width: fit-content;
+ color: ${brandColors.pinky[500]};
+`;
diff --git a/src/components/setProfilePic/SetProfilePic.tsx b/src/components/setProfilePic/SetProfilePic.tsx
index e2db522251..c862856bc2 100644
--- a/src/components/setProfilePic/SetProfilePic.tsx
+++ b/src/components/setProfilePic/SetProfilePic.tsx
@@ -4,7 +4,6 @@ import {
H5,
H6,
IconExternalLink16,
- IconImage32,
mediaQueries,
neutralColors,
P,
@@ -26,12 +25,13 @@ import config from '@/configuration';
import Routes from '@/lib/constants/Routes';
import ImageUploader from '../ImageUploader';
import PfpItem from '../modals/UploadProfilePicModal/PfpItem';
-import { Flex, FlexCenter } from '../styled-components/Flex';
+import { Flex } from '../styled-components/Flex';
import { TabItem } from '../styled-components/Tabs';
import { IGiverPFPToken, IUser } from '@/apollo/types/types';
import { gqlRequest } from '@/helpers/requests';
import { buildUsersPfpInfoQuery } from '@/lib/subgraph/pfpQueryBuilder';
import Spinner from '../Spinner';
+import { NoPFP } from './NoPFP';
enum EProfilePicTab {
LOADING,
@@ -259,28 +259,7 @@ export const SetProfilePic: FC = ({ user }) => {
) : (
-
- Your Unique Giveth’s PFP Artwork
-
-
-
-
-
- Sorry!!
-
- This wallet address does not have a
- unique Giveth’s NFT Yet.
-
-
-
- Mint{' '}
-
- yours now on the NFT minter page.
-
-
-
+
@@ -321,26 +300,11 @@ const TextButton = styled(Button)<{ color?: string }>`
}
`;
-const CustomH5 = styled(H5)`
+export const CustomH5 = styled(H5)`
text-align: left;
margin-top: 16px;
`;
-const NoNFTContainer = styled(FlexCenter)`
- flex-direction: column;
- border: 1px dotted ${neutralColors.gray[400]};
- margin: 24px 0 16px 0;
- padding: 64px 20px;
- color: ${brandColors.deep[500]};
- img {
- margin: 0 0 30px 0;
- }
- span {
- cursor: pointer;
- color: ${brandColors.pinky[500]};
- }
-`;
-
const SelectedPFPContainer = styled.div`
background-color: ${neutralColors.gray[200]};
border-left: 6px solid ${brandColors.pinky[500]};
@@ -358,11 +322,6 @@ const CustomLink = styled.a`
max-width: fit-content;
`;
-const MintLink = styled(Link)`
- max-width: fit-content;
- color: ${brandColors.pinky[500]};
-`;
-
const NFTsButtonsContainer = styled(Flex)`
margin-bottom: 60px;
From 3388982b004ea91f670a6099fd9a5863f521dd23 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 3 Apr 2023 14:17:10 +0330
Subject: [PATCH 083/167] add ipfs to cSpell
---
.vscode/settings.json | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 36d87f7fe8..5b5ed76ca6 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -5,20 +5,21 @@
"GIVback",
"GIVBACKS",
"GIVeconomy",
- "GIVgarden",
"giveth",
"GIVfarm",
"GIVfrens",
+ "GIVgarden",
"GIVpower",
"GIVstream",
"HONEYSWAP",
"IGIVpower",
+ "Ipfs",
"merkle",
"Notif",
+ "rarible",
"SUSHISWAP",
"swiper",
"texty",
- "xdai",
- "rarible"
+ "xdai"
]
}
From e56da883f865292fc08321237c38d04716588c93 Mon Sep 17 00:00:00 2001
From: Cherik
Date: Mon, 3 Apr 2023 14:42:25 +0330
Subject: [PATCH 084/167] revert test condition
---
src/components/views/onboarding/Onboarding.view.tsx | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/components/views/onboarding/Onboarding.view.tsx b/src/components/views/onboarding/Onboarding.view.tsx
index 611c9d4afa..d7bbe397f8 100644
--- a/src/components/views/onboarding/Onboarding.view.tsx
+++ b/src/components/views/onboarding/Onboarding.view.tsx
@@ -11,6 +11,7 @@ import WalletNotConnected from '@/components/WalletNotConnected';
import UserNotSignedIn from '@/components/UserNotSignedIn';
import { useAppSelector } from '@/features/hooks';
import { isUserRegistered } from '@/lib/helpers';
+import AlreadyRegistered from '@/components/views/onboarding/AlreadyRegistered';
const StatesLabel = [
'Register on Giveth',
@@ -31,7 +32,7 @@ export interface IOnboard {
}
const OnboardView = () => {
- const [step, setStep] = useState(OnboardSteps.PHOTO);
+ const [step, setStep] = useState(OnboardSteps.INFO);
const [isFirstRegistration, setFirstRegistration] = useState(true);
const [firstLoading, setFirstLoading] = useState(true); // To prevent first flickering
@@ -45,7 +46,7 @@ const OnboardView = () => {
if (userData?.isSignedIn) {
// Do not show "Already completed profile" message when user completes first step
setFirstRegistration(!isRegistered);
- setStep(OnboardSteps.PHOTO);
+ setStep(OnboardSteps.INFO);
setFirstLoading(false);
}
}, [userData?.isSignedIn]);
@@ -56,8 +57,8 @@ const OnboardView = () => {
return ;
} else if (!isSignedIn) {
return ;
- // } else if (isRegistered && !isFirstRegistration) {
- // return ;
+ } else if (isRegistered && !isFirstRegistration) {
+ return ;
}
return (
From 15baccb25442c017023819f2b8aa4f4351ce8ace Mon Sep 17 00:00:00 2001
From: alireza-sharifpour
Date: Tue, 4 Apr 2023 10:24:54 +0330
Subject: [PATCH 085/167] update images
---
public/images/nft/pfp-o-1.png | Bin 732100 -> 714567 bytes
public/images/nft/pfp-o-2.png | Bin 518859 -> 499873 bytes
public/images/nft/pfp-o-3.png | Bin 539269 -> 526414 bytes
public/images/nft/pfp-o-4.png | Bin 410185 -> 401648 bytes
public/images/nft/pfp-o-5.png | Bin 474112 -> 458601 bytes
5 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/public/images/nft/pfp-o-1.png b/public/images/nft/pfp-o-1.png
index fa021a8d71a68dd92de9f5ecc0543cfdf53ac6ad..7419c9084c7d837cee836b04eb65a040e99ad787 100644
GIT binary patch
literal 714567
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