Skip to content

Commit 0490d86

Browse files
authored
Collins (#330)
* refactor: update project components and API for voting functionality - Adjust layout and styling in ProjectsPage and ProjectCard components. - Enhance ProjectSidebar to include crowdfund data and voting logic. - Implement new API methods for voting, retrieving votes, and removing votes. - Update types for vote handling in the API. - Clean up unused code and improve responsiveness across components. * chore: update project dependencies and enhance project details layout * feat: added static api for staging * fix: made few changes * fix: minor changes * feat: chaged test data * fix: minor fixes * refactor: update project components and improve functionality * feat: file clean up * feat: added extra validation * feat: integrate wallet protection and validation across components
1 parent f97e40e commit 0490d86

14 files changed

Lines changed: 792 additions & 98 deletions

File tree

app/providers.tsx

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import { SessionProvider } from 'next-auth/react';
44
import { ReactNode } from 'react';
55
import { AuthProvider } from '@/components/providers/auth-provider';
6+
import { WalletProvider } from '@/components/providers/wallet-provider';
67
import { NotificationProvider } from 'react-notification-core';
78
import {
89
mockFetchNotifications,
@@ -19,19 +20,21 @@ export function Providers({ children }: ProvidersProps) {
1920
return (
2021
<SessionProvider>
2122
<AuthProvider>
22-
<NotificationProvider
23-
fetchNotifications={mockFetchNotifications}
24-
onMarkAsRead={mockMarkAsRead}
25-
onMarkAllAsRead={mockMarkAllAsRead}
26-
onDeleteNotification={mockDeleteNotification}
27-
fetchOptions={{
28-
retryCount: 2,
29-
retryDelay: 1000,
30-
timeout: 5000,
31-
}}
32-
>
33-
{children}
34-
</NotificationProvider>
23+
<WalletProvider>
24+
<NotificationProvider
25+
fetchNotifications={mockFetchNotifications}
26+
onMarkAsRead={mockMarkAsRead}
27+
onMarkAllAsRead={mockMarkAllAsRead}
28+
onDeleteNotification={mockDeleteNotification}
29+
fetchOptions={{
30+
retryCount: 2,
31+
retryDelay: 1000,
32+
timeout: 5000,
33+
}}
34+
>
35+
{children}
36+
</NotificationProvider>
37+
</WalletProvider>
3538
</AuthProvider>
3639
</SessionProvider>
3740
);

components/landing-page/navbar.tsx

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ import { User, LogOut, Settings } from 'lucide-react';
2929
import { cn } from '@/lib/utils';
3030
import WalletConnectButton from '../wallet/WalletConnectButton';
3131
import CreateProjectModal from './project/CreateProjectModal';
32+
import { useProtectedAction } from '@/hooks/use-protected-action';
3233
import { useAuthStore } from '@/lib/stores/auth-store';
34+
import WalletRequiredModal from '@/components/wallet/WalletRequiredModal';
3335

3436
gsap.registerPlugin(useGSAP);
3537

@@ -229,6 +231,16 @@ function AuthenticatedNav({
229231
const { logout } = useAuthActions();
230232
const { isLoading } = useAuthStore();
231233
const [createProjectModalOpen, setCreateProjectModalOpen] = useState(false);
234+
235+
const {
236+
executeProtectedAction,
237+
showWalletModal,
238+
closeWalletModal,
239+
handleWalletConnected,
240+
} = useProtectedAction({
241+
actionName: 'create project',
242+
onSuccess: () => setCreateProjectModalOpen(true),
243+
});
232244
return (
233245
<div className='flex items-center space-x-3'>
234246
<WalletConnectButton />
@@ -243,7 +255,11 @@ function AuthenticatedNav({
243255
className='bg-background w-[300px] rounded-[8px] border border-[#2B2B2B] pt-3 pb-6 text-white shadow-[0_4px_4px_0_rgba(26,26,26,0.25)]'
244256
>
245257
<DropdownMenuItem
246-
onClick={() => setCreateProjectModalOpen(true)}
258+
onClick={async () => {
259+
await executeProtectedAction(() =>
260+
setCreateProjectModalOpen(true)
261+
);
262+
}}
247263
className='group hover:text-primary px-6 py-3.5 text-white hover:!bg-transparent'
248264
>
249265
<span className='group-hover:text-primary flex w-full items-center justify-between'>
@@ -366,6 +382,14 @@ function AuthenticatedNav({
366382
open={createProjectModalOpen}
367383
setOpen={setCreateProjectModalOpen}
368384
/>
385+
386+
{/* Wallet Required Modal */}
387+
<WalletRequiredModal
388+
open={showWalletModal}
389+
onOpenChange={closeWalletModal}
390+
actionName='create project'
391+
onWalletConnected={handleWalletConnected}
392+
/>
369393
</div>
370394
);
371395
}
@@ -375,6 +399,16 @@ function AuthenticatedNav({
375399
function UnauthenticatedNav() {
376400
const [createProjectModalOpen, setCreateProjectModalOpen] = useState(false);
377401

402+
const {
403+
executeProtectedAction,
404+
showWalletModal,
405+
closeWalletModal,
406+
handleWalletConnected,
407+
} = useProtectedAction({
408+
actionName: 'create project',
409+
onSuccess: () => setCreateProjectModalOpen(true),
410+
});
411+
378412
const showDevAddProject =
379413
process.env.NODE_ENV !== 'production' &&
380414
(process.env.NEXT_PUBLIC_SHOW_ADD_PROJECT_FOR_GUESTS === 'true' || true);
@@ -391,7 +425,9 @@ function UnauthenticatedNav() {
391425
<div className='flex items-center space-x-3'>
392426
<BoundlessButton
393427
variant='outline'
394-
onClick={() => setCreateProjectModalOpen(true)}
428+
onClick={async () => {
429+
await executeProtectedAction(() => setCreateProjectModalOpen(true));
430+
}}
395431
className='border-white/20 text-white hover:bg-white/10'
396432
>
397433
<Plus className='mr-2 h-4 w-4' />
@@ -404,6 +440,14 @@ function UnauthenticatedNav() {
404440
open={createProjectModalOpen}
405441
setOpen={setCreateProjectModalOpen}
406442
/>
443+
444+
{/* Wallet Required Modal */}
445+
<WalletRequiredModal
446+
open={showWalletModal}
447+
onOpenChange={closeWalletModal}
448+
actionName='create project'
449+
onWalletConnected={handleWalletConnected}
450+
/>
407451
</div>
408452
);
409453
}

0 commit comments

Comments
 (0)