From 9075f9441c863387644bc918e70433b99df8fda2 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Thu, 26 Jan 2023 23:42:20 +0530 Subject: [PATCH] Refactoring Phase 1 (#199) * style: added cta at the bottom of sidebar, added missing icons as well, showing dynamic workspace member count on workspace dropdown * refractor: running parallel request, made create/edit label function to async function * fix: sidebar dropdown content going below kanban items outside click detection in need help dropdown * refractor: making parallel api calls fix: create state input comes at bottom, create state input gets on focus automatically, form is getting submitted on enter click * refactoring file structure and signin page * style: changed text and added spinner for signing in loading * refractor: removed unused type * fix: my issue cta in profile page sending to 404 page * fix: added new s3 bucket url in next.config.js file increased image modal height * packaging UI components * eslint config * eslint fixes * refactoring changes * build fixes * minor fixes * adding todo comments for reference * refactor: cleared unused imports and re ordered imports * refactor: removed unused imports * fix: added workspace argument to useissues hook * refactor: removed api-routes file, unnecessary constants * refactor: created helpers folder, removed unnecessary constants * refactor: new context for issue view * refactoring issues page * build fixes * refactoring * refactor: create issue modal * refactor: module ui * fix: sub-issues mutation * fix: create more option in create issue modal * description form debounce issue * refactor: global component for assignees list * fix: link module interface * fix: priority icons and sub-issues count added * fix: cycle mutation in issue details page * fix: remove issue from cycle mutation * fix: create issue modal in home page * fix: removed unnecessary props * fix: updated create issue form status * fix: settings auth breaking * refactor: issue details page Co-authored-by: Dakshesh Jain Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Co-authored-by: venkatesh-soulpage Co-authored-by: Aaryan Khandelwal Co-authored-by: Anmol Singh Bhatia --- .eslintrc.js | 10 + .eslintrc.json | 3 - apps/app/.eslintrc.js | 1 + apps/app/Dockerfile.web | 2 +- .../email-code-form.tsx} | 29 +- .../email-password-form.tsx} | 29 +- .../components/account/email-signin-form.tsx | 46 + .../account/github-login-button.tsx | 51 + .../google-login.tsx | 11 +- apps/app/components/account/index.ts | 5 + .../{ui => components}/breadcrumbs/index.tsx | 40 +- apps/app/components/command-palette/index.tsx | 67 +- .../components/command-palette/shortcuts.tsx | 18 +- .../common/board-view/board-header.tsx | 109 + .../common/board-view/single-board.tsx | 4 +- .../common/board-view/single-issue.tsx | 119 +- .../common/bulk-delete-issues-modal.tsx | 295 +- .../common/existing-issues-list-modal.tsx | 84 +- .../components/common/image-upload-modal.tsx | 18 +- .../common/list-view/single-issue.tsx | 324 +- .../components/core/not-authorized-view.tsx | 4 +- apps/app/components/core/view.tsx | 227 +- apps/app/components/cycles/form.tsx | 135 + apps/app/components/cycles/index.ts | 3 + apps/app/components/cycles/modal.tsx | 112 + apps/app/components/cycles/select.tsx | 131 + .../components/dnd/StrictModeDroppable.tsx | 3 +- .../emoji-icon-picker/emojis.json | 0 .../emoji-icon-picker/helpers.ts | 0 .../emoji-icon-picker/index.tsx | 15 +- .../emoji-icon-picker/types.d.ts | 0 .../icons/attachment-icon.tsx | 4 +- .../{ui => components}/icons/blocked-icon.tsx | 4 +- .../{ui => components}/icons/blocker-icon.tsx | 4 +- .../{ui => components}/icons/bolt-icon.tsx | 4 +- .../icons/calendar-month-icon.tsx | 4 +- .../{ui => components}/icons/cancel-icon.tsx | 4 +- .../icons/clipboard-icon.tsx | 4 +- .../{ui => components}/icons/comment-icon.tsx | 4 +- .../icons/completed-cycle-icon.tsx | 4 +- .../icons/current-cycle-icon.tsx | 4 +- .../{ui => components}/icons/cycle-icon.tsx | 4 +- .../{ui => components}/icons/discord-icon.tsx | 6 +- .../icons/document-icon.tsx | 4 +- .../{ui => components}/icons/edit-icon.tsx | 4 +- .../icons/ellipsis-horizontal-icon.tsx | 4 +- .../{ui => components}/icons/github-icon.tsx | 10 +- .../icons/heartbeat-icon.tsx | 4 +- apps/app/{ui => components}/icons/index.ts | 0 .../icons/layer-diagonal-icon.tsx | 4 +- .../{ui => components}/icons/lock-icon.tsx | 4 +- .../{ui => components}/icons/menu-icon.tsx | 4 +- .../{ui => components}/icons/plus-icon.tsx | 4 +- .../icons/question-mark-circle-icon.tsx | 4 +- .../{ui => components}/icons/setting-icon.tsx | 4 +- .../icons/signal-cellular-icon.tsx | 4 +- .../app/{ui => components}/icons/tag-icon.tsx | 4 +- .../{ui => components}/icons/tune-icon.tsx | 4 +- apps/app/{ui => components}/icons/types.d.ts | 0 .../icons/upcoming-cycle-icon.tsx | 4 +- .../icons/user-group-icon.tsx | 4 +- .../icons/user-icon-circle.tsx | 4 +- .../{ui => components}/icons/user-icon.tsx | 4 +- .../components/issues/description-form.tsx | 74 + apps/app/components/issues/form.tsx | 382 + apps/app/components/issues/index.ts | 5 + apps/app/components/issues/list-item.tsx | 144 + apps/app/components/issues/modal.tsx | 265 + .../app/components/issues/select/assignee.tsx | 166 + apps/app/components/issues/select/index.ts | 6 + apps/app/components/issues/select/label.tsx | 206 + .../components/issues/select/parent-issue.tsx | 28 + .../app/components/issues/select/priority.tsx | 54 + apps/app/components/issues/select/project.tsx | 104 + apps/app/components/issues/select/state.tsx | 138 + apps/app/components/issues/sub-issue-list.tsx | 168 + .../onboarding/break-into-modules.tsx | 6 +- .../components/onboarding/command-menu.tsx | 4 +- .../components/onboarding/invite-members.tsx | 9 +- .../onboarding/move-with-cycles.tsx | 6 +- .../onboarding/plan-with-issues.tsx | 6 +- .../components/onboarding/user-details.tsx | 6 +- apps/app/components/onboarding/welcome.tsx | 4 +- apps/app/components/onboarding/workspace.tsx | 20 +- .../{member-invitations.tsx => card.tsx} | 45 +- .../project/confirm-project-deletion.tsx | 18 +- .../project/confirm-project-member-remove.tsx | 2 +- .../project/create-project-modal.tsx | 26 +- .../project/cycles/board-view/index.tsx | 60 +- .../cycles/board-view/single-board.tsx | 106 +- .../project/cycles/confirm-cycle-deletion.tsx | 17 +- .../cycles/create-update-cycle-modal.tsx | 18 +- .../cycles/cycle-detail-sidebar/index.tsx | 40 +- .../project/cycles/list-view/index.tsx | 47 +- .../project/cycles/stats-view/index.tsx | 2 +- .../project/cycles/stats-view/single-stat.tsx | 70 +- apps/app/components/project/index.ts | 3 + .../project/issues/BoardView/index.tsx | 58 +- .../project/issues/BoardView/single-board.tsx | 132 +- .../BoardView/state/confirm-state-delete.tsx | 21 +- .../state/create-update-state-inline.tsx | 81 +- .../state/create-update-state-modal.tsx | 10 +- .../project/issues/confirm-issue-deletion.tsx | 22 +- .../create-update-issue-modal/index.tsx | 602 -- .../select-assignee.tsx | 62 - .../select-cycle.tsx | 71 - .../select-labels.tsx | 137 - .../select-parent-issue.tsx | 37 - .../select-priority.tsx | 46 - .../select-project.tsx | 116 - .../select-state.tsx | 73 - .../issues/issue-detail/activity/index.tsx | 35 +- .../issues/issue-detail/add-as-sub-issue.tsx | 29 +- .../comment/issue-comment-card.tsx | 17 +- .../comment/issue-comment-section.tsx | 18 +- .../issue-detail-sidebar/index.tsx | 59 +- .../issue-detail-sidebar/select-assignee.tsx | 69 +- .../issue-detail-sidebar/select-blocked.tsx | 215 +- .../issue-detail-sidebar/select-blocker.tsx | 261 +- .../issue-detail-sidebar/select-cycle.tsx | 109 +- .../issue-detail-sidebar/select-module.tsx | 19 +- .../issue-detail-sidebar/select-parent.tsx | 7 +- .../issue-detail-sidebar/select-priority.tsx | 96 +- .../issue-detail-sidebar/select-state.tsx | 22 +- .../project/issues/issues-list-modal.tsx | 38 +- .../project/issues/list-view/index.tsx | 444 +- ...Dropdown.tsx => change-state-dropdown.tsx} | 30 +- .../components/project/join-project-modal.tsx | 6 +- apps/app/components/project/join-project.tsx | 25 + .../project/modules/board-view/index.tsx | 38 +- .../modules/board-view/single-board.tsx | 117 +- .../modules/confirm-module-deletion.tsx | 4 +- .../create-update-module-modal/index.tsx | 14 +- .../select-lead.tsx | 32 +- .../select-members.tsx | 32 +- .../select-status.tsx | 20 +- .../project/modules/list-view/index.tsx | 49 +- .../modules/module-detail-sidebar/index.tsx | 46 +- .../module-detail-sidebar/select-lead.tsx | 17 +- .../module-detail-sidebar/select-members.tsx | 18 +- .../module-detail-sidebar/select-status.tsx | 99 +- .../project/modules/module-link-modal.tsx | 17 +- .../project/modules/single-module-card.tsx | 42 +- .../project/send-project-invitation-modal.tsx | 24 +- .../project/settings/single-label.tsx | 47 +- apps/app/components/project/sidebar-list.tsx | 208 + .../app/components/rich-text-editor/index.tsx | 71 +- .../rich-text-editor/mention-autocomplete.tsx | 35 +- .../components/rich-text-editor/sample.tsx | 6 +- .../toolbar/heading-controls.tsx | 2 +- .../rich-text-editor/toolbar/index.tsx | 52 +- .../search-listbox/index.tsx | 19 +- .../search-listbox/types.d.ts | 0 apps/app/components/sidebar/projects-list.tsx | 52 +- .../components/sidebar/workspace-options.tsx | 212 - apps/app/components/toast-alert/index.tsx | 12 +- apps/app/components/ui/avatar/avatar.tsx | 90 + apps/app/components/ui/avatar/index.ts | 1 + apps/app/components/ui/button/index.tsx | 62 + .../components/ui/custom-listbox/index.tsx | 122 + .../ui/custom-listbox/types.d.ts | 1 - apps/app/components/ui/custom-menu/index.tsx | 123 + .../ui/custom-menu/types.d.ts | 0 .../app/components/ui/custom-select/index.tsx | 99 + apps/app/components/ui/empty-space/index.tsx | 79 + .../app/components/ui/header-button/index.tsx | 33 + apps/app/components/ui/index.ts | 15 + apps/app/components/ui/input/index.tsx | 50 + apps/app/{ => components}/ui/input/types.d.ts | 6 +- apps/app/components/ui/loader/index.tsx | 29 + apps/app/{ => components}/ui/modal/index.tsx | 6 +- .../{ => components}/ui/multi-input/index.tsx | 13 +- .../components/ui/outline-button/index.tsx | 62 + apps/app/{ => components}/ui/select/index.tsx | 16 +- .../app/{ => components}/ui/select/types.d.ts | 4 +- .../app/{ => components}/ui/spinner/index.tsx | 12 +- .../{ => components}/ui/text-area/index.tsx | 47 +- .../{ => components}/ui/text-area/types.d.ts | 0 .../app/{ => components}/ui/tooltip/index.tsx | 6 +- .../workspace/confirm-workspace-deletion.tsx | 10 +- .../confirm-workspace-member-remove.tsx | 2 +- .../app/components/workspace/help-section.tsx | 140 + .../components/workspace/home-cards-list.tsx | 37 + .../components/workspace/home-greetings.tsx | 31 + apps/app/components/workspace/index.ts | 5 + .../send-workspace-invitation-modal.tsx | 12 +- .../components/workspace/sidebar-dropdown.tsx | 214 + .../app/components/workspace/sidebar-menu.tsx | 71 + apps/app/constants/api-routes.ts | 149 - apps/app/constants/common.ts | 238 - apps/app/constants/fetch-keys.ts | 4 + apps/app/constants/index.ts | 1 - apps/app/constants/{seo => }/seo-variables.ts | 0 apps/app/constants/theme.context.constants.ts | 7 - apps/app/constants/toast.context.constants.ts | 2 - apps/app/contexts/issue-view.context.tsx | 283 + apps/app/contexts/theme.context.tsx | 249 +- apps/app/contexts/toast.context.tsx | 14 +- apps/app/contexts/user.context.tsx | 2 +- apps/app/contexts/workspace.context.tsx | 51 + apps/app/helpers/array.helper.ts | 27 + apps/app/helpers/date-time.helper.ts | 78 + apps/app/helpers/functions.helper.ts | 37 + apps/app/helpers/string.helper.ts | 87 + apps/app/hooks/use-debounce.tsx | 19 + .../use-issue-properties.tsx} | 17 +- .../use-issue-view.tsx} | 39 +- apps/app/hooks/use-issues.tsx | 22 + .../use-local-storage.tsx} | 1 + .../use-my-issues-filter.tsx} | 22 +- .../use-outside-click-detector.tsx} | 0 apps/app/hooks/use-project-members.tsx | 33 + apps/app/hooks/use-projects.tsx | 31 + .../useTheme.tsx => hooks/use-theme.tsx} | 2 - .../useToast.tsx => hooks/use-toast.tsx} | 2 - .../hooks/useUser.tsx => hooks/use-user.tsx} | 2 +- apps/app/hooks/use-workspace-details.tsx | 37 + apps/app/hooks/use-workspaces.tsx | 31 + apps/app/layouts/app-layout.tsx | 118 - apps/app/layouts/app-layout/app-header.tsx | 37 + apps/app/layouts/app-layout/app-sidebar.tsx | 44 + apps/app/layouts/app-layout/index.tsx | 120 + apps/app/layouts/container.tsx | 3 +- apps/app/layouts/default-layout.tsx | 19 +- apps/app/layouts/navbar/header.tsx | 2 +- apps/app/layouts/navbar/main-sidebar.tsx | 21 +- apps/app/layouts/settings-layout.tsx | 6 +- apps/app/lib/auth.ts | 42 +- apps/app/lib/cookie.ts | 1 + apps/app/lib/hoc/withAuthWrapper.tsx | 33 - apps/app/lib/hooks/useAutosizeTextArea.tsx | 21 - apps/app/lib/redirect.ts | 3 +- apps/app/lib/services/project.service.ts | 248 - apps/app/lib/services/state.service.ts | 98 - apps/app/manifest.json | 32 + apps/app/next.config.js | 29 +- apps/app/package.json | 25 +- apps/app/pages/404.tsx | 62 +- apps/app/pages/[workspaceSlug]/index.tsx | 188 +- .../pages/[workspaceSlug]/me/my-issues.tsx | 85 +- apps/app/pages/[workspaceSlug]/me/profile.tsx | 52 +- .../[workspaceSlug]/me/workspace-invites.tsx | 24 +- apps/app/pages/[workspaceSlug]/members.tsx | 312 - .../projects/[projectId]/cycles/[cycleId].tsx | 175 +- .../projects/[projectId]/cycles/index.tsx | 27 +- .../projects/[projectId]/issues/[issueId].tsx | 346 +- .../projects/[projectId]/issues/index.tsx | 219 +- .../projects/[projectId]/members.tsx | 346 - .../[projectId]/modules/[moduleId].tsx | 146 +- .../projects/[projectId]/modules/index.tsx | 25 +- .../projects/[projectId]/settings/control.tsx | 11 +- .../projects/[projectId]/settings/index.tsx | 53 +- .../projects/[projectId]/settings/labels.tsx | 67 +- .../projects/[projectId]/settings/members.tsx | 31 +- .../projects/[projectId]/settings/states.tsx | 83 +- .../pages/[workspaceSlug]/projects/index.tsx | 64 +- .../[workspaceSlug]/settings/billing.tsx | 10 +- .../[workspaceSlug]/settings/features.tsx | 16 +- .../pages/[workspaceSlug]/settings/index.tsx | 42 +- .../[workspaceSlug]/settings/members.tsx | 31 +- apps/app/pages/_app.tsx | 10 +- apps/app/pages/_document.tsx | 22 + apps/app/pages/api/hello.ts | 13 - .../index.tsx} | 19 +- apps/app/pages/error.tsx | 4 +- apps/app/pages/index.tsx | 4 +- .../index.tsx} | 39 +- .../index.tsx} | 10 +- .../{onboarding.tsx => onboarding/index.tsx} | 6 +- apps/app/pages/signin.tsx | 184 +- .../[invitationId].tsx | 34 +- apps/app/postcss.config.js | 5 +- apps/app/public/sw.js | 101 + apps/app/public/sw.js.map | 1 + apps/app/public/workbox-7805bd61.js | 2458 ++++++ apps/app/public/workbox-7805bd61.js.map | 1 + apps/app/{lib => }/services/api.service.ts | 0 .../services/authentication.service.ts | 20 +- apps/app/{lib => }/services/cycles.service.ts | 42 +- apps/app/{lib => }/services/file.service.ts | 10 +- apps/app/{lib => }/services/issues.service.ts | 190 +- .../app/{lib => }/services/modules.service.ts | 78 +- apps/app/services/project.service.ts | 206 + apps/app/services/state.service.ts | 88 + apps/app/{lib => }/services/user.service.ts | 27 +- .../{lib => }/services/workspace.service.ts | 143 +- apps/app/styles/editor.css | 7 + apps/app/tailwind.config.js | 4 + apps/app/tsconfig.json | 55 +- apps/app/types/cycles.d.ts | 3 +- apps/app/types/issues.d.ts | 2 + apps/app/types/modules.d.ts | 2 + apps/app/types/users.d.ts | 1 + apps/app/ui/button/index.tsx | 71 - apps/app/ui/custom-listbox/index.tsx | 126 - apps/app/ui/custom-menu/index.tsx | 130 - apps/app/ui/custom-select/index.tsx | 108 - apps/app/ui/empty-space/index.tsx | 97 - apps/app/ui/header-button/index.tsx | 40 - apps/app/ui/index.ts | 16 - apps/app/ui/input/index.tsx | 58 - apps/app/ui/loader/index.tsx | 33 - apps/app/ui/outline-button/index.tsx | 67 - apps/app/yarn.lock | 2428 ------ apps/docs/yarn.lock | 3333 --------- package.json | 9 +- packages/config/.eslintrc.js | 45 + packages/config/index.js | 8 + packages/config/package.json | 19 + packages/config/postcss.config.js | 6 + packages/config/tailwind.config.js | 10 + packages/tsconfig/base.json | 20 + packages/tsconfig/nextjs.json | 22 + packages/tsconfig/package.json | 10 + packages/tsconfig/react-library.json | 11 + packages/ui/index.tsx | 17 + packages/ui/package.json | 21 + packages/ui/tsconfig.json | 9 + pnpm-lock.yaml | 3632 +++++++-- pnpm-workspace.yaml | 3 +- turbo.json | 5 + yarn.lock | 6652 ----------------- 322 files changed, 14149 insertions(+), 21378 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 .eslintrc.json create mode 100644 apps/app/.eslintrc.js rename apps/app/components/{forms/EmailCodeForm.tsx => account/email-code-form.tsx} (84%) rename apps/app/components/{forms/EmailPasswordForm.tsx => account/email-password-form.tsx} (79%) create mode 100644 apps/app/components/account/email-signin-form.tsx create mode 100644 apps/app/components/account/github-login-button.tsx rename apps/app/components/{socialbuttons => account}/google-login.tsx (89%) create mode 100644 apps/app/components/account/index.ts rename apps/app/{ui => components}/breadcrumbs/index.tsx (69%) create mode 100644 apps/app/components/common/board-view/board-header.tsx create mode 100644 apps/app/components/cycles/form.tsx create mode 100644 apps/app/components/cycles/index.ts create mode 100644 apps/app/components/cycles/modal.tsx create mode 100644 apps/app/components/cycles/select.tsx rename apps/app/{ui => components}/emoji-icon-picker/emojis.json (100%) rename apps/app/{ui => components}/emoji-icon-picker/helpers.ts (100%) rename apps/app/{ui => components}/emoji-icon-picker/index.tsx (95%) rename apps/app/{ui => components}/emoji-icon-picker/types.d.ts (100%) rename apps/app/{ui => components}/icons/attachment-icon.tsx (97%) rename apps/app/{ui => components}/icons/blocked-icon.tsx (97%) rename apps/app/{ui => components}/icons/blocker-icon.tsx (97%) rename apps/app/{ui => components}/icons/bolt-icon.tsx (95%) rename apps/app/{ui => components}/icons/calendar-month-icon.tsx (98%) rename apps/app/{ui => components}/icons/cancel-icon.tsx (98%) rename apps/app/{ui => components}/icons/clipboard-icon.tsx (96%) rename apps/app/{ui => components}/icons/comment-icon.tsx (95%) rename apps/app/{ui => components}/icons/completed-cycle-icon.tsx (95%) rename apps/app/{ui => components}/icons/current-cycle-icon.tsx (97%) rename apps/app/{ui => components}/icons/cycle-icon.tsx (97%) rename apps/app/{ui => components}/icons/discord-icon.tsx (97%) rename apps/app/{ui => components}/icons/document-icon.tsx (97%) rename apps/app/{ui => components}/icons/edit-icon.tsx (98%) rename apps/app/{ui => components}/icons/ellipsis-horizontal-icon.tsx (97%) rename apps/app/{ui => components}/icons/github-icon.tsx (91%) rename apps/app/{ui => components}/icons/heartbeat-icon.tsx (91%) rename apps/app/{ui => components}/icons/index.ts (100%) rename apps/app/{ui => components}/icons/layer-diagonal-icon.tsx (99%) rename apps/app/{ui => components}/icons/lock-icon.tsx (97%) rename apps/app/{ui => components}/icons/menu-icon.tsx (97%) rename apps/app/{ui => components}/icons/plus-icon.tsx (96%) rename apps/app/{ui => components}/icons/question-mark-circle-icon.tsx (99%) rename apps/app/{ui => components}/icons/setting-icon.tsx (98%) rename apps/app/{ui => components}/icons/signal-cellular-icon.tsx (96%) rename apps/app/{ui => components}/icons/tag-icon.tsx (98%) rename apps/app/{ui => components}/icons/tune-icon.tsx (98%) rename apps/app/{ui => components}/icons/types.d.ts (100%) rename apps/app/{ui => components}/icons/upcoming-cycle-icon.tsx (96%) rename apps/app/{ui => components}/icons/user-group-icon.tsx (98%) rename apps/app/{ui => components}/icons/user-icon-circle.tsx (98%) rename apps/app/{ui => components}/icons/user-icon.tsx (97%) create mode 100644 apps/app/components/issues/description-form.tsx create mode 100644 apps/app/components/issues/form.tsx create mode 100644 apps/app/components/issues/index.ts create mode 100644 apps/app/components/issues/list-item.tsx create mode 100644 apps/app/components/issues/modal.tsx create mode 100644 apps/app/components/issues/select/assignee.tsx create mode 100644 apps/app/components/issues/select/index.ts create mode 100644 apps/app/components/issues/select/label.tsx create mode 100644 apps/app/components/issues/select/parent-issue.tsx create mode 100644 apps/app/components/issues/select/priority.tsx create mode 100644 apps/app/components/issues/select/project.tsx create mode 100644 apps/app/components/issues/select/state.tsx create mode 100644 apps/app/components/issues/sub-issue-list.tsx rename apps/app/components/project/{member-invitations.tsx => card.tsx} (78%) delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/index.tsx delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/select-assignee.tsx delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/select-cycle.tsx delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/select-labels.tsx delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/select-parent-issue.tsx delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/select-priority.tsx delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/select-project.tsx delete mode 100644 apps/app/components/project/issues/create-update-issue-modal/select-state.tsx rename apps/app/components/project/issues/my-issues/{ChangeStateDropdown.tsx => change-state-dropdown.tsx} (83%) create mode 100644 apps/app/components/project/join-project.tsx create mode 100644 apps/app/components/project/sidebar-list.tsx rename apps/app/{ui => components}/search-listbox/index.tsx (92%) rename apps/app/{ui => components}/search-listbox/types.d.ts (100%) create mode 100644 apps/app/components/ui/avatar/avatar.tsx create mode 100644 apps/app/components/ui/avatar/index.ts create mode 100644 apps/app/components/ui/button/index.tsx create mode 100644 apps/app/components/ui/custom-listbox/index.tsx rename apps/app/{ => components}/ui/custom-listbox/types.d.ts (84%) create mode 100644 apps/app/components/ui/custom-menu/index.tsx rename apps/app/{ => components}/ui/custom-menu/types.d.ts (100%) create mode 100644 apps/app/components/ui/custom-select/index.tsx create mode 100644 apps/app/components/ui/empty-space/index.tsx create mode 100644 apps/app/components/ui/header-button/index.tsx create mode 100644 apps/app/components/ui/index.ts create mode 100644 apps/app/components/ui/input/index.tsx rename apps/app/{ => components}/ui/input/types.d.ts (72%) create mode 100644 apps/app/components/ui/loader/index.tsx rename apps/app/{ => components}/ui/modal/index.tsx (97%) rename apps/app/{ => components}/ui/multi-input/index.tsx (87%) create mode 100644 apps/app/components/ui/outline-button/index.tsx rename apps/app/{ => components}/ui/select/index.tsx (77%) rename apps/app/{ => components}/ui/select/types.d.ts (76%) rename apps/app/{ => components}/ui/spinner/index.tsx (92%) rename apps/app/{ => components}/ui/text-area/index.tsx (52%) rename apps/app/{ => components}/ui/text-area/types.d.ts (100%) rename apps/app/{ => components}/ui/tooltip/index.tsx (96%) create mode 100644 apps/app/components/workspace/help-section.tsx create mode 100644 apps/app/components/workspace/home-cards-list.tsx create mode 100644 apps/app/components/workspace/home-greetings.tsx create mode 100644 apps/app/components/workspace/index.ts create mode 100644 apps/app/components/workspace/sidebar-dropdown.tsx create mode 100644 apps/app/components/workspace/sidebar-menu.tsx delete mode 100644 apps/app/constants/api-routes.ts delete mode 100644 apps/app/constants/common.ts rename apps/app/constants/{seo => }/seo-variables.ts (100%) delete mode 100644 apps/app/constants/theme.context.constants.ts delete mode 100644 apps/app/constants/toast.context.constants.ts create mode 100644 apps/app/contexts/issue-view.context.tsx create mode 100644 apps/app/contexts/workspace.context.tsx create mode 100644 apps/app/helpers/array.helper.ts create mode 100644 apps/app/helpers/date-time.helper.ts create mode 100644 apps/app/helpers/functions.helper.ts create mode 100644 apps/app/helpers/string.helper.ts create mode 100644 apps/app/hooks/use-debounce.tsx rename apps/app/{lib/hooks/useIssuesProperties.tsx => hooks/use-issue-properties.tsx} (90%) rename apps/app/{lib/hooks/useIssuesFilter.tsx => hooks/use-issue-view.tsx} (87%) create mode 100644 apps/app/hooks/use-issues.tsx rename apps/app/{lib/hooks/useLocalStorage.tsx => hooks/use-local-storage.tsx} (98%) rename apps/app/{lib/hooks/useMyIssueFilter.tsx => hooks/use-my-issues-filter.tsx} (92%) rename apps/app/{lib/hooks/useOutsideClickDetector.tsx => hooks/use-outside-click-detector.tsx} (100%) create mode 100644 apps/app/hooks/use-project-members.tsx create mode 100644 apps/app/hooks/use-projects.tsx rename apps/app/{lib/hooks/useTheme.tsx => hooks/use-theme.tsx} (99%) rename apps/app/{lib/hooks/useToast.tsx => hooks/use-toast.tsx} (99%) rename apps/app/{lib/hooks/useUser.tsx => hooks/use-user.tsx} (97%) create mode 100644 apps/app/hooks/use-workspace-details.tsx create mode 100644 apps/app/hooks/use-workspaces.tsx delete mode 100644 apps/app/layouts/app-layout.tsx create mode 100644 apps/app/layouts/app-layout/app-header.tsx create mode 100644 apps/app/layouts/app-layout/app-sidebar.tsx create mode 100644 apps/app/layouts/app-layout/index.tsx delete mode 100644 apps/app/lib/hoc/withAuthWrapper.tsx delete mode 100644 apps/app/lib/hooks/useAutosizeTextArea.tsx delete mode 100644 apps/app/lib/services/project.service.ts delete mode 100644 apps/app/lib/services/state.service.ts create mode 100644 apps/app/manifest.json delete mode 100644 apps/app/pages/[workspaceSlug]/members.tsx delete mode 100644 apps/app/pages/[workspaceSlug]/projects/[projectId]/members.tsx create mode 100644 apps/app/pages/_document.tsx delete mode 100644 apps/app/pages/api/hello.ts rename apps/app/pages/{create-workspace.tsx => create-workspace/index.tsx} (98%) rename apps/app/pages/{invitations.tsx => invitations/index.tsx} (89%) rename apps/app/pages/{magic-sign-in.tsx => magic-sign-in/index.tsx} (95%) rename apps/app/pages/{onboarding.tsx => onboarding/index.tsx} (97%) create mode 100644 apps/app/public/sw.js create mode 100644 apps/app/public/sw.js.map create mode 100644 apps/app/public/workbox-7805bd61.js create mode 100644 apps/app/public/workbox-7805bd61.js.map rename apps/app/{lib => }/services/api.service.ts (100%) rename apps/app/{lib => }/services/authentication.service.ts (71%) rename apps/app/{lib => }/services/cycles.service.ts (58%) rename apps/app/{lib => }/services/file.service.ts (61%) rename apps/app/{lib => }/services/issues.service.ts (53%) rename apps/app/{lib => }/services/modules.service.ts (57%) create mode 100644 apps/app/services/project.service.ts create mode 100644 apps/app/services/state.service.ts rename apps/app/{lib => }/services/user.service.ts (60%) rename apps/app/{lib => }/services/workspace.service.ts (53%) delete mode 100644 apps/app/ui/button/index.tsx delete mode 100644 apps/app/ui/custom-listbox/index.tsx delete mode 100644 apps/app/ui/custom-menu/index.tsx delete mode 100644 apps/app/ui/custom-select/index.tsx delete mode 100644 apps/app/ui/empty-space/index.tsx delete mode 100644 apps/app/ui/header-button/index.tsx delete mode 100644 apps/app/ui/index.ts delete mode 100644 apps/app/ui/input/index.tsx delete mode 100644 apps/app/ui/loader/index.tsx delete mode 100644 apps/app/ui/outline-button/index.tsx delete mode 100644 apps/app/yarn.lock delete mode 100644 apps/docs/yarn.lock create mode 100644 packages/config/.eslintrc.js create mode 100644 packages/config/index.js create mode 100644 packages/config/package.json create mode 100644 packages/config/postcss.config.js create mode 100644 packages/config/tailwind.config.js create mode 100644 packages/tsconfig/base.json create mode 100644 packages/tsconfig/nextjs.json create mode 100644 packages/tsconfig/package.json create mode 100644 packages/tsconfig/react-library.json create mode 100644 packages/ui/index.tsx create mode 100644 packages/ui/package.json create mode 100644 packages/ui/tsconfig.json delete mode 100644 yarn.lock diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..be1ad0f9d --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,10 @@ +module.exports = { + root: true, + // This tells ESLint to load the config from the package `config` + // extends: ["custom"], + settings: { + next: { + rootDir: ["apps/*/"], + }, + }, +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index bffb357a7..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/apps/app/.eslintrc.js b/apps/app/.eslintrc.js new file mode 100644 index 000000000..64b6ff36b --- /dev/null +++ b/apps/app/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require("config/.eslintrc"); diff --git a/apps/app/Dockerfile.web b/apps/app/Dockerfile.web index 8b3bc4656..be8abf5fa 100644 --- a/apps/app/Dockerfile.web +++ b/apps/app/Dockerfile.web @@ -14,7 +14,7 @@ ENV PATH="${PATH}:./pnpm" COPY ./apps ./apps COPY ./package.json ./package.json -COPY ./.eslintrc.json ./.eslintrc.json +COPY ./.eslintrc.js ./.eslintrc.js COPY ./turbo.json ./turbo.json COPY ./pnpm-workspace.yaml ./pnpm-workspace.yaml COPY ./pnpm-lock.yaml ./pnpm-lock.yaml diff --git a/apps/app/components/forms/EmailCodeForm.tsx b/apps/app/components/account/email-code-form.tsx similarity index 84% rename from apps/app/components/forms/EmailCodeForm.tsx rename to apps/app/components/account/email-code-form.tsx index 6c3ef8f86..ff5f8632d 100644 --- a/apps/app/components/forms/EmailCodeForm.tsx +++ b/apps/app/components/account/email-code-form.tsx @@ -1,28 +1,28 @@ import React, { useState } from "react"; -// react hook form import { useForm } from "react-hook-form"; // ui -import { Button, Input } from "ui"; -import authenticationService from "lib/services/authentication.service"; -// icons import { CheckCircleIcon } from "@heroicons/react/20/solid"; +import { Button, Input } from "components/ui"; +// services +import authenticationService from "services/authentication.service"; +// icons // types -type SignIn = { +type EmailCodeFormValues = { email: string; key?: string; token?: string; }; -const EmailCodeForm = ({ onSuccess }: any) => { +export const EmailCodeForm = ({ onSuccess }: any) => { const [codeSent, setCodeSent] = useState(false); const { register, handleSubmit, setError, setValue, - formState: { errors, isSubmitting, dirtyFields, isValid, isDirty }, - } = useForm({ + formState: { errors, isSubmitting, isValid, isDirty }, + } = useForm({ defaultValues: { email: "", key: "", @@ -32,9 +32,8 @@ const EmailCodeForm = ({ onSuccess }: any) => { reValidateMode: "onChange", }); - const onSubmit = ({ email }: SignIn) => { + const onSubmit = ({ email }: EmailCodeFormValues) => { console.log(email); - authenticationService .emailCode({ email }) .then((res) => { @@ -46,15 +45,15 @@ const EmailCodeForm = ({ onSuccess }: any) => { }); }; - const handleSignin = (formData: SignIn) => { + const handleSignin = (formData: EmailCodeFormValues) => { authenticationService .magicSignIn(formData) - .then(async (response) => { - await onSuccess(response); + .then((response) => { + onSuccess(response); }) .catch((error) => { console.log(error); - setError("token" as keyof SignIn, { + setError("token" as keyof EmailCodeFormValues, { type: "manual", message: error.error, }); @@ -127,5 +126,3 @@ const EmailCodeForm = ({ onSuccess }: any) => { ); }; - -export default EmailCodeForm; diff --git a/apps/app/components/forms/EmailPasswordForm.tsx b/apps/app/components/account/email-password-form.tsx similarity index 79% rename from apps/app/components/forms/EmailPasswordForm.tsx rename to apps/app/components/account/email-password-form.tsx index 384b77598..029485b8b 100644 --- a/apps/app/components/forms/EmailPasswordForm.tsx +++ b/apps/app/components/account/email-password-form.tsx @@ -1,29 +1,26 @@ import React from "react"; // next import Link from "next/link"; -import { useRouter } from "next/router"; // react hook form import { useForm } from "react-hook-form"; // ui -import { Button, Input } from "ui"; -import authenticationService from "lib/services/authentication.service"; +import { Button, Input } from "components/ui"; +import authenticationService from "services/authentication.service"; // types -type SignIn = { +type EmailPasswordFormValues = { email: string; password?: string; medium?: string; }; -const EmailPasswordForm = ({ onSuccess }: any) => { +export const EmailPasswordForm = ({ onSuccess }: any) => { const { register, handleSubmit, setError, - setValue, - getValues, - formState: { errors, isSubmitting, dirtyFields, isValid, isDirty }, - } = useForm({ + formState: { errors, isSubmitting, isValid, isDirty }, + } = useForm({ defaultValues: { email: "", password: "", @@ -33,11 +30,11 @@ const EmailPasswordForm = ({ onSuccess }: any) => { reValidateMode: "onChange", }); - const onSubmit = (formData: SignIn) => { + const onSubmit = (formData: EmailPasswordFormValues) => { authenticationService .emailLogin(formData) - .then(async (response) => { - await onSuccess(response); + .then((response) => { + onSuccess(response); }) .catch((error) => { console.log(error); @@ -45,7 +42,7 @@ const EmailPasswordForm = ({ onSuccess }: any) => { Object.keys(error.response.data).forEach((key) => { const err = error.response.data[key]; console.log("err", err); - setError(key as keyof SignIn, { + setError(key as keyof EmailPasswordFormValues, { type: "manual", message: Array.isArray(err) ? err.join(", ") : err, }); @@ -85,8 +82,8 @@ const EmailPasswordForm = ({ onSuccess }: any) => { placeholder="Enter your password" /> -
-
+
+
Forgot your password? @@ -105,5 +102,3 @@ const EmailPasswordForm = ({ onSuccess }: any) => { ); }; - -export default EmailPasswordForm; diff --git a/apps/app/components/account/email-signin-form.tsx b/apps/app/components/account/email-signin-form.tsx new file mode 100644 index 000000000..3d13ca5a1 --- /dev/null +++ b/apps/app/components/account/email-signin-form.tsx @@ -0,0 +1,46 @@ +import { useState, FC } from "react"; +import { KeyIcon } from "@heroicons/react/24/outline"; +// components +import { EmailCodeForm, EmailPasswordForm } from "components/account"; + +export interface EmailSignInFormProps { + handleSuccess: () => void; +} + +export const EmailSignInForm: FC = (props) => { + const { handleSuccess } = props; + // states + const [useCode, setUseCode] = useState(true); + + return ( + <> + {useCode ? ( + + ) : ( + + )} +
+
+
+
+
+
+ or +
+
+
+ +
+
+ + ); +}; diff --git a/apps/app/components/account/github-login-button.tsx b/apps/app/components/account/github-login-button.tsx new file mode 100644 index 000000000..e93abde88 --- /dev/null +++ b/apps/app/components/account/github-login-button.tsx @@ -0,0 +1,51 @@ +import { useEffect, useState, FC } from "react"; +import Link from "next/link"; +import Image from "next/image"; +import { useRouter } from "next/router"; +// images +import githubImage from "/public/logos/github.png"; + +const { NEXT_PUBLIC_GITHUB_ID } = process.env; + +export interface GithubLoginButtonProps { + handleSignIn: React.Dispatch; +} + +export const GithubLoginButton: FC = (props) => { + const { handleSignIn } = props; + // router + const { + query: { code }, + } = useRouter(); + // states + const [loginCallBackURL, setLoginCallBackURL] = useState(undefined); + + useEffect(() => { + if (code) { + handleSignIn(code.toString()); + } + }, [code, handleSignIn]); + + useEffect(() => { + const origin = + typeof window !== "undefined" && window.location.origin ? window.location.origin : ""; + setLoginCallBackURL(`${origin}/signin` as any); + }, []); + + return ( + + + + ); +}; diff --git a/apps/app/components/socialbuttons/google-login.tsx b/apps/app/components/account/google-login.tsx similarity index 89% rename from apps/app/components/socialbuttons/google-login.tsx rename to apps/app/components/account/google-login.tsx index 6c39c58af..078eef518 100644 --- a/apps/app/components/socialbuttons/google-login.tsx +++ b/apps/app/components/account/google-login.tsx @@ -4,12 +4,13 @@ import Script from "next/script"; export interface IGoogleLoginButton { text?: string; - onSuccess?: (res: any) => void; - onFailure?: (res: any) => void; + handleSignIn: React.Dispatch; styles?: CSSProperties; } export const GoogleLoginButton: FC = (props) => { + const { handleSignIn } = props; + const googleSignInButton = useRef(null); const [gsiScriptLoaded, setGsiScriptLoaded] = useState(false); @@ -17,7 +18,7 @@ export const GoogleLoginButton: FC = (props) => { if (!googleSignInButton.current || gsiScriptLoaded) return; window?.google?.accounts.id.initialize({ client_id: process.env.NEXT_PUBLIC_GOOGLE_CLIENTID || "", - callback: props.onSuccess as any, + callback: handleSignIn, }); window?.google?.accounts.id.renderButton( googleSignInButton.current, @@ -32,7 +33,7 @@ export const GoogleLoginButton: FC = (props) => { ); window?.google?.accounts.id.prompt(); // also display the One Tap dialog setGsiScriptLoaded(true); - }, [props.onSuccess, gsiScriptLoaded]); + }, [handleSignIn, gsiScriptLoaded]); useEffect(() => { if (window?.google?.accounts?.id) { @@ -46,7 +47,7 @@ export const GoogleLoginButton: FC = (props) => { return ( <> ); } diff --git a/apps/app/pages/_document.tsx b/apps/app/pages/_document.tsx new file mode 100644 index 000000000..befe7cd17 --- /dev/null +++ b/apps/app/pages/_document.tsx @@ -0,0 +1,22 @@ +import Document, { Html, Head, Main, NextScript } from "next/document"; + +class MyDocument extends Document { + render() { + return ( + + + + + +