├── .env.sample ├── .eslintrc.js ├── .gitignore ├── .prettierrc ├── README.md ├── jsconfig.json ├── next-env.d.ts ├── next.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── assets │ ├── email │ │ ├── absurd │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ ├── 04.png │ │ │ ├── 05.png │ │ │ ├── 06.png │ │ │ ├── 07.png │ │ │ ├── 08.png │ │ │ ├── 09.png │ │ │ ├── 10.png │ │ │ └── 11.png │ │ └── email-logo-black.png │ ├── icons │ │ ├── thefullstack-circle.webp │ │ ├── thefullstack-dark-circle.webp │ │ ├── thefullstack-dark-square.webp │ │ ├── thefullstack-dark.webp │ │ ├── thefullstack-light-circle.webp │ │ ├── thefullstack-light-square.webp │ │ └── thefullstack-light.webp │ ├── landing │ │ ├── about │ │ │ ├── ei.webp │ │ │ ├── henrique.webp │ │ │ ├── jamie.webp │ │ │ ├── ndrc.webp │ │ │ ├── nodes.webp │ │ │ ├── noel.webp │ │ │ └── phil.webp │ │ ├── engineers │ │ │ ├── logo-fb.webp │ │ │ ├── logo-meta.webp │ │ │ ├── preview-poster.webp │ │ │ ├── testimonial-adityar.webp │ │ │ ├── testimonial-ciaran.webp │ │ │ ├── testimonial-cjcon90.jpeg │ │ │ ├── testimonial-davide.webp │ │ │ ├── testimonial-dylan.webp │ │ │ ├── testimonial-eric.webp │ │ │ ├── testimonial-foodcloud.png │ │ │ ├── testimonial-foodcloud.webp │ │ │ ├── testimonial-griffin.webp │ │ │ ├── testimonial-gyanendra.webp │ │ │ ├── testimonial-sands.webp │ │ │ ├── testimonial-seth.webp │ │ │ ├── testimonial-sojin.webp │ │ │ ├── testimonial-takanomedev.webp │ │ │ └── testimonial-xinor.webp │ │ ├── fordevelopers │ │ │ ├── crying-face.png │ │ │ ├── handshake.png │ │ │ ├── laughing-face.png │ │ │ ├── nerd-face.png │ │ │ ├── raising-hands.png │ │ │ ├── screen-hangout.webp │ │ │ ├── screen-profile.webp │ │ │ ├── screen-project.webp │ │ │ ├── screen-showcase.webp │ │ │ ├── screen-teams.webp │ │ │ ├── screen1.webp │ │ │ ├── smiling-face.png │ │ │ ├── thinking-face.png │ │ │ ├── thumbs-down.png │ │ │ ├── thumbs-up.png │ │ │ └── worried-face.png │ │ ├── forteams │ │ │ ├── screen-jobs.webp │ │ │ ├── screen-teammates.webp │ │ │ ├── screen-teams.webp │ │ │ └── screen-tools.webp │ │ ├── hackathon │ │ │ ├── competition-cover.webp │ │ │ ├── og.webp │ │ │ └── voting-cover.gif │ │ └── main │ │ │ ├── computer2.webp │ │ │ └── dev-portfolio-og.webp │ ├── og-thefullstack-2.png │ ├── og-thefullstack.png │ ├── profile │ │ └── user │ │ │ ├── avatar-notfound.webp │ │ │ └── user-not-exist.png │ ├── thefullstack-dark-new-icon.png │ ├── thefullstack-dark-new.png │ ├── thefullstack-icon.webp │ └── wallet │ │ └── money.gif ├── favicon.ico ├── icons │ ├── icon-192x192.png │ ├── icon-256x256.png │ ├── icon-384x384.png │ └── icon-512x512.png ├── logo.svg ├── manifest.json ├── robots.txt └── sitemap.xml ├── scripts └── detect-unused.js ├── src ├── components │ ├── common │ │ ├── buttons │ │ │ ├── Award.js │ │ │ ├── Bookmark.js │ │ │ ├── Chat.js │ │ │ ├── Comment.js │ │ │ ├── Connect.js │ │ │ ├── Follow.js │ │ │ ├── Like.js │ │ │ ├── Mode.js │ │ │ ├── Report.js │ │ │ ├── Share.js │ │ │ └── Vote.js │ │ ├── cards │ │ │ ├── FollowingCard.js │ │ │ ├── PollCard.js │ │ │ ├── PostCard.js │ │ │ ├── ProjectCard.js │ │ │ └── TeamCard.js │ │ ├── elements │ │ │ ├── Avatar.js │ │ │ ├── CodeBlock.js │ │ │ ├── CountrySelect.js │ │ │ ├── DividerShowMore.js │ │ │ ├── Icon.js │ │ │ ├── Loader.js │ │ │ ├── MarkdownContent.js │ │ │ ├── SearchUsersInput.js │ │ │ ├── SelectEmoji.js │ │ │ ├── SignOutPrompt.js │ │ │ ├── SignUpPrompt.js │ │ │ ├── SocialShareLinks.js │ │ │ ├── Toast.js │ │ │ ├── ToolTip.js │ │ │ └── mux │ │ │ │ ├── ErrorMessage.js │ │ │ │ ├── ProfileVideoPlayer.js │ │ │ │ ├── UploadIntroVideo.js │ │ │ │ ├── UploadPostVideo.js │ │ │ │ ├── UploadProjectVideo.js │ │ │ │ └── VideoPlayer.js │ │ ├── layout │ │ │ ├── Drawer.js │ │ │ ├── Footer.js │ │ │ ├── Header.js │ │ │ ├── Layout.js │ │ │ ├── LayoutLoggedIn.js │ │ │ ├── MobileNavigation.js │ │ │ ├── MobileProfileMenu.js │ │ │ ├── PopoverPanel.js │ │ │ ├── ProfilePopoverPanel.js │ │ │ └── constants.js │ │ ├── modals │ │ │ ├── ModalAlert.js │ │ │ └── ModalDialog.js │ │ ├── partials │ │ │ └── Metadata.js │ │ └── tags │ │ │ ├── TagPostType.js │ │ │ └── TagStack.js │ └── modules │ │ ├── account │ │ ├── dashboard │ │ │ ├── Followers.js │ │ │ ├── Following.js │ │ │ ├── Main.js │ │ │ ├── Projects.js │ │ │ └── Saved.js │ │ ├── network │ │ │ ├── Connection.js │ │ │ └── Main.js │ │ ├── profile │ │ │ ├── About.js │ │ │ ├── EditProfile.js │ │ │ ├── Interests.js │ │ │ ├── InviteFriends.js │ │ │ ├── Socials.js │ │ │ ├── Tech.js │ │ │ └── VideoIntro.js │ │ ├── settings │ │ │ ├── Archive.js │ │ │ ├── DangerZone.js │ │ │ ├── JobPreferences.js │ │ │ ├── Main.js │ │ │ ├── NotificationsPanel.js │ │ │ ├── NotificationsPreferences.js │ │ │ └── SignOut.js │ │ ├── teams │ │ │ ├── CreateJob.js │ │ │ ├── EditJob.js │ │ │ ├── InviteMembers.js │ │ │ ├── Jobs.js │ │ │ ├── Members.js │ │ │ ├── Menu.js │ │ │ ├── TeamProfile.js │ │ │ ├── TeamTech.js │ │ │ └── constants.js │ │ └── wallet │ │ │ └── Main.js │ │ ├── auth │ │ ├── ForgotPassword.js │ │ ├── Login.js │ │ ├── LoginModal.js │ │ ├── ResetEmail.js │ │ └── ResetPassword.js │ │ ├── chat │ │ ├── BottomBar.js │ │ ├── Main.js │ │ ├── Message.js │ │ ├── Notifications.js │ │ ├── Profile.js │ │ ├── SideBar.js │ │ └── TopBar.js │ │ ├── comments │ │ ├── CommentReplies.js │ │ ├── EditComment.js │ │ ├── LikeComment.js │ │ ├── ListComments.js │ │ ├── NewComment.js │ │ └── ReplyToComment.js │ │ ├── create │ │ ├── CreatePostModal.js │ │ ├── Form.js │ │ ├── Header.js │ │ ├── ImportFromGitHub.js │ │ ├── Main.js │ │ ├── ProjectCategory.js │ │ ├── ProjectSettings.js │ │ ├── ProjectTechStack.js │ │ └── ValidationErrors.js │ │ ├── explore │ │ ├── Categories.js │ │ ├── Feed.js │ │ ├── FilterPopoverPanel.js │ │ ├── Filters.js │ │ ├── HackathonProjectGallery.js │ │ ├── Main.js │ │ ├── ProjectGallery.js │ │ ├── StackPopoverPanel.js │ │ └── constants.js │ │ ├── hangout │ │ ├── Activity.js │ │ ├── CreatePost.js │ │ ├── EditPost.js │ │ ├── Feed.js │ │ ├── Main.js │ │ ├── PinnedPost.js │ │ ├── TagTechStack.js │ │ ├── Topics.js │ │ ├── WhoToFollow.js │ │ └── constants.js │ │ ├── home │ │ ├── Discover.js │ │ ├── HackathonCarousel.js │ │ ├── Highlight.js │ │ ├── Main.js │ │ └── ProjectCarousel.js │ │ ├── post │ │ ├── Actions.js │ │ ├── Container.js │ │ ├── Content.js │ │ ├── Detail.js │ │ ├── Insights.js │ │ ├── OpenGraphPreview.js │ │ └── Poll.js │ │ ├── profile │ │ ├── Actions.js │ │ ├── Main.js │ │ ├── Menu.js │ │ ├── NotFound.js │ │ └── sections │ │ │ ├── Accounts.js │ │ │ ├── Articles.js │ │ │ ├── Goals.js │ │ │ ├── Intro.js │ │ │ ├── Overview.js │ │ │ ├── Projects.js │ │ │ ├── Snippets.js │ │ │ ├── Social.js │ │ │ └── Sparks.js │ │ ├── project │ │ ├── Actions.js │ │ ├── Container.js │ │ ├── Contributors.js │ │ ├── GitHubStats.js │ │ ├── Main.js │ │ ├── Modal.js │ │ └── Reactions.js │ │ ├── signup │ │ ├── Footer.js │ │ ├── Header.js │ │ ├── Main.js │ │ ├── ProgressBar.js │ │ ├── StepFive.js │ │ ├── StepFour.js │ │ ├── StepOne.js │ │ ├── StepThree.js │ │ ├── StepTwo.js │ │ └── constants.js │ │ ├── static │ │ ├── ForDevelopers.js │ │ ├── ForTeams.js │ │ ├── OurStory.js │ │ ├── TeamsFaq.js │ │ ├── hackathon │ │ │ ├── Page.js │ │ │ └── competition1 │ │ │ │ └── Page.js │ │ ├── policies │ │ │ ├── CodeOfConduct.js │ │ │ ├── CookiePolicy.js │ │ │ └── PrivacyPolicy.js │ │ └── shared │ │ │ ├── NewsletterSection.js │ │ │ ├── TestimonialsSection.js │ │ │ └── constants.js │ │ └── teams │ │ ├── CreateTeam.js │ │ ├── Faq.js │ │ ├── FilterTeams.js │ │ ├── JobDetails.js │ │ ├── ListJobs.js │ │ ├── ListTeams.js │ │ ├── Main.js │ │ ├── TeamMembers.js │ │ └── TeamProfile.js ├── context │ └── user.js ├── firebase │ ├── firebaseApp.js │ ├── firebasePresence.js │ └── initFirebaseApp.js ├── hooks │ └── useUserProfile.js ├── lib │ ├── ga │ │ └── index.js │ └── gtag.js ├── pages │ ├── 404.js │ ├── 500.js │ ├── [userId] │ │ ├── [postId].js │ │ ├── index.js │ │ └── project │ │ │ └── [projectId].js │ ├── _app.js │ ├── _document.js │ ├── about │ │ └── our-story.js │ ├── account │ │ ├── dashboard │ │ │ └── index.js │ │ ├── network.js │ │ ├── profile │ │ │ └── invite.js │ │ ├── settings.js │ │ ├── settings │ │ │ ├── archive.js │ │ │ ├── danger.js │ │ │ ├── jobpreferences.js │ │ │ ├── notifications.js │ │ │ └── signout.js │ │ ├── signup │ │ │ ├── step1.js │ │ │ ├── step2.js │ │ │ ├── step3.js │ │ │ ├── step4.js │ │ │ ├── step5.js │ │ │ └── verify-email.js │ │ ├── teams │ │ │ ├── jobs │ │ │ │ ├── [teamId].js │ │ │ │ ├── edit │ │ │ │ │ └── [jobId].js │ │ │ │ └── new.js │ │ │ ├── members │ │ │ │ └── [teamId].js │ │ │ └── profile │ │ │ │ └── [teamId].js │ │ └── wallet.js │ ├── api │ │ ├── accounts │ │ │ └── connections │ │ │ │ ├── approve.js │ │ │ │ └── reject.js │ │ ├── auth │ │ │ ├── linkedin │ │ │ │ └── login.js │ │ │ ├── login.js │ │ │ ├── logout.js │ │ │ ├── token.js │ │ │ ├── userProfile.js │ │ │ └── withAuthUserTokenAPI.js │ │ ├── checkout_sessions │ │ │ ├── [id].js │ │ │ └── index.js │ │ ├── connections │ │ │ └── get.js │ │ ├── explore │ │ │ └── getActivity.js │ │ ├── firebase │ │ │ ├── firebase-messaging-sw.js │ │ │ └── service-account.enc.js │ │ ├── jobs │ │ │ ├── create.js │ │ │ ├── delete.js │ │ │ ├── get.js │ │ │ ├── getAll.js │ │ │ ├── getByTeam.js │ │ │ └── update.js │ │ ├── mail │ │ │ └── send.js │ │ ├── notifications │ │ │ ├── getKnockJwt.js │ │ │ ├── identifyKnockUser.js │ │ │ └── slack │ │ │ │ ├── postEnquiry.js │ │ │ │ └── postMessage.js │ │ ├── posts │ │ │ ├── comments │ │ │ │ ├── deleteComment.js │ │ │ │ ├── getComment.js │ │ │ │ ├── getComments.js │ │ │ │ ├── getPublicComments.js │ │ │ │ ├── getPublicReplies.js │ │ │ │ ├── getReplies.js │ │ │ │ ├── likeComment.js │ │ │ │ ├── postComment.js │ │ │ │ ├── postReply.js │ │ │ │ ├── unlikeComment.js │ │ │ │ └── updateComment.js │ │ │ ├── getPost.js │ │ │ ├── getPostById.js │ │ │ ├── getPostByRef.js │ │ │ ├── getPublicPost.js │ │ │ ├── getURLPreview.js │ │ │ └── polls │ │ │ │ ├── castVote.js │ │ │ │ └── getPoll.js │ │ ├── profile │ │ │ ├── avatar │ │ │ │ └── upload.js │ │ │ ├── bio │ │ │ │ └── update.js │ │ │ ├── connect.js │ │ │ ├── displayName │ │ │ │ └── change.js │ │ │ ├── getUser.js │ │ │ ├── getUsers.js │ │ │ ├── github │ │ │ │ └── repos.js │ │ │ ├── interests │ │ │ │ ├── delete.js │ │ │ │ ├── get.js │ │ │ │ ├── getcategories.js │ │ │ │ └── update.js │ │ │ ├── me.js │ │ │ ├── posts │ │ │ │ └── get.js │ │ │ ├── search.js │ │ │ ├── skills.js │ │ │ ├── skills │ │ │ │ └── update.js │ │ │ ├── sng │ │ │ │ ├── deleteContent.js │ │ │ │ ├── getByUser.js │ │ │ │ └── importContent.js │ │ │ ├── social │ │ │ │ ├── follow.js │ │ │ │ ├── followers.js │ │ │ │ ├── following.js │ │ │ │ └── unfollow.js │ │ │ ├── update.js │ │ │ ├── user.js │ │ │ ├── verify_connection.js │ │ │ └── wallet │ │ │ │ ├── get.js │ │ │ │ ├── gift.js │ │ │ │ ├── redeem.js │ │ │ │ └── transactions.js │ │ ├── projects │ │ │ ├── find.js │ │ │ ├── get.js │ │ │ ├── ideas.js │ │ │ ├── project │ │ │ │ ├── add.js │ │ │ │ ├── contributors.js │ │ │ │ ├── delete.js │ │ │ │ ├── edit.js │ │ │ │ ├── githubstats.js │ │ │ │ ├── image │ │ │ │ │ └── upload.js │ │ │ │ ├── import.js │ │ │ │ ├── insights │ │ │ │ │ └── getVotes.js │ │ │ │ ├── like.js │ │ │ │ ├── save.js │ │ │ │ ├── unlike.js │ │ │ │ └── unsave.js │ │ │ ├── saved │ │ │ │ └── get.js │ │ │ └── showcase.js │ │ ├── search │ │ │ ├── profiles │ │ │ │ └── search.js │ │ │ ├── projects.js │ │ │ ├── showcase.js │ │ │ └── skills.js │ │ ├── skills │ │ │ └── remove.js │ │ ├── stats │ │ │ └── profile │ │ │ │ └── getStats.js │ │ ├── teams │ │ │ ├── createTeam.js │ │ │ ├── deleteTeam.js │ │ │ ├── getAllTeams.js │ │ │ ├── getTeam.js │ │ │ ├── getTeams.js │ │ │ ├── getTeamsByUser.js │ │ │ ├── members │ │ │ │ ├── add.js │ │ │ │ ├── delete.js │ │ │ │ └── invite │ │ │ │ │ ├── accept.js │ │ │ │ │ ├── external.js │ │ │ │ │ └── refuse.js │ │ │ ├── updateTeam.js │ │ │ ├── upload.js │ │ │ └── uploadGalleryImage.js │ │ └── video │ │ │ ├── asset │ │ │ └── [id].js │ │ │ ├── upload.js │ │ │ └── upload │ │ │ └── [id].js │ ├── auth │ │ ├── linkedin │ │ │ └── redirect.js │ │ ├── logout.js │ │ └── passwordreset.js │ ├── chat │ │ ├── [id].js │ │ └── index.js │ ├── code-of-conduct.js │ ├── cookie-policy.js │ ├── explore │ │ ├── index.js │ │ ├── new │ │ │ └── index.js │ │ ├── popular │ │ │ ├── [category].js │ │ │ └── index.js │ │ └── trending │ │ │ └── index.js │ ├── for │ │ ├── developers.js │ │ └── teams.js │ ├── greatest-developer-portfolio-ever.js │ ├── hackathon │ │ ├── competition.js │ │ ├── competition1 │ │ │ └── index.js │ │ └── entries │ │ │ └── index.js │ ├── hangout │ │ ├── [topic] │ │ │ └── index.js │ │ └── index.js │ ├── index.js │ ├── invite │ │ └── [code].js │ ├── login │ │ ├── forgotpassword.js │ │ └── index.js │ ├── maintenance.js │ ├── post │ │ └── index.js │ ├── privacy-policy.js │ ├── privacy.js │ ├── resources │ │ └── contact │ │ │ └── [type].js │ ├── search │ │ └── index.js │ ├── signup │ │ └── index.js │ ├── teams │ │ ├── [teamId] │ │ │ ├── index.js │ │ │ └── jobs │ │ │ │ └── [jobId].js │ │ └── index.js │ ├── u │ │ ├── [userId].js │ │ └── [userId] │ │ │ ├── [postId].js │ │ │ └── project │ │ │ └── [postId].js │ ├── upgrade.js │ └── verifyemail.js ├── styles │ ├── globals.css │ └── mde-editor.css └── utils │ ├── fetcher.js │ ├── mail │ └── sendMail.js │ ├── signup │ └── signUpSteps.js │ ├── slack │ └── sendMessageSlack.js │ └── stripe │ └── getStripe.js ├── tailwind.config.js └── tsconfig.json /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | node: true, 6 | }, 7 | extends: [ 8 | 'eslint:recommended', 9 | 'plugin:react/recommended', 10 | 'plugin:prettier/recommended', 11 | 'next', 12 | ], 13 | parserOptions: { 14 | ecmaFeatures: { 15 | jsx: true, 16 | }, 17 | ecmaVersion: 12, 18 | sourceType: 'module', 19 | }, 20 | plugins: ['react'], 21 | rules: { 22 | 'react/react-in-jsx-scope': 'off', 23 | // allow jsx syntax in js files (for next.js project) 24 | 'react/jsx-filename-extension': [1, { extensions: ['.js', '.jsx'] }], 25 | 'react/prop-types': 'off', 26 | '@next/next/no-img-element': 'off', 27 | '@next/next/link-passhref': 'off', 28 | 'react-hooks/rules-of-hooks': 'off', 29 | '@next/next/inline-script-id': 'off', 30 | 'no-unused-vars': 'off', 31 | 'prettier/prettier': [ 32 | 'warn', 33 | { 34 | singleQuote: true, 35 | semi: true, 36 | }, 37 | ], 38 | }, 39 | }; 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | /.pnp 4 | .pnp.js 5 | 6 | # testing 7 | /coverage 8 | 9 | # next.js 10 | /.next/ 11 | /out/ 12 | 13 | # production 14 | /build 15 | 16 | # misc 17 | .DS_Store 18 | *.pem 19 | 20 | # debug 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | 25 | # local env files 26 | .env 27 | .env.local 28 | .env.development.local 29 | .env.test.local 30 | .env.production.local 31 | .env.production.sample 32 | 33 | # vercel 34 | .vercel 35 | 36 | # sw 37 | sw.js* 38 | workbox-* 39 | 40 | .vscode 41 | 42 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": true, 4 | "endOfLine": "lf", 5 | "plugins": ["prettier-plugin-tailwindcss"], 6 | "trailingComma": "es5" 7 | } 8 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./src/", 4 | "allowJs": true 5 | }, 6 | "exclude": ["node_modules"] 7 | } 8 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/assets/email/absurd/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/01.png -------------------------------------------------------------------------------- /public/assets/email/absurd/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/02.png -------------------------------------------------------------------------------- /public/assets/email/absurd/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/03.png -------------------------------------------------------------------------------- /public/assets/email/absurd/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/04.png -------------------------------------------------------------------------------- /public/assets/email/absurd/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/05.png -------------------------------------------------------------------------------- /public/assets/email/absurd/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/06.png -------------------------------------------------------------------------------- /public/assets/email/absurd/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/07.png -------------------------------------------------------------------------------- /public/assets/email/absurd/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/08.png -------------------------------------------------------------------------------- /public/assets/email/absurd/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/09.png -------------------------------------------------------------------------------- /public/assets/email/absurd/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/10.png -------------------------------------------------------------------------------- /public/assets/email/absurd/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/absurd/11.png -------------------------------------------------------------------------------- /public/assets/email/email-logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/email/email-logo-black.png -------------------------------------------------------------------------------- /public/assets/icons/thefullstack-circle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/icons/thefullstack-circle.webp -------------------------------------------------------------------------------- /public/assets/icons/thefullstack-dark-circle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/icons/thefullstack-dark-circle.webp -------------------------------------------------------------------------------- /public/assets/icons/thefullstack-dark-square.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/icons/thefullstack-dark-square.webp -------------------------------------------------------------------------------- /public/assets/icons/thefullstack-dark.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/icons/thefullstack-dark.webp -------------------------------------------------------------------------------- /public/assets/icons/thefullstack-light-circle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/icons/thefullstack-light-circle.webp -------------------------------------------------------------------------------- /public/assets/icons/thefullstack-light-square.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/icons/thefullstack-light-square.webp -------------------------------------------------------------------------------- /public/assets/icons/thefullstack-light.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/icons/thefullstack-light.webp -------------------------------------------------------------------------------- /public/assets/landing/about/ei.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/about/ei.webp -------------------------------------------------------------------------------- /public/assets/landing/about/henrique.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/about/henrique.webp -------------------------------------------------------------------------------- /public/assets/landing/about/jamie.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/about/jamie.webp -------------------------------------------------------------------------------- /public/assets/landing/about/ndrc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/about/ndrc.webp -------------------------------------------------------------------------------- /public/assets/landing/about/nodes.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/about/nodes.webp -------------------------------------------------------------------------------- /public/assets/landing/about/noel.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/about/noel.webp -------------------------------------------------------------------------------- /public/assets/landing/about/phil.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/about/phil.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/logo-fb.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/logo-fb.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/logo-meta.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/logo-meta.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/preview-poster.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/preview-poster.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-adityar.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-adityar.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-ciaran.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-ciaran.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-cjcon90.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-cjcon90.jpeg -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-davide.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-davide.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-dylan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-dylan.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-eric.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-eric.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-foodcloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-foodcloud.png -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-foodcloud.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-foodcloud.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-griffin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-griffin.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-gyanendra.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-gyanendra.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-sands.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-sands.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-seth.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-seth.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-sojin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-sojin.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-takanomedev.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-takanomedev.webp -------------------------------------------------------------------------------- /public/assets/landing/engineers/testimonial-xinor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/engineers/testimonial-xinor.webp -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/crying-face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/crying-face.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/handshake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/handshake.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/laughing-face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/laughing-face.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/nerd-face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/nerd-face.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/raising-hands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/raising-hands.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/screen-hangout.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/screen-hangout.webp -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/screen-profile.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/screen-profile.webp -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/screen-project.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/screen-project.webp -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/screen-showcase.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/screen-showcase.webp -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/screen-teams.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/screen-teams.webp -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/screen1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/screen1.webp -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/smiling-face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/smiling-face.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/thinking-face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/thinking-face.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/thumbs-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/thumbs-down.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/thumbs-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/thumbs-up.png -------------------------------------------------------------------------------- /public/assets/landing/fordevelopers/worried-face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/fordevelopers/worried-face.png -------------------------------------------------------------------------------- /public/assets/landing/forteams/screen-jobs.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/forteams/screen-jobs.webp -------------------------------------------------------------------------------- /public/assets/landing/forteams/screen-teammates.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/forteams/screen-teammates.webp -------------------------------------------------------------------------------- /public/assets/landing/forteams/screen-teams.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/forteams/screen-teams.webp -------------------------------------------------------------------------------- /public/assets/landing/forteams/screen-tools.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/forteams/screen-tools.webp -------------------------------------------------------------------------------- /public/assets/landing/hackathon/competition-cover.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/hackathon/competition-cover.webp -------------------------------------------------------------------------------- /public/assets/landing/hackathon/og.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/hackathon/og.webp -------------------------------------------------------------------------------- /public/assets/landing/hackathon/voting-cover.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/hackathon/voting-cover.gif -------------------------------------------------------------------------------- /public/assets/landing/main/computer2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/main/computer2.webp -------------------------------------------------------------------------------- /public/assets/landing/main/dev-portfolio-og.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/landing/main/dev-portfolio-og.webp -------------------------------------------------------------------------------- /public/assets/og-thefullstack-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/og-thefullstack-2.png -------------------------------------------------------------------------------- /public/assets/og-thefullstack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/og-thefullstack.png -------------------------------------------------------------------------------- /public/assets/profile/user/avatar-notfound.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/profile/user/avatar-notfound.webp -------------------------------------------------------------------------------- /public/assets/profile/user/user-not-exist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/profile/user/user-not-exist.png -------------------------------------------------------------------------------- /public/assets/thefullstack-dark-new-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/thefullstack-dark-new-icon.png -------------------------------------------------------------------------------- /public/assets/thefullstack-dark-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/thefullstack-dark-new.png -------------------------------------------------------------------------------- /public/assets/thefullstack-icon.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/thefullstack-icon.webp -------------------------------------------------------------------------------- /public/assets/wallet/money.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/assets/wallet/money.gif -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/favicon.ico -------------------------------------------------------------------------------- /public/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/icons/icon-192x192.png -------------------------------------------------------------------------------- /public/icons/icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/icons/icon-256x256.png -------------------------------------------------------------------------------- /public/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/icons/icon-384x384.png -------------------------------------------------------------------------------- /public/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thefullstackgroup/webapp/e0de5d40ab639eaee277a3817ffa765f580992a8/public/icons/icon-512x512.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme_color": "#18191c", 3 | "background_color": "#fff", 4 | "display": "standalone", 5 | "scope": "/", 6 | "start_url": "/", 7 | "name": "thefullstack", 8 | "short_name": "thefullstack", 9 | "description": "Where Reddit meets GitHub, a space where developers connect with like-minded developers to show off projects, learn and hang out.", 10 | "icons": [ 11 | { 12 | "src": "/icons/icon-192x192.png", 13 | "sizes": "192x192", 14 | "type": "image/png", 15 | "purpose": "any maskable" 16 | }, 17 | { 18 | "src": "/icons/icon-256x256.png", 19 | "sizes": "256x256", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "/icons/icon-384x384.png", 24 | "sizes": "384x384", 25 | "type": "image/png" 26 | }, 27 | { 28 | "src": "/icons/icon-512x512.png", 29 | "sizes": "512x512", 30 | "type": "image/png" 31 | } 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | Disallow: /api 4 | 5 | User-agent: SiteCheckerBotCrawler 6 | Disallow: / 7 | 8 | User-agent: sitechecker.pro 9 | Disallow:/ 10 | 11 | Sitemap: http://thefullstack.network/sitemap.xml -------------------------------------------------------------------------------- /scripts/detect-unused.js: -------------------------------------------------------------------------------- 1 | // scripts/detect-unused.js 2 | const madge = require('madge'); 3 | const path = require('path'); 4 | 5 | function pruneTree(subtree, tree) { 6 | if (!subtree || subtree.length === 0) return; 7 | for (let child of subtree) { 8 | const nextSubtree = tree[child]; 9 | if (tree[child]) { 10 | delete tree[child]; 11 | } 12 | pruneTree(nextSubtree, tree); 13 | } 14 | } 15 | 16 | madge(path.join(__dirname, '..'), { 17 | baseDir: path.join(__dirname, '..'), 18 | excludeRegExp: [ 19 | /^\.next[\\/]/, // Ignore built artifacts 20 | /^next\.config\.js/, // Ignore Next.js configuration 21 | /^scripts[\\/]/, // Ignore scripts (where this file lives) 22 | ], 23 | }).then((res) => { 24 | const tree = res.obj(); 25 | 26 | const entrypoints = Object.keys(tree).filter( 27 | (e) => e.startsWith('pages/') || e.startsWith('pages\\') 28 | ); 29 | pruneTree(entrypoints, tree); 30 | 31 | const unusedFiles = Object.keys(tree); 32 | if (unusedFiles.length) { 33 | console.log( 34 | `⚠️ Found ${unusedFiles.length} files that no one is depending on, please consider removing:` 35 | ); 36 | unusedFiles.forEach((file) => { 37 | console.log('\x1b[33m%s\x1b[0m', file); 38 | }); 39 | process.exit(1); 40 | } else { 41 | console.log('🎉 No used files!'); 42 | process.exit(0); 43 | } 44 | }); 45 | -------------------------------------------------------------------------------- /src/components/common/buttons/Comment.js: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import ToolTip from 'components/common/elements/ToolTip'; 3 | import NewComment from 'components/modules/comments/NewComment'; 4 | import Icon from '../elements/Icon'; 5 | 6 | const ButtonComment = ({ 7 | user, 8 | post, 9 | action = false, 10 | showLabel = false, 11 | toolTipPosition = 'top', 12 | }) => { 13 | const [show, setShow] = useState(false); 14 | 15 | const handleComment = () => { 16 | if (action) { 17 | action(true); 18 | } else { 19 | setShow(!show); 20 | } 21 | }; 22 | 23 | return ( 24 | <> 25 | 39 | 40 | {user && ( 41 | 42 | )} 43 | 44 | ); 45 | }; 46 | 47 | export default ButtonComment; 48 | -------------------------------------------------------------------------------- /src/components/common/buttons/Mode.js: -------------------------------------------------------------------------------- 1 | import { useTheme } from 'next-themes'; 2 | import Icon from '../elements/Icon'; 3 | import { useEffect, useState } from 'react'; 4 | import { FiMoon, FiSun } from 'react-icons/fi'; 5 | 6 | const Mode = () => { 7 | const { systemTheme, theme, setTheme } = useTheme(); 8 | const [mode, setMode] = useState(''); 9 | 10 | useEffect(() => { 11 | const currentTheme = theme === 'system' ? systemTheme : theme; 12 | if (theme) setMode(currentTheme); 13 | }, [theme]); 14 | 15 | return ( 16 | 26 | ); 27 | }; 28 | 29 | export default Mode; 30 | -------------------------------------------------------------------------------- /src/components/common/elements/CodeBlock.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; 3 | import { dracula } from 'react-syntax-highlighter/dist/cjs/styles/prism'; 4 | 5 | const Block = ({ className, children }) => { 6 | let lang = 'text'; // default monospaced text 7 | if (className && className.startsWith('lang-')) { 8 | lang = className.replace('lang-', ''); 9 | } 10 | return ( 11 | 12 | {children} 13 | 14 | ); 15 | }; 16 | 17 | const CodeBlock = ({ children, ...rest }) => { 18 | if ('type' in children && children['type'] === 'code') { 19 | return Block(children['props']); 20 | } 21 | return
{children}
; 22 | }; 23 | 24 | export default CodeBlock; 25 | -------------------------------------------------------------------------------- /src/components/common/elements/CountrySelect.js: -------------------------------------------------------------------------------- 1 | import { CountryDropdown } from 'react-country-region-selector'; 2 | 3 | const CountrySelect = ({ countryName, setCountryName }) => { 4 | return ( 5 | setCountryName(val)} 8 | className="text-input dark:bg-black" 9 | /> 10 | ); 11 | }; 12 | 13 | export default CountrySelect; 14 | -------------------------------------------------------------------------------- /src/components/common/elements/DividerShowMore.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | import Icon from './Icon'; 3 | 4 | const DividerShowMore = ({ label, href }) => { 5 | return ( 6 |
7 |
8 |
9 |
10 | 21 |
22 | ); 23 | }; 24 | 25 | export default DividerShowMore; 26 | -------------------------------------------------------------------------------- /src/components/common/elements/Icon.js: -------------------------------------------------------------------------------- 1 | import { createElement } from 'react'; 2 | import * as FiIcons from 'react-icons/fi'; 3 | import * as FaIcons from 'react-icons/fa'; 4 | import * as SiIcons from 'react-icons/si'; 5 | import * as IoIcons from 'react-icons/io5'; 6 | 7 | const Icon = ({ name, pack = 'Fi', className }) => { 8 | let style = 'h-5 w-5'; 9 | if (className) style = className; 10 | 11 | let icon = ''; 12 | 13 | if (pack === 'Fi') { 14 | icon = createElement(FiIcons[name], { 15 | className: style, 16 | }); 17 | } 18 | 19 | if (pack === 'Si') { 20 | icon = createElement(SiIcons[name], { 21 | className: style, 22 | }); 23 | } 24 | 25 | if (pack === 'Fa') { 26 | icon = createElement(FaIcons[name], { 27 | className: style, 28 | }); 29 | } 30 | 31 | if (pack === 'Io') { 32 | icon = createElement(IoIcons[name], { 33 | className: style, 34 | }); 35 | } 36 | 37 | return icon; 38 | }; 39 | 40 | export default Icon; 41 | -------------------------------------------------------------------------------- /src/components/common/elements/Loader.js: -------------------------------------------------------------------------------- 1 | import { Ring } from '@uiball/loaders'; 2 | 3 | const Loader = () => { 4 | return ; 5 | }; 6 | 7 | export default Loader; 8 | -------------------------------------------------------------------------------- /src/components/common/elements/MarkdownContent.js: -------------------------------------------------------------------------------- 1 | import dynamic from 'next/dynamic'; 2 | import '@uiw/react-markdown-preview/markdown.css'; 3 | const MarkdownPreview = dynamic( 4 | () => import('@uiw/react-markdown-preview').then((mod) => mod.default), 5 | { ssr: false } 6 | ); 7 | import rehypeHighlight from 'rehype-highlight'; 8 | import { useTheme } from 'next-themes'; 9 | 10 | const MarkdownContent = ({ content }) => { 11 | const { systemTheme, theme } = useTheme(); 12 | const currentTheme = theme === 'system' ? systemTheme : theme; 13 | 14 | return ( 15 | 22 | ); 23 | }; 24 | 25 | export default MarkdownContent; 26 | -------------------------------------------------------------------------------- /src/components/common/elements/SelectEmoji.js: -------------------------------------------------------------------------------- 1 | import EmojiPicker from 'emoji-picker-react'; 2 | import { useTheme } from 'next-themes'; 3 | import ModalAlert from '../modals/ModalAlert'; 4 | 5 | const SelectEmoji = ({ show, setShow, text, setText }) => { 6 | const { systemTheme, theme, setTheme } = useTheme(); 7 | const currentTheme = theme === 'system' ? systemTheme : theme; 8 | 9 | const onEmojiClick = (e) => { 10 | let sym = e.unified.split('-'); 11 | let codesArray = []; 12 | sym.forEach((el) => codesArray.push('0x' + el)); 13 | let emoji = String.fromCodePoint(...codesArray); 14 | setText(text + emoji); 15 | setShow(false); 16 | }; 17 | 18 | return ( 19 | 26 |
27 | 34 |
35 |
36 | ); 37 | }; 38 | 39 | export default SelectEmoji; 40 | -------------------------------------------------------------------------------- /src/components/common/elements/SignOutPrompt.js: -------------------------------------------------------------------------------- 1 | import ModalAlert from '../modals/ModalAlert'; 2 | import Image from 'next/future/image'; 3 | import { useRouter } from 'next/router'; 4 | import axios from 'axios'; 5 | import { useAuthUser } from 'next-firebase-auth'; 6 | 7 | const SignOutPrompt = ({ show, setShow }) => { 8 | const AuthUser = useAuthUser(); 9 | const router = useRouter(); 10 | 11 | const handleLogout = async () => { 12 | await AuthUser.signOut(); 13 | await axios.get(`/api/auth/logout`); 14 | router.reload('/'); 15 | }; 16 | 17 | return ( 18 | 19 |
20 |
21 |

We will miss you

22 | User not found 29 |

Don't forget to come back...

30 |
31 | 39 |
40 |
41 |
42 |
43 | ); 44 | }; 45 | 46 | export default SignOutPrompt; 47 | -------------------------------------------------------------------------------- /src/components/common/elements/SignUpPrompt.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | import Icon from './Icon'; 3 | import ModalAlert from '../modals/ModalAlert'; 4 | import { useRouter } from 'next/router'; 5 | 6 | const SignUpPrompt = ({ show, setShow }) => { 7 | const router = useRouter(); 8 | return ( 9 | 10 |
11 |
12 |

13 | Join us at The Full Stack 14 |

15 |

16 | Join us and thousands of developers who have discovered a place to 17 | show off projects and grow a network. 18 |

19 |
20 | 21 | 22 | Sign up 23 | 24 | 25 | 35 | 36 | Login 37 | 38 | 39 |
40 |
41 |
42 |
43 | ); 44 | }; 45 | 46 | export default SignUpPrompt; 47 | -------------------------------------------------------------------------------- /src/components/common/elements/ToolTip.js: -------------------------------------------------------------------------------- 1 | const ToolTip = ({ position, message }) => { 2 | let yPostion = '-top-8 before:top-full before:border-t-base-600'; 3 | if (position === 'bottom') 4 | yPostion = '-bottom-8 before:bottom-full before:border-b-base-600'; 5 | 6 | return ( 7 | 12 | ); 13 | }; 14 | 15 | export default ToolTip; 16 | -------------------------------------------------------------------------------- /src/components/common/elements/mux/ErrorMessage.js: -------------------------------------------------------------------------------- 1 | const ErrorMessage = ({ message }) => { 2 | return ( 3 | <> 4 |
{message || 'Unknown error'}
5 | 14 | 15 | ); 16 | }; 17 | 18 | export default ErrorMessage; 19 | -------------------------------------------------------------------------------- /src/components/common/elements/mux/VideoPlayer.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | import Hls from 'hls.js'; 3 | 4 | const VideoPlayer = ({ 5 | src, 6 | poster, 7 | controls = true, 8 | muted = false, 9 | autoPlay = false, 10 | }) => { 11 | const videoRef = useRef(null); 12 | 13 | useEffect(() => { 14 | const video = videoRef.current; 15 | if (!video) return; 16 | 17 | video.muted = muted; 18 | video.controls = controls; 19 | 20 | let hls; 21 | 22 | if (video.canPlayType('application/vnd.apple.mpegurl')) { 23 | video.src = src; 24 | video.addEventListener('canplay', function () {}); 25 | video.addEventListener('ended', () => {}); 26 | video.play(); 27 | } else if (Hls.isSupported()) { 28 | hls = new Hls(); 29 | hls.loadSource(src); 30 | hls.attachMedia(video); 31 | video.addEventListener('canplay', function () {}); 32 | video.addEventListener('ended', () => {}); 33 | video.play(); 34 | } else { 35 | console.error( 36 | 'This is an old browser that does not support MSE https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API' 37 | ); 38 | } 39 | 40 | return () => { 41 | if (hls) { 42 | hls.destroy(); 43 | } 44 | }; 45 | }, [src, videoRef]); 46 | 47 | return ( 48 | <> 49 |