├── backend ├── public │ ├── favicon.ico │ ├── robots.txt │ ├── vendor │ │ └── telescope │ │ │ ├── favicon.ico │ │ │ └── mix-manifest.json │ ├── .htaccess │ └── web.config ├── resources │ ├── css │ │ └── app.css │ └── js │ │ ├── app.js │ │ └── bootstrap.js ├── storage │ ├── logs │ │ └── .gitignore │ ├── debugbar │ │ └── .gitignore │ ├── app │ │ ├── public │ │ │ └── .gitignore │ │ └── .gitignore │ └── framework │ │ ├── sessions │ │ └── .gitignore │ │ ├── testing │ │ └── .gitignore │ │ ├── views │ │ └── .gitignore │ │ ├── cache │ │ ├── data │ │ │ └── .gitignore │ │ └── .gitignore │ │ └── .gitignore ├── tests │ ├── Unit │ │ └── .gitignore │ ├── CreatesApplication.php │ └── TestCase.php ├── bootstrap │ └── cache │ │ └── .gitignore ├── database │ ├── .gitignore │ ├── seeders │ │ ├── TaskCardSeeder.php │ │ ├── TaskListSeeder.php │ │ ├── DatabaseSeeder.php │ │ ├── UserSeeder.php │ │ └── TaskBoardSeeder.php │ ├── migrations │ │ ├── 2014_10_12_100000_create_password_resets_table.php │ │ ├── 2014_10_12_000000_create_users_table.php │ │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ │ ├── 2021_06_21_184049_add_task_list_id_columns_to_task_cards_table.php │ │ ├── 2021_06_17_061724_create_task_boards_table.php │ │ ├── 2021_08_03_182417_add_index_columns_to_task_boards_table.php │ │ ├── 2014_10_12_200000_add_two_factor_columns_to_users_table.php │ │ ├── 2021_03_14_180349_create_task_cards_table.php │ │ └── 2021_06_17_161616_create_task_lists_table.php │ └── factories │ │ ├── TaskCardFactory.php │ │ ├── TaskListFactory.php │ │ ├── TaskBoardFactory.php │ │ └── UserFactory.php ├── .prettierrc.json ├── docker │ ├── 7.4 │ │ ├── php.ini │ │ ├── start-container │ │ └── supervisord.conf │ ├── 8.0 │ │ ├── php.ini │ │ ├── start-container │ │ └── supervisord.conf │ └── 8.1 │ │ ├── php.ini │ │ ├── start-container │ │ └── supervisord.conf ├── .gitattributes ├── .vscode │ ├── settings.json │ ├── cspell.json │ └── extensions.json ├── docker-compose.extend.yml ├── .styleci.yml ├── .prettierignore ├── .gitignore ├── .editorconfig ├── app │ ├── Http │ │ ├── Middleware │ │ │ ├── EncryptCookies.php │ │ │ ├── VerifyCsrfToken.php │ │ │ ├── TrustHosts.php │ │ │ ├── PreventRequestsDuringMaintenance.php │ │ │ ├── TrimStrings.php │ │ │ ├── TrustProxies.php │ │ │ ├── RedirectIfAuthenticated.php │ │ │ └── Authenticate.php │ │ ├── Controllers │ │ │ ├── Controller.php │ │ │ ├── HomeController.php │ │ │ ├── Auth │ │ │ │ ├── RegisteredUserController.php │ │ │ │ └── ProfileInformationController.php │ │ │ └── VerifyEmailController.php │ │ ├── Responses │ │ │ ├── VerifyEmailResponse.php │ │ │ ├── LoginResponse.php │ │ │ └── RegisterResponse.php │ │ ├── Resources │ │ │ ├── UserResource.php │ │ │ └── TaskCardResource.php │ │ └── Requests │ │ │ ├── UpdateTaskListRequest.php │ │ │ ├── StoreTaskListRequest.php │ │ │ ├── StoreTaskBoardRequest.php │ │ │ ├── StoreTaskCardRequest.php │ │ │ └── UpdateTaskBoardRequest.php │ ├── Actions │ │ └── Fortify │ │ │ ├── PasswordValidationRules.php │ │ │ ├── ResetUserPassword.php │ │ │ └── CreateNewUser.php │ ├── Providers │ │ ├── BroadcastServiceProvider.php │ │ ├── AppServiceProvider.php │ │ ├── EventServiceProvider.php │ │ └── TelescopeServiceProvider.php │ ├── Models │ │ ├── TaskList.php │ │ ├── TaskCard.php │ │ └── TaskBoard.php │ ├── Console │ │ └── Kernel.php │ └── Jobs │ │ └── DeleteUnverifiedUser.php ├── lang │ ├── ja │ │ ├── pagination.php │ │ ├── auth.php │ │ └── passwords.php │ └── en │ │ ├── pagination.php │ │ ├── auth.php │ │ └── passwords.php ├── routes │ ├── web.php │ ├── channels.php │ ├── console.php │ ├── api.php │ └── api │ │ └── v1.php ├── webpack.mix.js ├── server.php ├── .devcontainer │ └── devcontainer.json ├── package.json ├── config │ ├── cors.php │ ├── services.php │ └── view.php ├── .env.dev ├── .env.testing ├── phpunit.xml └── .env.example ├── frontend ├── .prettierrc.json ├── src │ ├── react-app-env.d.ts │ ├── mocks │ │ ├── handlers │ │ │ ├── types │ │ │ │ ├── index.ts │ │ │ │ └── ErrorResponse.ts │ │ │ ├── utils │ │ │ │ ├── index.ts │ │ │ │ └── returnInvalidRequest.ts │ │ │ └── index.ts │ │ ├── utils │ │ │ ├── uuid.ts │ │ │ ├── store │ │ │ │ ├── boards.ts │ │ │ │ └── auth.ts │ │ │ ├── route.ts │ │ │ └── crypto.ts │ │ ├── data │ │ │ └── index.ts │ │ ├── server.ts │ │ ├── browser.ts │ │ ├── controllers │ │ │ ├── auth │ │ │ │ ├── deleteAccount.ts │ │ │ │ ├── createUser.ts │ │ │ │ ├── resetPassword.ts │ │ │ │ ├── updatePassword.ts │ │ │ │ └── updateProfile.ts │ │ │ ├── index.ts │ │ │ ├── taskListController.ts │ │ │ └── taskCardController.ts │ │ ├── models │ │ │ ├── taskBoard.ts │ │ │ ├── taskList.ts │ │ │ ├── taskCard.ts │ │ │ ├── user.ts │ │ │ └── auth.ts │ │ └── store.ts │ ├── store │ │ ├── thunks │ │ │ ├── config │ │ │ │ ├── index.ts │ │ │ │ └── AsyncThunkConfig.ts │ │ │ ├── utils │ │ │ │ ├── index.ts │ │ │ │ └── makeRejectValue.ts │ │ │ ├── lists │ │ │ │ ├── index.ts │ │ │ │ ├── createTaskList.ts │ │ │ │ ├── updateTaskList.ts │ │ │ │ └── destroyTaskList.ts │ │ │ ├── cards │ │ │ │ ├── index.ts │ │ │ │ ├── createTaskCard.ts │ │ │ │ ├── updateTaskCardRelationships.ts │ │ │ │ ├── destroyTaskCard.ts │ │ │ │ └── updateTaskCard.ts │ │ │ ├── boards │ │ │ │ ├── index.ts │ │ │ │ ├── fetchTaskBoard.ts │ │ │ │ ├── createTaskBoard.ts │ │ │ │ ├── fetchTaskBoards.ts │ │ │ │ ├── updateTaskBoard.ts │ │ │ │ └── destroyTaskBoard.ts │ │ │ └── auth │ │ │ │ ├── index.ts │ │ │ │ ├── signOutFromAPI.ts │ │ │ │ ├── deleteAccount.ts │ │ │ │ ├── updatePassword.ts │ │ │ │ ├── sendEmailVerificationLink.ts │ │ │ │ ├── fetchAuthUser.ts │ │ │ │ ├── verifyEmail.ts │ │ │ │ ├── forgotPassword.ts │ │ │ │ ├── updateProfile.ts │ │ │ │ ├── resetPassword.ts │ │ │ │ ├── signInWithEmail.ts │ │ │ │ └── createUser.ts │ │ ├── slices │ │ │ ├── index.ts │ │ │ └── appSlice.ts │ │ └── index.ts │ ├── pages │ │ ├── error │ │ │ ├── index.ts │ │ │ └── NotFound.tsx │ │ ├── static │ │ │ └── index.ts │ │ ├── boards │ │ │ └── index.ts │ │ ├── auth │ │ │ ├── index.ts │ │ │ └── VerifyEmail.tsx │ │ └── index.tsx │ ├── utils │ │ ├── api │ │ │ ├── index.ts │ │ │ ├── errors │ │ │ │ ├── index.ts │ │ │ │ ├── isHttpException.ts │ │ │ │ ├── makeErrorMessageFrom.ts │ │ │ │ └── isInvalidRequest.ts │ │ │ └── makePath.ts │ │ ├── generator │ │ │ ├── index.ts │ │ │ ├── makeEmail.ts │ │ │ └── generateRandomString.ts │ │ ├── hooks │ │ │ ├── useQuery.ts │ │ │ ├── index.ts │ │ │ ├── useAppDispatch.ts │ │ │ ├── useAppSelector.ts │ │ │ ├── usePrevious.ts │ │ │ ├── useAppLocation.ts │ │ │ └── useDeepEqualSelector.ts │ │ ├── dnd.ts │ │ ├── sort.ts │ │ ├── infoBox.ts │ │ └── auth.ts │ ├── components │ │ ├── boards │ │ │ ├── TaskCard │ │ │ │ └── index.ts │ │ │ ├── TaskBoard │ │ │ │ └── index.ts │ │ │ ├── TaskList │ │ │ │ └── index.ts │ │ │ ├── InfoBox │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── layouts │ │ │ ├── Sidebar │ │ │ │ └── index.ts │ │ │ └── Header │ │ │ │ ├── index.ts │ │ │ │ └── AccountMenuList.tsx │ │ ├── home │ │ │ └── LandingPage │ │ │ │ └── index.ts │ │ └── account │ │ │ ├── index.ts │ │ │ └── UserStatus.tsx │ ├── models │ │ ├── User.ts │ │ ├── index.ts │ │ └── Task.ts │ ├── config │ │ ├── moment.ts │ │ ├── app.ts │ │ ├── mdEditor.ts │ │ └── api.ts │ ├── theme │ │ ├── index.ts │ │ ├── palette.ts │ │ ├── typography.ts │ │ └── overrides.ts │ ├── layouts │ │ ├── StandbyScreen.tsx │ │ ├── index.ts │ │ ├── BaseLayout.tsx │ │ ├── Loading.tsx │ │ ├── Progressbar.tsx │ │ ├── FlashNotification.tsx │ │ ├── Footer.tsx │ │ └── MarkdownWithToc.tsx │ ├── reportWebVitals.ts │ ├── templates │ │ ├── SubmitButton.tsx │ │ ├── ScrolledDiv.tsx │ │ ├── ScrolledTypography.tsx │ │ ├── AlertMessage.tsx │ │ ├── LinkWrapper.tsx │ │ ├── ScrolledGridContainer.tsx │ │ ├── index.ts │ │ ├── LabeledCheckbox.tsx │ │ ├── LinkButton.tsx │ │ ├── Markdown.tsx │ │ └── DatetimeInput.tsx │ ├── setupTests.ts │ ├── App.tsx │ └── __tests__ │ │ └── store │ │ └── auth │ │ └── thunks │ │ └── forgotPassoword.test.ts ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── manifest.json │ └── index.html ├── .eslintignore ├── config-overrides.js ├── .lintstagedrc.yml ├── .prettierignore ├── .vscode │ ├── settings.json │ └── extensions.json ├── .husky │ └── pre-commit ├── .gitignore ├── tsconfig.json ├── .babelrc.js └── .env.example └── terraform ├── versions.tf ├── backend.dev.hcl ├── acm.tf ├── main.tf ├── s3.tf ├── .gitignore ├── route53.tf └── terraform.tfvars.example /backend/public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/resources/css/app.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/tests/Unit/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /backend/resources/js/app.js: -------------------------------------------------------------------------------- 1 | require('./bootstrap'); 2 | -------------------------------------------------------------------------------- /backend/storage/debugbar/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | *.sqlite-journal 3 | -------------------------------------------------------------------------------- /backend/storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } 4 | -------------------------------------------------------------------------------- /backend/storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /backend/storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /backend/storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /frontend/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /frontend/src/mocks/handlers/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ErrorResponse'; 2 | -------------------------------------------------------------------------------- /frontend/src/store/thunks/config/index.ts: -------------------------------------------------------------------------------- 1 | export * from './AsyncThunkConfig'; 2 | -------------------------------------------------------------------------------- /frontend/src/store/thunks/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './makeRejectValue'; 2 | -------------------------------------------------------------------------------- /frontend/src/pages/error/index.ts: -------------------------------------------------------------------------------- 1 | export { default as NotFound } from './NotFound'; 2 | -------------------------------------------------------------------------------- /backend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "phpVersion": "8.1" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/utils/api/index.ts: -------------------------------------------------------------------------------- 1 | export * from './apiClient'; 2 | export * from './makePath'; 3 | -------------------------------------------------------------------------------- /frontend/src/components/boards/TaskCard/index.ts: -------------------------------------------------------------------------------- 1 | export { default as TaskCard } from './TaskCard'; 2 | -------------------------------------------------------------------------------- /frontend/src/components/layouts/Sidebar/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SideMenu } from './SideMenu'; 2 | -------------------------------------------------------------------------------- /frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /frontend/.eslintignore: -------------------------------------------------------------------------------- 1 | # In accordance with `.gitignore`, 2 | 3 | node_modules 4 | build 5 | coverage 6 | public 7 | -------------------------------------------------------------------------------- /frontend/src/components/layouts/Header/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AccountMenuList } from './AccountMenuList'; 2 | -------------------------------------------------------------------------------- /frontend/src/utils/generator/index.ts: -------------------------------------------------------------------------------- 1 | export * from './generateRandomString'; 2 | export * from './makeEmail'; 3 | -------------------------------------------------------------------------------- /backend/docker/7.4/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | post_max_size = 100M 3 | upload_max_filesize = 100M 4 | variables_order = EGPCS 5 | -------------------------------------------------------------------------------- /backend/docker/8.0/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | post_max_size = 100M 3 | upload_max_filesize = 100M 4 | variables_order = EGPCS 5 | -------------------------------------------------------------------------------- /backend/docker/8.1/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | post_max_size = 100M 3 | upload_max_filesize = 100M 4 | variables_order = EGPCS 5 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zuka-e/laravel-react-task-spa/HEAD/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zuka-e/laravel-react-task-spa/HEAD/frontend/public/logo192.png -------------------------------------------------------------------------------- /frontend/src/mocks/utils/uuid.ts: -------------------------------------------------------------------------------- 1 | import { datatype } from 'faker'; 2 | 3 | export const uuid = () => datatype.uuid(); 4 | -------------------------------------------------------------------------------- /frontend/src/mocks/handlers/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './applyMiddleware'; 2 | export * from './returnInvalidRequest'; 3 | -------------------------------------------------------------------------------- /frontend/src/pages/static/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Privacy } from './Privacy'; 2 | export { default as Terms } from './Terms'; 3 | -------------------------------------------------------------------------------- /frontend/src/store/slices/index.ts: -------------------------------------------------------------------------------- 1 | export * from './appSlice'; 2 | export * from './authSlice'; 3 | export * from './taskBoardSlice'; 4 | -------------------------------------------------------------------------------- /frontend/config-overrides.js: -------------------------------------------------------------------------------- 1 | const { useBabelRc, override } = require('customize-cra'); 2 | 3 | module.exports = override(useBabelRc()); 4 | -------------------------------------------------------------------------------- /frontend/src/pages/boards/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Index } from './TaskBoardIndex'; 2 | export { default as Show } from './TaskBoard'; 3 | -------------------------------------------------------------------------------- /backend/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /backend/public/vendor/telescope/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zuka-e/laravel-react-task-spa/HEAD/backend/public/vendor/telescope/favicon.ico -------------------------------------------------------------------------------- /frontend/src/components/home/LandingPage/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Hero } from './Hero'; 2 | export { default as Features } from './Features'; 3 | -------------------------------------------------------------------------------- /frontend/src/store/thunks/lists/index.ts: -------------------------------------------------------------------------------- 1 | export * from './createTaskList'; 2 | export * from './updateTaskList'; 3 | export * from './destroyTaskList'; 4 | -------------------------------------------------------------------------------- /frontend/src/mocks/data/index.ts: -------------------------------------------------------------------------------- 1 | export * from './users'; 2 | export * from './taskBoards'; 3 | export * from './taskLists'; 4 | export * from './taskCards'; 5 | -------------------------------------------------------------------------------- /frontend/src/utils/api/errors/index.ts: -------------------------------------------------------------------------------- 1 | export * from './isHttpException'; 2 | export * from './isInvalidRequest'; 3 | export * from './makeErrorMessageFrom'; 4 | -------------------------------------------------------------------------------- /frontend/.lintstagedrc.yml: -------------------------------------------------------------------------------- 1 | # https://github.com/okonet/lint-staged#configuration 2 | '*.{js,jsx,ts,tsx}': 3 | - 'eslint --max-warnings=0' 4 | - 'prettier --write' 5 | -------------------------------------------------------------------------------- /frontend/src/components/boards/TaskBoard/index.ts: -------------------------------------------------------------------------------- 1 | export { default as BoardCardHeader } from './BoardCardHeader'; 2 | export { default as BoardMenu } from './BoardMenu'; 3 | -------------------------------------------------------------------------------- /terraform/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | aws = { 4 | source = "hashicorp/aws" 5 | version = ">= 4.16.0" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /backend/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "editor.formatOnSave": true, 4 | "files.associations": { "*.module": "php" } 5 | } 6 | -------------------------------------------------------------------------------- /terraform/backend.dev.hcl: -------------------------------------------------------------------------------- 1 | # https://www.terraform.io/docs/language/settings/backends/remote.html#using-cli-input 2 | 3 | organization = "miwataru" 4 | 5 | workspaces { 6 | name = "dev" 7 | } 8 | -------------------------------------------------------------------------------- /backend/storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /frontend/src/models/User.ts: -------------------------------------------------------------------------------- 1 | export type User = { 2 | id: string; 3 | name: string; 4 | email: string; 5 | emailVerifiedAt: Date | null; 6 | createdAt: Date; 7 | updatedAt: Date; 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/src/store/thunks/cards/index.ts: -------------------------------------------------------------------------------- 1 | export * from './createTaskCard'; 2 | export * from './updateTaskCard'; 3 | export * from './updateTaskCardRelationships'; 4 | export * from './destroyTaskCard'; 5 | -------------------------------------------------------------------------------- /frontend/.prettierignore: -------------------------------------------------------------------------------- 1 | # In accordance with `.gitignore` and `.eslintignore`, 2 | 3 | node_modules 4 | build 5 | coverage 6 | public 7 | package.json 8 | package-lock.json 9 | yarn.lock 10 | *.md 11 | -------------------------------------------------------------------------------- /frontend/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // https://code.visualstudio.com/docs/editor/workspaces#_workspace-settings 2 | { 3 | "editor.defaultFormatter": "esbenp.prettier-vscode", 4 | "editor.formatOnSave": true 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/components/boards/TaskList/index.ts: -------------------------------------------------------------------------------- 1 | export { default as TaskList } from './TaskList'; 2 | export { default as ListCardHeader } from './ListCardHeader'; 3 | export { default as ListMenu } from './ListMenu'; 4 | -------------------------------------------------------------------------------- /frontend/src/config/moment.ts: -------------------------------------------------------------------------------- 1 | import moment from 'moment'; 2 | import 'moment/locale/ja'; 3 | 4 | moment.updateLocale('ja', { 5 | calendar: { sameElse: 'YYYY年MM月DD日 dddd HH:mm' }, 6 | invalidDate: '日付が表示できません', 7 | }); 8 | -------------------------------------------------------------------------------- /frontend/src/utils/hooks/useQuery.ts: -------------------------------------------------------------------------------- 1 | import { useLocation } from 'react-router-dom'; 2 | 3 | // クエリパラメータ用カスタムフック 4 | export const useQuery = () => new URLSearchParams(useLocation().search); 5 | 6 | export default useQuery; 7 | -------------------------------------------------------------------------------- /backend/public/vendor/telescope/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/app.js": "/app.js?id=784d14e9c5825eae73d9", 3 | "/app.css": "/app.css?id=428958f8fb1feeff0a98", 4 | "/app-dark.css": "/app-dark.css?id=57a25a32a7efccdf2de0" 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/mocks/server.ts: -------------------------------------------------------------------------------- 1 | import { setupServer } from 'msw/node'; 2 | 3 | import { handlers } from './handlers'; 4 | 5 | // Setup requests interception using the given handlers. 6 | export const server = setupServer(...handlers); 7 | -------------------------------------------------------------------------------- /frontend/src/store/thunks/boards/index.ts: -------------------------------------------------------------------------------- 1 | export * from './createTaskBoard'; 2 | export * from './fetchTaskBoards'; 3 | export * from './fetchTaskBoard'; 4 | export * from './updateTaskBoard'; 5 | export * from './destroyTaskBoard'; 6 | -------------------------------------------------------------------------------- /backend/docker-compose.extend.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | laravel.test: 4 | volumes: 5 | - '..:${PROJECT_DIR}' 6 | - 'vscode-extensions:/home/sail/.vscode-server/extensions' 7 | volumes: 8 | vscode-extensions: 9 | -------------------------------------------------------------------------------- /frontend/src/mocks/browser.ts: -------------------------------------------------------------------------------- 1 | import { setupWorker } from 'msw'; 2 | import { handlers } from './handlers'; 3 | 4 | // This configures a Service Worker with the given request handlers. 5 | export const worker = setupWorker(...handlers); 6 | -------------------------------------------------------------------------------- /frontend/src/mocks/utils/store/boards.ts: -------------------------------------------------------------------------------- 1 | import { EnhancedStore } from '@reduxjs/toolkit'; 2 | 3 | import { RootState } from 'store'; 4 | 5 | export const isLoading = (store: EnhancedStore) => 6 | store.getState().boards.loading; 7 | -------------------------------------------------------------------------------- /frontend/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | # https://typicode.github.io/husky/#/?id=custom-directory 5 | cd frontend 6 | # https://github.com/okonet/lint-staged#command-line-flags 7 | npx lint-staged 8 | -------------------------------------------------------------------------------- /backend/.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | disabled: 4 | - no_unused_imports 5 | finder: 6 | not-name: 7 | - index.php 8 | - server.php 9 | js: 10 | finder: 11 | not-name: 12 | - webpack.mix.js 13 | css: true 14 | -------------------------------------------------------------------------------- /frontend/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | // https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions 2 | { 3 | "recommendations": [ 4 | "dbaeumer.vscode-eslint", // ESLint 5 | "esbenp.prettier-vscode" // Prettier 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/components/account/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DeleteAccountDialog } from './DeleteAccountDialog'; 2 | export { default as Password } from './Password'; 3 | export { default as UserProfile } from './UserProfile'; 4 | export { default as UserStatus } from './UserStatus'; 5 | -------------------------------------------------------------------------------- /frontend/src/utils/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './usePrevious'; 2 | export * from './useAppDispatch'; 3 | export { default as useAppLocation } from './useAppLocation'; 4 | export * from './useAppSelector'; 5 | export * from './useDeepEqualSelector'; 6 | export * from './useQuery'; 7 | -------------------------------------------------------------------------------- /frontend/src/mocks/handlers/types/ErrorResponse.ts: -------------------------------------------------------------------------------- 1 | import { HttpException, InvalidRequest } from 'utils/api/errors'; 2 | 3 | export type ErrorResponse = { 4 | message?: HttpException['response']['data']['message']; 5 | errors?: InvalidRequest['response']['data']['errors']; 6 | }; 7 | -------------------------------------------------------------------------------- /backend/.prettierignore: -------------------------------------------------------------------------------- 1 | # https://prettier.io/docs/en/ignore.html 2 | 3 | public 4 | storage 5 | 6 | vendor 7 | node_modules 8 | 9 | composer.json 10 | composer.lock 11 | package.json 12 | package-lock.json 13 | 14 | _ide_helper.php 15 | _ide_helper_models.php 16 | 17 | *.md 18 | -------------------------------------------------------------------------------- /frontend/src/components/boards/InfoBox/index.ts: -------------------------------------------------------------------------------- 1 | export { default as InfoBox } from './InfoBox'; 2 | export { default as TaskBoardDetails } from './TaskBoardDetails'; 3 | export { default as TaskListDetails } from './TaskListDetails'; 4 | export { default as TaskCardDetails } from './TaskCardDetails'; 5 | -------------------------------------------------------------------------------- /frontend/src/utils/generator/makeEmail.ts: -------------------------------------------------------------------------------- 1 | import { generateRandomString } from '.'; 2 | 3 | export const makeEmail = () => { 4 | const username = generateRandomString() + generateRandomString(); 5 | const domain = 'example.com'; 6 | const email = username + '@' + domain; 7 | return email; 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/src/utils/hooks/useAppDispatch.ts: -------------------------------------------------------------------------------- 1 | import { useDispatch } from 'react-redux'; 2 | 3 | import type { AppDispatch } from 'store'; 4 | 5 | // `useDispatch`使用時、'middleware'(Redux Thunkを含む)を適用する 6 | export const useAppDispatch = () => useDispatch(); 7 | 8 | export default useAppDispatch; 9 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | .env 7 | .env.backup 8 | .phpunit.result.cache 9 | docker-compose.override.yml 10 | Homestead.json 11 | Homestead.yaml 12 | npm-debug.log 13 | yarn-error.log 14 | .serverless/ 15 | .env.production 16 | -------------------------------------------------------------------------------- /frontend/src/mocks/controllers/auth/deleteAccount.ts: -------------------------------------------------------------------------------- 1 | import { auth, db, UserDocument } from 'mocks/models'; 2 | 3 | export const remove = (currentUser: UserDocument) => { 4 | if (!db.remove('users', currentUser.id)) 5 | throw new Error('The Account failed to be deleted'); 6 | 7 | auth.logout(); 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/src/mocks/models/taskBoard.ts: -------------------------------------------------------------------------------- 1 | import { CollectionBase, DocumentBase } from 'models'; 2 | 3 | export type TaskBoardDocument = { 4 | userId: string; 5 | title: string; 6 | description: string; 7 | } & DocumentBase; 8 | 9 | export type TaskBoardsCollection = CollectionBase; 10 | -------------------------------------------------------------------------------- /frontend/src/utils/hooks/useAppSelector.ts: -------------------------------------------------------------------------------- 1 | import { TypedUseSelectorHook, useSelector } from 'react-redux'; 2 | 3 | import { RootState } from 'store'; 4 | 5 | // `useSelector`使用時、`(state: RootState)`を毎回入力する必要をなくす 6 | export const useAppSelector: TypedUseSelectorHook = useSelector; 7 | 8 | export default useAppSelector; 9 | -------------------------------------------------------------------------------- /backend/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{js,jsx,ts,tsx,vue,json,yml,yaml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /frontend/src/mocks/models/taskList.ts: -------------------------------------------------------------------------------- 1 | import { CollectionBase, DocumentBase } from 'models'; 2 | 3 | export type TaskListDocument = { 4 | userId: string; 5 | boardId: string; 6 | title: string; 7 | description: string; 8 | } & DocumentBase; 9 | 10 | export type TaskListsCollection = CollectionBase; 11 | -------------------------------------------------------------------------------- /frontend/src/theme/index.ts: -------------------------------------------------------------------------------- 1 | import { createTheme } from '@material-ui/core/styles'; 2 | 3 | import palette from './palette'; 4 | import typography from './typography'; 5 | import overrides from './overrides'; 6 | 7 | const theme = createTheme({ 8 | palette, 9 | typography, 10 | overrides, 11 | }); 12 | 13 | export default theme; 14 | -------------------------------------------------------------------------------- /frontend/src/mocks/utils/route.ts: -------------------------------------------------------------------------------- 1 | import { API_HOST, API_ROUTE, GET_CSRF_TOKEN_PATH, paths } from 'config/api'; 2 | 3 | export const url = (pathName: keyof typeof paths) => { 4 | const path = paths[pathName]; 5 | const nonApiRouteList = [GET_CSRF_TOKEN_PATH]; 6 | return nonApiRouteList.includes(path) ? API_HOST + path : API_ROUTE + path; 7 | }; 8 | -------------------------------------------------------------------------------- /frontend/src/utils/hooks/usePrevious.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | 3 | /** 4 | * 直前の情報(`ref`)を保持 5 | */ 6 | export const usePrevious = (initialState: T) => { 7 | const ref = useRef(); 8 | 9 | useEffect(() => { 10 | ref.current = initialState; 11 | }, [initialState]); 12 | 13 | return ref.current; 14 | }; 15 | -------------------------------------------------------------------------------- /backend/.vscode/cspell.json: -------------------------------------------------------------------------------- 1 | { 2 | // Version of the setting file. Always 0.2 3 | "version": "0.2", 4 | // language - current active spelling language 5 | "language": "en", 6 | // words - list of words to be always considered correct 7 | "words": [ 8 | "bref", 9 | "Dotenv", 10 | "Laravel", 11 | "SJIS", 12 | "upsert" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/mocks/models/taskCard.ts: -------------------------------------------------------------------------------- 1 | import { CollectionBase, DocumentBase } from 'models'; 2 | 3 | export type TaskCardDocument = { 4 | userId: string; 5 | listId: string; 6 | title: string; 7 | content: string; 8 | deadline: Date; 9 | done: boolean; 10 | } & DocumentBase; 11 | 12 | export type TaskCardsCollection = CollectionBase; 13 | -------------------------------------------------------------------------------- /frontend/src/config/app.ts: -------------------------------------------------------------------------------- 1 | export const APP_NAME = process.env.REACT_APP_APP_NAME || ''; 2 | 3 | export const GUEST_NAME = process.env.REACT_APP_GUEST_NAME || ''; 4 | export const GUEST_EMAIL = process.env.REACT_APP_GUEST_EMAIL || ''; 5 | export const GUEST_PASSWORD = process.env.REACT_APP_GUEST_PASSWORD || ''; 6 | 7 | if (!APP_NAME) throw Error('environment variables required'); 8 | -------------------------------------------------------------------------------- /frontend/src/layouts/StandbyScreen.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Header, Footer, Progressbar } from 'layouts'; 4 | 5 | const StandbyScreen: React.FC = () => { 6 | return ( 7 | 8 |
9 | 10 |