diff --git a/.claude/hooks/prevent-force-push.sh b/.claude/hooks/prevent-force-push.sh index e70ea77167..391d6cbb0f 100755 --- a/.claude/hooks/prevent-force-push.sh +++ b/.claude/hooks/prevent-force-push.sh @@ -10,7 +10,8 @@ if [[ -z "$cmd" ]]; then exit 0 fi -if [[ "$cmd" =~ git\ push.*(-f|--force) ]]; then +# Match -f or --force as standalone flags (preceded by space) +if [[ "$cmd" =~ git\ push.*\ (-f|--force)(\ |$) ]]; then echo "Force push is not allowed" >&2 exit 2 fi diff --git a/packages/shared/src/features/opportunity/mockData.ts b/packages/shared/src/features/opportunity/mockData.ts deleted file mode 100644 index e9c507cfac..0000000000 --- a/packages/shared/src/features/opportunity/mockData.ts +++ /dev/null @@ -1,174 +0,0 @@ -import type { Opportunity } from './types'; -import { OpportunityPreviewStatus } from './types'; -import type { OpportunityPreviewContextType } from './context/OpportunityPreviewContext'; -import { SeniorityLevel } from './protobuf/opportunity'; -import { SourceMemberRole, SourceType } from '../../graphql/sources'; - -export const mockOpportunity: Opportunity = { - id: '89f3daff-d6bb-4652-8f9c-b9f7254c9af1', - type: 0, - state: 0, - title: 'Senior Frontend Developer', - tldr: 'Join our team to build the next generation of developer tools', - organization: { - id: 'org-1', - name: 'Daily.dev', - website: 'https://daily.dev', - image: 'https://daily.dev/favicon.ico', - recruiterTotalSeats: 1, - }, - content: { - overview: { - content: - 'We are looking for a Senior Frontend Developer to join our team and help us build the next generation of developer tools.\n\n## Requirements\n\n- 5+ years of experience with React and TypeScript\n- Strong understanding of modern web technologies\n- Experience with Next.js and server-side rendering\n- Excellent communication skills\n\n## Nice to have\n\n- Experience with Tailwind CSS\n- Knowledge of GraphQL\n- Contributions to open source projects', - html: '

We are looking for a Senior Frontend Developer to join our team and help us build the next generation of developer tools.

', - }, - }, - meta: { - employmentType: 0, - teamSize: 10, - salary: { - min: 120000, - max: 180000, - currency: 'USD', - period: 0, - }, - seniorityLevel: SeniorityLevel.SENIOR, - roleType: 0, - equity: true, - }, - recruiters: [ - { - id: 'recruiter-1', - name: 'John Doe', - username: 'johndoe', - image: 'https://media.daily.dev/image/upload/f_auto/v1/placeholders/1', - bio: 'Talent acquisition specialist', - title: 'Senior Recruiter', - }, - ], - locations: [ - { - type: 0, - location: { - city: 'San Francisco', - country: 'United States', - subdivision: 'California', - continent: 'North America', - }, - }, - ], - keywords: [ - { keyword: 'React' }, - { keyword: 'TypeScript' }, - { keyword: 'Next.js' }, - { keyword: 'JavaScript' }, - { keyword: 'Tailwind CSS' }, - ], -}; - -export const mockOpportunityPreviewData: OpportunityPreviewContextType = { - result: { - tags: ['react', 'typescript', 'nextjs', 'javascript', 'nodejs', 'graphql'], - companies: [ - { - name: 'Shopify', - favicon: 'https://www.shopify.com/', - }, - { - name: 'Ericsson', - favicon: 'https://www.ericsson.com/', - }, - { - name: 'AMD', - favicon: 'https://www.amd.com/', - }, - { - name: 'Capital One', - favicon: 'https://www.capitalone.com/', - }, - { - name: 'Spotify', - favicon: 'https://www.spotify.com/', - }, - { - name: 'Wipro', - favicon: 'https://www.wipro.com/', - }, - ], - squads: [ - { - id: 'squad-1', - handle: 'webdev', - name: 'Web Development', - image: - 'https://media.daily.dev/image/upload/s--iK6zGJCz--/f_auto,t_logo/v1698841319/logos/collections.jpg', - active: false, - permalink: '', - public: false, - type: SourceType.Squad, - membersCount: 0, - description: '', - memberPostingRole: SourceMemberRole.Member, - memberInviteRole: SourceMemberRole.Member, - moderationRequired: false, - moderationPostCount: 0, - }, - { - id: 'squad-2', - handle: 'javascript', - name: 'JavaScript', - image: - 'https://media.daily.dev/image/upload/s--iK6zGJCz--/f_auto,t_logo/v1698841319/logos/collections.jpg', - active: false, - permalink: '', - public: false, - type: SourceType.Squad, - membersCount: 0, - description: '', - memberPostingRole: SourceMemberRole.Member, - memberInviteRole: SourceMemberRole.Member, - moderationRequired: false, - moderationPostCount: 0, - }, - { - id: 'squad-3', - handle: 'react', - name: 'React Developers', - image: - 'https://media.daily.dev/image/upload/s--iK6zGJCz--/f_auto,t_logo/v1698841319/logos/collections.jpg', - active: false, - permalink: '', - public: false, - type: SourceType.Squad, - membersCount: 0, - description: '', - memberPostingRole: SourceMemberRole.Member, - memberInviteRole: SourceMemberRole.Member, - moderationRequired: false, - moderationPostCount: 0, - }, - { - id: 'squad-4', - handle: 'typescript', - name: 'TypeScript Community', - image: - 'https://media.daily.dev/image/upload/s--iK6zGJCz--/f_auto,t_logo/v1698841319/logos/collections.jpg', - active: false, - permalink: '', - public: false, - type: SourceType.Squad, - membersCount: 0, - description: '', - memberPostingRole: SourceMemberRole.Member, - memberInviteRole: SourceMemberRole.Member, - moderationRequired: false, - moderationPostCount: 0, - }, - ], - totalCount: 5001, - opportunityId: '89f3daff-d6bb-4652-8f9c-b9f7254c9af1', - status: OpportunityPreviewStatus.READY, - }, - opportunity: mockOpportunity, -}; diff --git a/packages/shared/src/features/recruiter/components/OnboardingView.tsx b/packages/shared/src/features/recruiter/components/OnboardingView.tsx index 43c377f369..71a62cfc8a 100644 --- a/packages/shared/src/features/recruiter/components/OnboardingView.tsx +++ b/packages/shared/src/features/recruiter/components/OnboardingView.tsx @@ -5,25 +5,16 @@ import { RecruiterProgress, RecruiterProgressStep, } from '../../../components/recruiter/Progress'; -import type { OpportunityPreviewContextType } from '../../opportunity/context/OpportunityPreviewContext'; import { OpportunityPreviewProvider } from '../../opportunity/context/OpportunityPreviewContext'; import { AnalyzeContent } from '../../opportunity/components/analyze/AnalyzeContent'; -export type OnboardingViewProps = { - mockData: OpportunityPreviewContextType; - loadingStep: number; -}; - -export const OnboardingView = ({ - mockData, - loadingStep, -}: OnboardingViewProps): ReactElement => { +export const OnboardingView = (): ReactElement => { return ( - +
- +
); diff --git a/packages/webapp/components/layouts/RecruiterFullscreenLayout.tsx b/packages/webapp/components/layouts/RecruiterFullscreenLayout.tsx index dc3d28f0da..bd26e65d2f 100644 --- a/packages/webapp/components/layouts/RecruiterFullscreenLayout.tsx +++ b/packages/webapp/components/layouts/RecruiterFullscreenLayout.tsx @@ -74,20 +74,20 @@ const RecruiterFullscreenLayoutInner = ({ } return ( - -
- - - - {children} -
-
+
+ + + + {children} +
); }; const GetLayout = (page: ReactNode): ReactNode => { return ( - {page} + + {page} + ); }; diff --git a/packages/webapp/pages/recruiter/index.tsx b/packages/webapp/pages/recruiter/index.tsx index 53cca59cd9..7f93ddbb33 100644 --- a/packages/webapp/pages/recruiter/index.tsx +++ b/packages/webapp/pages/recruiter/index.tsx @@ -1,13 +1,11 @@ import type { ReactElement } from 'react'; -import React, { useCallback, useEffect, useRef, useState } from 'react'; +import React, { useCallback, useEffect, useRef } from 'react'; import { useRouter } from 'next/router'; import { useQuery } from '@tanstack/react-query'; import { useLazyModal } from '@dailydotdev/shared/src/hooks/useLazyModal'; import { LazyModal } from '@dailydotdev/shared/src/components/modals/common/types'; import type { PendingSubmission } from '@dailydotdev/shared/src/features/opportunity/context/PendingSubmissionContext'; import { usePendingSubmission } from '@dailydotdev/shared/src/features/opportunity/context/PendingSubmissionContext'; -import { mockOpportunityPreviewData } from '@dailydotdev/shared/src/features/opportunity/mockData'; -import type { OpportunityPreviewContextType } from '@dailydotdev/shared/src/features/opportunity/context/OpportunityPreviewContext'; import { useAuthContext } from '@dailydotdev/shared/src/contexts/AuthContext'; import { getOpportunitiesOptions } from '@dailydotdev/shared/src/features/opportunity/queries'; import { @@ -18,28 +16,6 @@ import { DashboardView } from '@dailydotdev/shared/src/features/recruiter/compon import { OnboardingView } from '@dailydotdev/shared/src/features/recruiter/components/OnboardingView'; import { getLayout } from '../../components/layouts/RecruiterFullscreenLayout'; -const useLoadingAnimation = (isActive: boolean) => { - const [loadingStep, setLoadingStep] = useState(0); - - useEffect(() => { - if (!isActive) { - setLoadingStep(0); - return undefined; - } - - const timers = [ - setTimeout(() => setLoadingStep(1), 800), - setTimeout(() => setLoadingStep(2), 1600), - setTimeout(() => setLoadingStep(3), 2400), - setTimeout(() => setLoadingStep(4), 3200), - ]; - - return () => timers.forEach(clearTimeout); - }, [isActive]); - - return loadingStep; -}; - function RecruiterPage(): ReactElement { const router = useRouter(); const { openModal, closeModal } = useLazyModal(); @@ -53,10 +29,6 @@ function RecruiterPage(): ReactElement { ...getOpportunitiesOptions(), enabled: !!user, }); - const [mockData, setMockData] = useState({}); - const [isAnimating, setIsAnimating] = useState(false); - const loadingStep = useLoadingAnimation(isAnimating); - const navigateToAnalyze = useCallback(() => { closeModal(); router.push(`/recruiter/new/analyze`); @@ -70,10 +42,6 @@ function RecruiterPage(): ReactElement { closeModal(); if (!user) { - // Show mock data to make it look like processing is happening, - // encouraging the user to sign up - setMockData(mockOpportunityPreviewData); - setIsAnimating(true); openModal({ type: LazyModal.RecruiterSignIn, props: { @@ -182,7 +150,7 @@ function RecruiterPage(): ReactElement { } // Onboarding flow for new users (with blur effect) - return ; + return ; } RecruiterPage.getLayout = getLayout;