- {!this.props.loadingSelectionList && !this.props.loadingSearch
- ? this.props.selectionList.length === 0
- ? 'みつかりませんでした'
- : 'これ以上データはありません'
- : false}
-
- ) : (
- false
- )
-
- return (
- {}} onClick={(e) => {this.openDetail(e, each)}}>
- return (
-
{}}
- onClick={() => {
- this.props.setDisplayScoreModal(true, each)
- }}
- >
-
- {/* {boxInfo} */}
-
- {each.titleJa}
-
-
- {each.titleEn}
-
-
-
- {composer}
- {bar}
- {arranger}
-
-
-
-
- )
- })
- }
-
- renderLoadMore() {
- if (this.props.loadingScore || !this.props.scoreList) return
- if (this.props.loadMoreLoading) return
- if (this.props.scoreList.length > 10 && this.props.scoreList.length !== this.props.showList.length) {
- return (
-
this.props.loadMore()} className="score-more">
- すべての楽譜を表示
-
- )
- }
- }
-
- keyPress(e) {
- if (e.which === 13) this.props.getScoreList(this.props.searchQuery)
- }
-
- renderSearch() {
- const searchIcon = this.props.loadingSearch ? (
-
- ) : (
-
- )
- const searchBarButtonClass = this.props.searchQuery ? 'search-bar-button' : 'search-bar-button hidden'
- return (
-
-
-
-
{searchIcon}
-
this.props.changeSearchText(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- ref={(i) => {
- !this.props.searchBoxRef ? this.props.setSearchBoxRef(i) : false
- }}
- placeholder="検索"
- />
-
this.props.resetSearchQuery()} className={searchBarButtonClass}>
-
-
-
-
-
- )
- }
-
- renderCount() {
- if (this.props.loadingScore || !this.props.scoreList) return false
- const title = this.props.searchQuery ? '該当' : '楽譜'
- return (
-
-
- {this.props.scoreList ? {title} : false}
- {this.props.scoreList ? {this.props.scoreList.length} : false}
- {this.props.scoreList ? 件 : false}
-
-
- )
- }
-
- renderAddNewScore() {
- if (this.props.loadingScore || !this.props.scoreList) return false
- if (!libScore.admin(this.props.user)) return false
- return (
-
-
this.props.setDisplayEditScoreModal(true, 'new', undefined)}>
- {this.props.editPreLoading ? (
-
-
-
- ) : (
-
- 新しい楽譜を追加
-
- )}
-
-
- )
- }
-
- renderBoxManagement() {
- if (this.props.loadingScore || !this.props.scoreList) return false
- if (!libScore.admin(this.props.user)) return false
- return (
-
- )
- }
-
- render() {
- const showSearch = this.renderSearch()
- const showCount = this.renderCount()
- const showScoreList = this.renderScoreList()
- const showLoadMore = this.renderLoadMore()
-
- const endLabel = this.props.scoreList ? (
- !(this.props.scoreList.length > 10 && this.props.scoreList.length !== this.props.showList.length) ? (
-
- {!this.props.loading && !this.props.loadingSearch
- ? this.props.scoreList.length === 0
- ? 'みつかりませんでした'
- : 'これ以上データはありません'
- : false}
-
- ) : (
- false
- )
- ) : (
- false
- )
-
- const showAddNewScore = this.renderAddNewScore()
- const showBoxManagement = this.renderBoxManagement()
-
- return (
-
-
-
- ホーム
-
- ウィンズスコア
-
-
ウィンズスコア
-
ウィンズが所有している楽譜です
-
-
-
- {showSearch}
- {showCount}
- {showScoreList}
- {showLoadMore}
- {endLabel}
-
-
- {showAddNewScore}
-
- {showBoxManagement}
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Home)
diff --git a/client/src/Component/Auth/Score/Library/Input/Input.js b/client/src/Component/Auth/Score/Library/Input/Input.js
deleted file mode 100644
index 59bb4d4b..00000000
--- a/client/src/Component/Auth/Score/Library/Input/Input.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import React, { Component } from 'react'
-import request from 'superagent'
-
-import * as lib from '../../../../../Library/Library'
-
-import './Input.css'
-
-export default class Input extends Component {
- constructor(props) {
- super(props)
- this.state = {
- load: undefined,
- value: this.props.value,
- num: undefined,
- list: [],
- }
- }
-
- changeValue(e) {
- this.setState({ value: e.target.value })
- if (this.props.onChange) {
- this.props.onChange({
- target: this,
- value: e.target.value,
- })
- }
- if (!e.target.value) return this.setState({ list: [] })
- this.setState({ load: false })
- // URL
- request
- .post('https://score.winds-n.com/api/member/input')
- // request.post('http://192.168.1.22:3011/api/member/input')
- .type('form')
- .send({
- session: lib.getSession(),
- target: this.props.target,
- query: e.target.value,
- })
- .end((err, res) => {
- if (err) return
- const response = res.body
- if (response.status) {
- this.setState({ list: response.list, load: true })
- return
- }
- })
- }
-
- setValue(text) {
- this.setState({ value: text, list: [] })
- if (this.props.onChange) {
- this.props.onChange({
- target: this,
- value: text,
- })
- }
- }
-
- UNSAFE_componentWillReceiveProps(nextProps) {
- this.setState({ value: nextProps.value })
- }
-
- render() {
- var correctArray = []
- const autoCorrect = this.state.list.map((each) => {
- const text = each[this.props.target]
- if (Array.isArray(text)) {
- return text.map((e, i) => {
- if (correctArray.indexOf(e) === -1) {
- correctArray.push(e)
- return (
-
this.setValue(e)} className="auto-correct">
- {e}
-
- )
- }
- })
- } else {
- if (correctArray.indexOf(text) === -1) {
- correctArray.push(text)
- return (
-
this.setValue(text)} className="auto-correct">
- {text}
-
- )
- }
- }
- })
- const classProps = this.props.className ? 'input ' + this.props.className : 'input'
- return (
-
-
- this.changeValue(e)}
- />
- {autoCorrect}
-
- )
- }
-}
diff --git a/client/src/Component/Auth/Score/Library/Input/Input.scss b/client/src/Component/Auth/Score/Library/Input/Input.scss
deleted file mode 100644
index 47a7983b..00000000
--- a/client/src/Component/Auth/Score/Library/Input/Input.scss
+++ /dev/null
@@ -1 +0,0 @@
-// Auth.scssにて設定
diff --git a/client/src/Component/Auth/Score/Library/Library.js b/client/src/Component/Auth/Score/Library/Library.js
deleted file mode 100644
index f81dd319..00000000
--- a/client/src/Component/Auth/Score/Library/Library.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export function makeLine(array) {
- var s = ''
- for (var i = 0; i < array.length; i++) {
- s += array[i] + ', '
- }
- s = s.slice(0, -2)
- // if (s === '') {
- // s = 'No Data'
- // }
- return s
-}
-
-export function admin(user) {
- return user.scoreAdmin ? true : false
-}
diff --git a/client/src/Component/Auth/Score/Score.js b/client/src/Component/Auth/Score/Score.js
deleted file mode 100644
index efc789ff..00000000
--- a/client/src/Component/Auth/Score/Score.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import React, { Component } from 'react'
-import { Route, Switch, Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../Library/Icons/Back'
-import * as lib from '../../../Library/Library'
-
-import Home from './Home/Home'
-import Detail from './Detail/Detail'
-import Box from './Box/Box'
-
-import './Score.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- }
-}
-
-function mapDispatchToProps() {
- return {}
-}
-
-class Score extends Component {
- render() {
- return (
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Score)
diff --git a/client/src/Component/Auth/Score/Score.scss b/client/src/Component/Auth/Score/Score.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Score/ScoreModal/ScoreModal.js b/client/src/Component/Auth/Score/ScoreModal/ScoreModal.js
deleted file mode 100644
index 6385eb41..00000000
--- a/client/src/Component/Auth/Score/ScoreModal/ScoreModal.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import { setDisplayScoreModal } from '../../../../Actions/Score'
-
-import * as lib from '../../../../Library/Library'
-import * as libScore from '../Library/Library'
-
-import './ScoreModal.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- // scoreList: state.score.scoreList,
- displayScoreModal: state.score.displayScoreModal,
- modalContent: state.score.modalContent,
- displayPlayer: state.audio.displayPlayer,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setDisplayScoreModal(displayScoreModal, modalContent) {
- dispatch(setDisplayScoreModal(displayScoreModal, modalContent))
- },
- }
-}
-
-class ScoreModal extends Component {
- renderModalContent() {
- if (!this.props.modalContent) return
- const titleJa = this.props.modalContent.titleJa ? (
-
{this.props.modalContent.titleJa}
- ) : (
-
No Data
- )
- const titleEn = this.props.modalContent.titleEn ? (
-
{this.props.modalContent.titleEn}
- ) : (
-
No Data
- )
- const composer =
- this.props.modalContent.composer[0] !== '' ? (
-
{libScore.makeLine(this.props.modalContent.composer)}
- ) : (
-
No Data
- )
- const arranger =
- this.props.modalContent.arranger[0] !== '' ? (
-
{libScore.makeLine(this.props.modalContent.arranger)}
- ) : (
-
No Data
- )
- const storageStatus = () => {
- if (this.props.modalContent.scoreStatus === '2') {
- return
貸出中
- } else if (this.props.modalContent.scoreStatus === '1') {
- return
使用中
- } else if (this.props.modalContent.scoreStatus === '0') {
- return
保管
- } else {
- return
削除
- }
- }
- // const displayScoreModalClass = this.props.displayScoreModal ? ' open' : ''
- const gap = this.props.displayPlayer ?
: false
- return (
-
-
-
詳細
-
this.props.setDisplayScoreModal(false, this.props.modalContent)} className="close">
- ×
-
-
-
-
-
-
-
-
{storageStatus()}
-
-
- {/*
*/}
-
-
- {this.props.modalContent.boxLabel}
- {this.props.modalContent.label}
-
-
-
-
-
- {titleJa}
-
-
-
- {titleEn}
-
-
-
-
- {composer}
-
-
-
- {arranger}
-
-
-
- this.props.setDisplayScoreModal(false, this.props.modalContent)}
- >
- 詳細を表示
-
-
-
- {gap}
-
-
- )
- }
-
- render() {
- const displayScoreModalClass = this.props.displayScoreModal ? ' open' : ''
- const showModalContent = this.renderModalContent()
- return (
-
-
{showModalContent}
-
this.props.setDisplayScoreModal(false, this.props.modalContent)}
- >
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(ScoreModal)
diff --git a/client/src/Component/Auth/Setting/About/About.js b/client/src/Component/Auth/Setting/About/About.js
deleted file mode 100644
index db5980a0..00000000
--- a/client/src/Component/Auth/Setting/About/About.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-
-import Logo from '../../../../Asset/hr.svg'
-
-import './About.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- }
-}
-
-class About extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('このアプリについて')
- this.props.setBackNavigation(true, '/setting')
- }
-
- render() {
- return (
-
-
-
- ホーム
-
- 設定
-
- このアプリについて
-
-
このアプリについて
-
-
-
-
-
-
-
-
-
- 会員専用アプリ
-
-
-
- Version
- {lib.version}
-
-
- {/* {update} */}
-
-
-
-
アカウントについて
-
ひとつのアカウントで同時に複数の端末にログインすることができるようになりました。
-
- アカウント登録の際に記録される情報は、入力いただいた名前、パスワードおよび登録日時のみです。
- パスワードはSHA-512でハッシュ化し保存しています。 これらの情報はアカウントを削除すると全て消去されます。
-
-
楽曲再生時の注意点
-
- アプリにて閲覧できる音源、写真、映像はウェブ利用にあわせ圧縮および最適化しています。
- 高品質でご覧になりたい場合はCDやDVDをご利用ください。
- また、オリジナルのデータが必要な場合はお問い合わせください。
-
-
- 再生ごとにサーバーから音源データを取得するため通信量がかかります。
- 録音は5分あたり5MBほど、映像は5分あたり20MBほど使用します。 WiFiの使用を推奨します。
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(About)
diff --git a/client/src/Component/Auth/Setting/AccountDelete/AccountDelete.js b/client/src/Component/Auth/Setting/AccountDelete/AccountDelete.js
deleted file mode 100644
index 5e49c1c6..00000000
--- a/client/src/Component/Auth/Setting/AccountDelete/AccountDelete.js
+++ /dev/null
@@ -1,134 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-import { confirmAlert } from 'react-confirm-alert'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { redirect, setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-import { setDeletePassword, sendDeleteRequest } from '../../../../Actions/Setting'
-
-import './AccountDelete.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
-
- deletePassword: state.setting.deletePassword,
- loadingDeleteAccount: state.setting.loadingDeleteAccount,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- redirect(location) {
- dispatch(redirect(location))
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- setDeletePassword(deletePassword) {
- dispatch(setDeletePassword(deletePassword))
- },
- sendDeleteRequest() {
- dispatch(sendDeleteRequest())
- },
- }
-}
-
-class AccountDelete extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('アカウントの削除')
- this.props.setBackNavigation(true, '/setting')
- }
-
- componentWillUnmount() {}
-
- deleteRequest() {
- confirmAlert({
- customUI: ({ onClose }) => {
- return (
-
-
アカウントを削除しますか?
-
ユーザー情報は完全に削除されます。
-
-
-
-
-
- )
- },
- })
- }
-
- render() {
- const buttonText = this.props.loadingDeleteAccount ? '読み込み中...' : '削除'
- const disabledClass = !this.props.deletePassword || this.props.loadingDeleteAccount ? ' disabled' : ''
- const buttonHandler =
- !this.props.deletePassword || this.props.loadingDeleteAccount ? () => {} : () => this.deleteRequest()
-
- return (
-
-
-
- ホーム
-
- 設定
-
- アカウントの削除
-
-
アカウントの削除
-
ウィンズサーバから関連する全ての情報が削除されます。
-
-
-
-
-
- this.props.setDeletePassword(e.target.value)}
- />
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(AccountDelete)
diff --git a/client/src/Component/Auth/Setting/AccountDelete/AccountDelete.scss b/client/src/Component/Auth/Setting/AccountDelete/AccountDelete.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Setting/Admin/Admin.js b/client/src/Component/Auth/Setting/Admin/Admin.js
deleted file mode 100644
index e6844905..00000000
--- a/client/src/Component/Auth/Setting/Admin/Admin.js
+++ /dev/null
@@ -1,142 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-import { confirmAlert } from 'react-confirm-alert'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { redirect, setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-import { setAdminRequestPass, sendAdminRequest } from '../../../../Actions/Setting'
-
-import './Admin.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
-
- adminRequestPass: state.setting.adminRequestPass,
- loadingAdminRequest: state.setting.loadingAdminRequest,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- redirect(location) {
- dispatch(redirect(location))
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- setAdminRequestPass(adminRequestPass) {
- dispatch(setAdminRequestPass(adminRequestPass))
- },
- sendAdminRequest() {
- dispatch(sendAdminRequest())
- },
- }
-}
-
-class Admin extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('管理者設定')
- this.props.setBackNavigation(true, '/setting')
- }
-
- componentWillUnmount() {}
-
- requestQuitAdmin() {
- confirmAlert({
- customUI: ({ onClose }) => {
- return (
-
-
管理者を辞めますか?
-
改めて管理者になるにはパスワードの再入力が必要です
-
-
-
-
-
- )
- },
- })
- }
-
- renderPasswordInput(admin) {
- if (admin) return false
- return (
-
-
-
- this.props.setAdminRequestPass(e.target.value)}
- placeholder="パスワード"
- />
-
-
- )
- }
-
- render() {
- const disabled = this.props.adminRequestPass
- const admin = 'admin' in this.props.user ? this.props.user.admin : false
- const showPasswordInput = this.renderPasswordInput(admin)
- const buttonText = admin ? '管理者を辞める' : '管理者登録'
- const buttonHandler = admin ? () => this.requestQuitAdmin() : () => this.props.sendAdminRequest()
- return (
-
-
-
- ホーム
-
- 設定
-
- 管理者設定
-
-
管理者
-
いろいろできるようになります
-
-
- {showPasswordInput}
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Admin)
diff --git a/client/src/Component/Auth/Setting/Admin/Admin.scss b/client/src/Component/Auth/Setting/Admin/Admin.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Setting/Component/Modify/Modify.js b/client/src/Component/Auth/Setting/Component/Modify/Modify.js
deleted file mode 100644
index 3465b051..00000000
--- a/client/src/Component/Auth/Setting/Component/Modify/Modify.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import React, { Component } from 'react'
-
-import { connect } from 'react-redux'
-
-import * as lib from '../../../../../Library/Library'
-
-import { setModifyText, updateModifyText } from '../../../../../Actions/Setting'
-
-import './Modify.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loadingModify: state.setting.loadingModify,
- modifyText: state.setting.modifyText,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setModifyText(text) {
- dispatch(setModifyText(text))
- },
- updateModifyText(apiPath, replacePath) {
- dispatch(updateModifyText(apiPath, replacePath))
- },
- }
-}
-
-class Modify extends Component {
- componentDidMount() {
- this.props.setModifyText(this.props.text)
- }
-
- sendText() {
- if (!this.props.modifyText) return
- if (!this.props.api) return
- this.props.updateModifyText(this.props.api, '/setting')
- }
-
- keyPress(e) {
- if (e.which === 13) this.sendText(e)
- }
-
- cancel() {
- if (this.props.onCancel) {
- this.props.onCancel()
- }
- }
-
- render() {
- const buttonText = this.props.loadingModify ? '読み込み中...' : '保存'
- const disabledClass =
- this.props.modifyText === this.props.text || !this.props.modifyText || this.props.loadingModify ? ' disabled' : ''
- const buttonHandler =
- this.props.modifyText === this.props.text || !this.props.modifyText || this.props.loadingModify
- ? () => {}
- : () => this.sendText()
- return (
-
-
-
-
- this.props.setModifyText(e.target.value)}
- placeholder={this.props.text}
- onKeyPress={(e) => this.keyPress(e)}
- />
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Modify)
diff --git a/client/src/Component/Auth/Setting/Component/Modify/Modify.scss b/client/src/Component/Auth/Setting/Component/Modify/Modify.scss
deleted file mode 100644
index 69a64b55..00000000
--- a/client/src/Component/Auth/Setting/Component/Modify/Modify.scss
+++ /dev/null
@@ -1 +0,0 @@
-// index.scss で設定
diff --git a/client/src/Component/Auth/Setting/Email/Email.js b/client/src/Component/Auth/Setting/Email/Email.js
deleted file mode 100644
index 2b8b0370..00000000
--- a/client/src/Component/Auth/Setting/Email/Email.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { redirect, setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-import { deleteEmailRequest } from '../../../../Actions/Setting'
-
-import Modify from '../Component/Modify/Modify'
-
-import './Email.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
-
- loadingDeleteEmailRequest: state.setting.loadingDeleteEmailRequest,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- redirect(location) {
- dispatch(redirect(location))
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- deleteEmailRequest() {
- dispatch(deleteEmailRequest())
- },
- }
-}
-
-class Email extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('メールアドレスの設定')
- this.props.setBackNavigation(true, '/setting')
- }
-
- componentWillUnmount() {}
-
- emailChanged() {
- this.props.redirect('/setting')
- }
-
- canceled() {
- this.props.redirect('/setting')
- }
-
- renderDeleteEmail() {
- if (!this.props.user.email) return false
- const buttonHandler = this.props.loadingDeleteEmailRequest ? () => {} : () => this.props.deleteEmailRequest()
- const disabledClass = this.props.loadingDeleteEmailRequest ? ' disable' : ''
- const buttonText = this.props.loadingDeleteEmailRequest ? '読み込み中...' : 'メールアドレスの登録を解除'
- return (
-
- )
- }
-
- render() {
- const email = this.props.user.email ? this.props.user.email : ''
- const showDeleteEmail = this.renderDeleteEmail()
-
- return (
-
-
-
- ホーム
-
- 設定
-
- メールアドレスの設定
-
-
メールアドレスの設定
-
連絡先を登録します
-
-
- this.emailChanged()}
- onCancel={() => this.canceled()}
- />
-
- {showDeleteEmail}
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Email)
diff --git a/client/src/Component/Auth/Setting/Email/Email.scss b/client/src/Component/Auth/Setting/Email/Email.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Setting/EmailValidation/EmailValidation.js b/client/src/Component/Auth/Setting/EmailValidation/EmailValidation.js
deleted file mode 100644
index cbf3f2d4..00000000
--- a/client/src/Component/Auth/Setting/EmailValidation/EmailValidation.js
+++ /dev/null
@@ -1,167 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-import { setKey, requestValid } from '../../../../Actions/EmailValidation'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import './EmailValidation.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.emailValidation.loading,
- key: state.emailValidation.key,
- // valid: state.emailValidation.valid,
- windsid: state.login.windsid,
- password: state.login.password,
- err: state.emailValidation.err,
-
- user: state.status.user,
- login: state.status.login,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setKey(key) {
- dispatch(setKey(key))
- },
- requestValid(key) {
- dispatch(requestValid(key))
- },
- }
-}
-
-class EmailValidation extends Component {
- constructor(props) {
- super(props)
- const { params } = this.props.match
- const key = params.key ? params.key : ''
- this.props.setKey(key)
- this.props.requestValid(key)
- }
-
- renderResult() {
- if (this.props.err) {
- switch (this.props.err.type) {
- case 'DBError':
- return (
-
-
- データベースエラーです
-
-
- )
- case 'notMatchError':
- return (
-
-
- URLが無効です
-
-
- )
- case 'noDataError':
- return (
-
-
- URLが無効です
-
-
- )
- case 'expiredError':
- return (
-
-
- リンクの期限が切れています
-
-
- )
- case 'alreadyValid':
- return (
-
-
- 確認しました
-
-
- )
- default:
- return (
-
-
- エラーが発生しました
-
-
- )
- }
- } else {
- return (
-
-
- 確認済み
-
-
- )
- }
- }
-
- render() {
- const validResult =
- this.props.loading || !this.props.user ? (
-
- ) : this.props.user.emailValid ? (
-
-
- 確認済み
-
-
- ) : (
- this.renderResult()
- )
- const emailAddress = this.props.loading || !this.props.user ? false : this.props.user.email
- return (
-
-
-
- ホーム
-
- 設定
-
- メールアドレスの確認
-
-
メールアドレスの確認
-
-
-
-
- {emailAddress}
- {validResult}
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(EmailValidation)
diff --git a/client/src/Component/Auth/Setting/Home/Home.js b/client/src/Component/Auth/Setting/Home/Home.js
deleted file mode 100644
index beb14796..00000000
--- a/client/src/Component/Auth/Setting/Home/Home.js
+++ /dev/null
@@ -1,343 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-import { confirmAlert } from 'react-confirm-alert'
-
-import { connect } from 'react-redux'
-
-import { getUser } from '../../../../Actions/Setting'
-import { setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-import { closePlayer } from '../../../../Actions/Audio'
-import { requestEmail } from '../../../../Actions/EmailValidation'
-import { openFirstTutorial } from '../../../../Actions/Tutorial'
-import { logout } from '../../../../Actions/Status'
-
-import Forward from '../../../../Library/Icons/Forward'
-import * as lib from '../../../../Library/Library'
-
-import './Home.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
- displayPlayer: state.audio.displayPlayer,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- getUser() {
- dispatch(getUser())
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- closePlayer(e) {
- dispatch(closePlayer(e))
- },
- requestEmail() {
- dispatch(requestEmail())
- },
- openFirstTutorial() {
- dispatch(openFirstTutorial())
- },
- logout() {
- dispatch(logout())
- },
- }
-}
-
-class Home extends Component {
- UNSAFE_componentWillMount() {
- this.props.getUser()
- }
-
- componentDidMount() {
- this.props.setNavigationTitle('設定')
- this.props.setBackNavigation(true, '/')
- }
-
- componentWillUnmount() {}
-
- logout() {
- confirmAlert({
- customUI: ({ onClose }) => {
- return (
-
-
ログアウトしますか?
-
ユーザー情報は端末に残りません。
-
-
-
-
-
- )
- },
- })
- }
-
- renderPlayerClose() {
- if (!this.props.displayPlayer) return false
- return (
-
-
this.props.closePlayer(e)} className="button">
- プレイヤーを閉じる
-
-
- )
- }
-
- renderRequestEmailValid() {
- if (this.props.user.email && !this.props.user.emailValid) {
- return (
-
-
this.props.requestEmail()} className="button">
- 確認メールの再送
-
-
- )
- }
- }
-
- renderUserStatus() {
- if (this.props.loading || !this.props.user)
- return (
-
- )
- const secure =
- this.props.user.hash && lib.getToken(this.props.user) ? (
-
-
-
- ) : (
-
-
-
- )
- const email = this.props.user.email ?
{this.props.user.email} :
未設定
- const emailValid = this.props.user.email ? (
- this.props.user.emailValid ? (
-
-
- 確認済み
-
-
- ) : (
-
-
- 未確認
-
-
- )
- ) : (
- false
- )
-
- const admin = 'admin' in this.props.user ? this.props.user.admin : false
- const showAdmin = admin ? (
-
- 管理者
-
- ) : (
- false
- )
- const scoreAdmin = 'scoreAdmin' in this.props.user ? this.props.user.scoreAdmin : false
- const showScoreAdmin = scoreAdmin ? (
-
- 楽譜管理者
-
- ) : (
- false
- )
-
- return (
-
-
-
-
- {this.props.user.userid}
-
- {/*
{this.props.user.createdAt}
*/}
-
-
- {this.props.user.name}
- {showAdmin}
- {showScoreAdmin}
-
-
-
- {email}
- {emailValid}
-
-
-
- )
- }
-
- render() {
- const showUserStatus = this.renderUserStatus()
- const showPlayerClose = this.renderPlayerClose()
- const showRequestEmailValid = this.renderRequestEmailValid()
-
- return (
-
-
-
- ホーム
-
- 設定
-
-
設定
-
各種設定はこちらから
-
-
- {showUserStatus}
-
- {showRequestEmailValid}
- {showPlayerClose}
-
- アカウントの設定
-
-
-
- -
-
-
- 名前
-
-
-
-
- -
-
-
- メールアドレス
-
-
-
-
- -
-
-
- パスワード
-
-
-
-
- -
-
-
- セッションの管理
-
-
-
-
- -
-
-
- 管理者設定
-
-
-
-
- -
-
-
- アカウントの削除
-
-
-
-
-
-
-
-
- ウィンズスコア
-
-
-
- -
-
-
- CSV出力
-
-
-
-
- -
-
-
- 管理者設定
-
-
-
-
-
-
-
-
- 情報
-
-
-
- -
-
-
- ウィンズ会員規約
-
-
-
-
- -
-
-
- このアプリについて
-
-
-
-
- -
-
this.props.openFirstTutorial()}>
-
- チュートリアルを開く
-
-
-
- -
-
-
- ライセンス情報
-
-
-
-
-
-
-
-
-
-
this.logout()} className="button">
- ログアウト
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Home)
diff --git a/client/src/Component/Auth/Setting/License/License.js b/client/src/Component/Auth/Setting/License/License.js
deleted file mode 100644
index 39588444..00000000
--- a/client/src/Component/Auth/Setting/License/License.js
+++ /dev/null
@@ -1,144 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-
-import Logo from '../../../../Asset/hr.svg'
-
-import './License.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- }
-}
-
-class License extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('ライセンス情報')
- this.props.setBackNavigation(true, '/setting')
- }
-
- render() {
- return (
-
-
-
- ホーム
-
- 設定
-
- ライセンス情報
-
-
ライセンス情報
-
-
-
-
-
-
-
-
-
- 会員専用アプリ
-
-
-
- Version
- {lib.version}
-
-
-
-
-
-
-
Made for The Wind Ensemble members.
-
This software is made possible with the following open sources.
-
Thank the open source community for all of their contributions.
-
-
-
-
Application Dependencies
-
- Developed with React
-
-
- React
- version
- 16.8.6
-
-
- Redux
- version
- 4.0.1
-
-
- SuperAgent
- version
- 3.8.2
-
-
Server Dependencies
-
- Developed with Node.js
-
-
- Express
- version
- 4.17.1
-
-
- NeDB
- version
- 1.8.0
-
-
Based Technologies
-
- HTML 5
-
-
- CSS 3
-
-
- JavaScript (ECMAScript2018)
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(License)
diff --git a/client/src/Component/Auth/Setting/Name/Name.js b/client/src/Component/Auth/Setting/Name/Name.js
deleted file mode 100644
index 6b9feec1..00000000
--- a/client/src/Component/Auth/Setting/Name/Name.js
+++ /dev/null
@@ -1,96 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { redirect, setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-
-import Modify from '../Component/Modify/Modify'
-
-import './Name.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- redirect(location) {
- dispatch(redirect(location))
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- }
-}
-
-class Name extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('名前の変更')
- this.props.setBackNavigation(true, '/setting')
- }
-
- componentWillUnmount() {}
-
- nameChanged() {
- this.props.redirect('/setting')
- }
-
- canceled() {
- this.props.redirect('/setting')
- }
-
- render() {
- return (
-
-
-
- ホーム
-
- 設定
-
- 名前の変更
-
-
名前の変更
-
名前を変える意味はあんまりないです
-
-
- this.nameChanged()}
- onCancel={() => this.canceled()}
- />
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Name)
diff --git a/client/src/Component/Auth/Setting/Name/Name.scss b/client/src/Component/Auth/Setting/Name/Name.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Setting/Password/Password.js b/client/src/Component/Auth/Setting/Password/Password.js
deleted file mode 100644
index ae823497..00000000
--- a/client/src/Component/Auth/Setting/Password/Password.js
+++ /dev/null
@@ -1,122 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { redirect, setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-import { setOldPassword, setNewPassword, updatePassword } from '../../../../Actions/Setting'
-
-import './Password.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
-
- oldPassword: state.setting.oldPassword,
- newPassword: state.setting.newPassword,
- loadingUpdatePassword: state.setting.loadingUpdatePassword,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- redirect(location) {
- dispatch(redirect(location))
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- setOldPassword(oldPassword) {
- dispatch(setOldPassword(oldPassword))
- },
- setNewPassword(newPassword) {
- dispatch(setNewPassword(newPassword))
- },
- updatePassword() {
- dispatch(updatePassword())
- },
- }
-}
-
-class Password extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('パスワードの変更')
- this.props.setBackNavigation(true, '/setting')
- }
-
- componentWillUnmount() {}
-
- render() {
- const buttonText = this.props.loadingScoreMailRequest ? '読み込み中...' : '送信'
- const disabledClass =
- (!this.props.newPassword && !this.props.oldPassword) || this.props.loadingUpdatePassword ? ' disabled' : ''
- const buttonHandler =
- (!this.props.newPassword && !this.props.oldPassword) || this.props.loadingUpdatePassword
- ? () => {}
- : () => this.props.updatePassword()
-
- return (
-
-
-
- ホーム
-
- 設定
-
- パスワードの変更
-
-
パスワードの変更
-
定期的に変えるよりは長くて強固なパスワードがよいとされています
-
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Password)
diff --git a/client/src/Component/Auth/Setting/Password/Password.scss b/client/src/Component/Auth/Setting/Password/Password.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Setting/Score/Admin/Admin.js b/client/src/Component/Auth/Setting/Score/Admin/Admin.js
deleted file mode 100644
index d3788c68..00000000
--- a/client/src/Component/Auth/Setting/Score/Admin/Admin.js
+++ /dev/null
@@ -1,134 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-import { confirmAlert } from 'react-confirm-alert'
-
-import { connect } from 'react-redux'
-
-import * as lib from '../../../../../Library/Library'
-
-import { redirect, setNavigationTitle, setBackNavigation } from '../../../../../Actions/Navigation'
-import { setScoreAdminRequestPass, sendScoreAdminRequest } from '../../../../../Actions/Setting'
-
-import './Admin.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
-
- scoreAdminRequestPass: state.setting.scoreAdminRequestPass,
- loadingScoreAdminRequest: state.setting.loadingScoreAdminRequest,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- redirect(location) {
- dispatch(redirect(location))
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- setScoreAdminRequestPass(scoreAdminRequestPass) {
- dispatch(setScoreAdminRequestPass(scoreAdminRequestPass))
- },
- sendScoreAdminRequest() {
- dispatch(sendScoreAdminRequest())
- },
- }
-}
-
-class Admin extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('楽譜管理者')
- this.props.setBackNavigation(true, '/setting')
- }
-
- componentWillUnmount() {}
-
- requestQuitAdmin() {
- confirmAlert({
- customUI: ({ onClose }) => {
- return (
-
-
楽譜管理者を辞めますか?
-
改めて楽譜管理者になるにはパスワードの再入力が必要です
-
-
-
-
-
- )
- },
- })
- }
-
- renderPasswordInput(admin) {
- if (admin) return false
- return (
-
-
-
- this.props.setScoreAdminRequestPass(e.target.value)}
- placeholder="パスワード"
- />
-
-
- )
- }
-
- render() {
- const disabled = this.props.adminRequestPass
- const admin = 'scoreAdmin' in this.props.user ? this.props.user.scoreAdmin : false
- const showPasswordInput = this.renderPasswordInput(admin)
- const buttonText = admin ? '管理者を辞める' : '管理者登録'
- const buttonHandler = admin ? () => this.requestQuitAdmin() : () => this.props.sendScoreAdminRequest()
- return (
-
-
-
- ホーム
-
- 設定
-
- 楽譜管理者
-
-
楽譜管理者
-
楽譜登録情報の追加/編集ができるようになります
-
-
- {showPasswordInput}
-
-
-
- {/* */}
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Admin)
diff --git a/client/src/Component/Auth/Setting/Score/Admin/Admin.scss b/client/src/Component/Auth/Setting/Score/Admin/Admin.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Setting/Score/Home/Home.js b/client/src/Component/Auth/Setting/Score/Home/Home.js
deleted file mode 100644
index 47494aee..00000000
--- a/client/src/Component/Auth/Setting/Score/Home/Home.js
+++ /dev/null
@@ -1,138 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import { getUser } from '../../../../../Actions/Setting'
-import { setNavigationTitle, setBackNavigation } from '../../../../../Actions/Navigation'
-
-import Forward from '../../../../../Library/Icons/Forward'
-import * as lib from '../../../../../Library/Library'
-
-import './Home.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
- displayPlayer: state.audio.displayPlayer,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- getUser() {
- dispatch(getUser())
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- }
-}
-
-class Home extends Component {
- UNSAFE_componentWillMount() {
- this.props.getUser()
- }
-
- componentDidMount() {
- this.props.setNavigationTitle('ウィンズスコア設定')
- this.props.setBackNavigation(true, '/setting')
- }
-
- componentWillUnmount() {}
-
- renderUserStatus() {
- if (this.props.loading || !this.props.user)
- return (
-
- )
- const secure =
- this.props.user.hash && this.props.user.token ? (
-
-
-
- ) : (
-
-
-
- )
- const email = this.props.user.email ? this.props.user.email : '未設定'
- return (
-
-
-
- {this.props.user.userid}
-
- {/*
{this.props.user.createdAt}
*/}
-
-
- {this.props.user.name}
-
-
-
- {email}
-
-
- )
- }
-
- render() {
- // const showUserStatus = this.renderUserStatus()
-
- return (
-
-
-
- ホーム
-
- 設定
-
- ウィンズスコア設定
-
-
ウィンズスコア設定
-
各種設定はこちらから
-
-
- {/* */}
-
-
-
-
- -
-
-
- 管理者設定
-
-
-
-
- -
-
-
- CSV出力
-
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Home)
diff --git a/client/src/Component/Auth/Setting/Score/Home/Home.scss b/client/src/Component/Auth/Setting/Score/Home/Home.scss
deleted file mode 100644
index 74cf1061..00000000
--- a/client/src/Component/Auth/Setting/Score/Home/Home.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-.setting-status {
- label {
- display: block;
- color: #888;
- font-size: 12px;
-
- .secure i {
- color: rgba(76, 217, 100, 1);
- }
-
- .non-secure i {
- color: #888;
- }
- }
-}
diff --git a/client/src/Component/Auth/Setting/Score/Mail/Mail.js b/client/src/Component/Auth/Setting/Score/Mail/Mail.js
deleted file mode 100644
index dd70135b..00000000
--- a/client/src/Component/Auth/Setting/Score/Mail/Mail.js
+++ /dev/null
@@ -1,115 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import * as lib from '../../../../../Library/Library'
-
-import { redirect, setNavigationTitle, setBackNavigation } from '../../../../../Actions/Navigation'
-import { getScoreCount, scoreMailRequest } from '../../../../../Actions/Setting'
-
-import './Mail.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
-
- loadingScoreCount: state.setting.loadingScoreCount,
- scoreCount: state.setting.scoreCount,
- loadingScoreMailRequest: state.setting.loadingScoreMailRequest,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- redirect(location) {
- dispatch(redirect(location))
- },
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- getScoreCount() {
- dispatch(getScoreCount())
- },
- scoreMailRequest() {
- dispatch(scoreMailRequest())
- },
- }
-}
-
-class Mail extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('CSV出力')
- this.props.setBackNavigation(true, '/setting')
- this.props.getScoreCount()
- }
-
- componentWillUnmount() {}
-
- renderScoreStatus() {
- // if (this.props.loadingScoreCount) return
- const showScoreCount = this.props.loadingScoreCount ? (
-
読み込み中...
- ) : (
-
{this.props.scoreCount}
- )
- const email = this.props.user.email ?
{this.props.user.email} :
未設定
- return (
-
-
-
- {showScoreCount}
-
-
-
- {email}
-
-
- )
- }
-
- render() {
- const showScoreStatus = this.renderScoreStatus()
-
- const email = 'email' in this.props.user ? this.props.user.email : false
- const buttonText = this.props.loadingScoreMailRequest ? '送信中...' : '送信'
- const disabledClass =
- !email || email === '' || !this.props.user.emailValid || this.props.loadingScoreMailRequest ? ' disabled' : ''
- const buttonHandler =
- !email || email === '' || !this.props.user.emailValid || this.props.loadingScoreMailRequest
- ? () => {}
- : () => this.props.scoreMailRequest()
- return (
-
-
-
- ホーム
-
- 設定
-
- CSV出力
-
-
CSV出力
-
ウィンズスコア一覧をCSVにて登録されたメールアドレスへ送信します。
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Mail)
diff --git a/client/src/Component/Auth/Setting/Score/Mail/Mail.scss b/client/src/Component/Auth/Setting/Score/Mail/Mail.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Auth/Setting/Score/Score.js b/client/src/Component/Auth/Setting/Score/Score.js
deleted file mode 100644
index 965641b6..00000000
--- a/client/src/Component/Auth/Setting/Score/Score.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import React, { Component } from 'react'
-import { Route, Switch, Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-// import Home from './Home/Home'
-import Admin from './Admin/Admin'
-import Mail from './Mail/Mail'
-
-import './Score.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- }
-}
-
-function mapDispatchToProps() {
- return {}
-}
-
-class Score extends Component {
- render() {
- return (
-
-
- {/* */}
-
-
-
-
-
- {/*
*/}
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Score)
diff --git a/client/src/Component/Auth/Setting/Score/Score.scss b/client/src/Component/Auth/Setting/Score/Score.scss
deleted file mode 100644
index d25883a4..00000000
--- a/client/src/Component/Auth/Setting/Score/Score.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-.setting {
- width: 100%;
- // max-width: 600px;
- margin: 0 auto;
- // font-size: 13px;
-
- // &.mobile {
- // margin: 12px 0;
- // }
-
- // background: #fff;
-
- // &.pc {
- // .contents-header {
- // h2 {
- // padding: 0 16px;
- // }
-
- // p {
- // padding: 0 16px;
- // }
- // }
- // }
-
- // .contents-header {
- // margin: 0;
- // padding: 16px 0;
- // background: #fff;
-
- // h2 {
- // padding: 0 12px;
- // font-size: 1.2rem;
- // font-weight: normal;
- // }
-
- // p {
- // margin: 4px 0;
- // padding: 0 12px;
- // font-size: .9rem;
- // }
- // }
-}
diff --git a/client/src/Component/Auth/Setting/SessionList/SessionList.js b/client/src/Component/Auth/Setting/SessionList/SessionList.js
deleted file mode 100644
index 6ddfbc25..00000000
--- a/client/src/Component/Auth/Setting/SessionList/SessionList.js
+++ /dev/null
@@ -1,157 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-import { confirmAlert } from 'react-confirm-alert'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-import { requestDeleteSession } from '../../../../Actions/Setting'
-
-import './SessionList.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- requestDeleteSession(clientid) {
- dispatch(requestDeleteSession(clientid))
- },
- }
-}
-
-class SessionList extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('セッションの管理')
- this.props.setBackNavigation(true, '/setting')
- }
-
- deleteConfirm(clientid) {
- confirmAlert({
- customUI: ({ onClose }) => {
- return (
-
-
この端末をログアウトしますか?
-
ユーザー情報は端末に残りません。
-
-
-
-
-
- )
- },
- })
- }
-
- lastLogin(time) {
- if (time / (1000 * 60 * 60 * 24 * 365) >= 1) {
- return Math.round(time / (1000 * 60 * 60 * 24 * 365)) + '年前'
- } else if (time / (1000 * 60 * 60 * 24) >= 1) {
- return Math.round(time / (1000 * 60 * 60 * 24)) + '日前'
- } else if (time / (1000 * 60 * 60) >= 1) {
- return Math.round(time / (1000 * 60 * 60)) + '時間前'
- } else if (time / (1000 * 60) >= 1) {
- return Math.round(time / (1000 * 60)) + '分前'
- } else {
- return Math.round(time / 1000) + '秒前'
- }
- }
-
- renderList() {
- if (this.props.user) {
- const clientList = this.props.user.clientList
- .sort((n, m) => (n.lastLogin < m.lastLogin ? 1 : -1))
- .map((each, i) => {
- if (!each.agent) return
- const lastLogin = each.id === lib.getClientid() ? '今' : this.lastLogin(new Date().getTime() - each.lastLogin)
- const selfLabel = each.id === lib.getClientid() ?
現在の端末 : false
- const icon = each.agent.match(/(iPhone|iPad|iPod|Android)/i) ? (
- each.agent.match(/iPad/i) ? (
-
- ) : (
-
- )
- ) : (
-
- )
- const deviceLabel = lib.browser(each.agent)
- const listClass = each.id === lib.getClientid() ? 'self' : 'other'
- const listClick = each.id === lib.getClientid() ? () => {} : () => this.deleteConfirm(each.id)
- return (
-
- {icon}
-
-
- {selfLabel}
-
{lastLogin}
-
-
- )
- })
- return (
-
- )
- }
- }
-
- render() {
- const showList = this.renderList()
- return (
-
-
-
- ホーム
-
- 設定
-
- セッションの管理
-
-
セッションの管理
-
過去にログインした端末の管理ができます
-
-
- {showList}
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(SessionList)
diff --git a/client/src/Component/Auth/Setting/Setting.js b/client/src/Component/Auth/Setting/Setting.js
deleted file mode 100644
index 7ac52d60..00000000
--- a/client/src/Component/Auth/Setting/Setting.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import React, { Component } from 'react'
-import { Route, Switch, Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-import { scrollToTop } from '../../../Actions/Status'
-
-import Back from '../../../Library/Icons/Back'
-import * as lib from '../../../Library/Library'
-
-import Home from './Home/Home'
-import Name from './Name/Name'
-import Email from './Email/Email'
-import EmailValidation from './EmailValidation/EmailValidation'
-import Password from './Password/Password'
-import SessionList from './SessionList/SessionList'
-import Admin from './Admin/Admin'
-import AccountDelete from './AccountDelete/AccountDelete'
-import Score from './Score/Score'
-import Terms from './Terms/Terms'
-import License from './License/License'
-import About from './About/About'
-
-import './Setting.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- scrollToTop() {
- dispatch(scrollToTop())
- },
- }
-}
-
-class Setting extends Component {
- UNSAFE_componentWillReceiveProps() {
- this.props.scrollToTop()
- }
-
- render() {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Setting)
diff --git a/client/src/Component/Auth/Setting/Setting.scss b/client/src/Component/Auth/Setting/Setting.scss
deleted file mode 100644
index 107a04ad..00000000
--- a/client/src/Component/Auth/Setting/Setting.scss
+++ /dev/null
@@ -1,141 +0,0 @@
-.setting {
- width: 100%;
- // max-width: 600px;
- margin: 0 auto;
- // font-size: 13px;
-
- // &.mobile {
- // margin: 12px 0;
- // }
-
- // background: #fff;
-
- // &.pc {
- // .contents-header {
- // h2 {
- // padding: 0 16px;
- // }
-
- // p {
- // padding: 0 16px;
- // }
- // }
- // }
-
- // .contents-header {
- // margin: 0;
- // padding: 16px 0;
- // background: #fff;
-
- // h2 {
- // padding: 0 12px;
- // font-size: 1.2rem;
- // font-weight: normal;
- // }
-
- // p {
- // margin: 4px 0;
- // padding: 0 12px;
- // font-size: .9rem;
- // }
- // }
-}
-
-.setting-text {
- margin: 12px 0 0 0;
- padding: 4px 12px 12px;
-
- &.pc {
- padding: 8px 16px 16px;
- }
-
- label {
- display: block;
- margin: 8px 0 2px;
- font-size: 14px;
- color: #666;
- }
-
- // index.scss で設定
- // input[type="text"],
- // input[type="password"] {
- // -webkit-appearance: none;
- // display: block;
- // width: calc(100% - 20px - 2px);
- // margin: 0;
- // padding: 8px 10px;
- // border: 1px solid #cccccc;
-
- // color: #333;
- // font-size: 17px;
-
- // &:focus {
- // border: solid 1px rgba(182,0,5,1);
-
- // outline: 0;
- // }
- // }
-}
-
-.setting-button {
- .button {
- display: block;
- width: 100%;
- height: 44px;
- line-height: 44px;
- margin: 0 auto;
- padding: 0;
- border: none;
- color: rgba(182, 0, 5, 1);
- font-size: 16px;
- text-align: center;
- cursor: pointer;
- transition: all ease-in-out 0.2s;
-
- & {
- background: #fff;
-
- &:hover,
- &:focus {
- background: #e6e5eb;
- }
-
- &:active {
- background: #e6e5eb;
- }
- }
- @media (prefers-color-scheme: dark) {
- & {
- background: #1c1c1e;
-
- &:hover,
- &:focus {
- background: #2c2c2e;
- }
-
- &:active {
- background: #2c2c2e;
- }
- }
- }
-
- i {
- margin-right: 0.2em;
- }
-
- &.disabled {
- cursor: default;
-
- & {
- color: #888;
- background: #fff;
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: #888;
- background: #1c1c1e;
- }
- }
- }
- }
-}
diff --git a/client/src/Component/Auth/Setting/Terms/Terms.js b/client/src/Component/Auth/Setting/Terms/Terms.js
deleted file mode 100644
index 9a52be04..00000000
--- a/client/src/Component/Auth/Setting/Terms/Terms.js
+++ /dev/null
@@ -1,518 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-
-import Back from '../../../../Library/Icons/Back'
-import * as lib from '../../../../Library/Library'
-
-import { setNavigationTitle, setBackNavigation } from '../../../../Actions/Navigation'
-
-import Logo from '../../../../Asset/hr.svg'
-
-import './Terms.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.status.loading,
- user: state.status.user,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setNavigationTitle(title) {
- dispatch(setNavigationTitle(title))
- },
- setBackNavigation(backNavigation, backNavigationPath) {
- dispatch(setBackNavigation(backNavigation, backNavigationPath))
- },
- }
-}
-
-class About extends Component {
- componentDidMount() {
- this.props.setNavigationTitle('ウィンズ会員規約')
- this.props.setBackNavigation(true, '/setting')
- }
-
- render() {
- return (
-
-
-
- ホーム
-
- 設定
-
- ウィンズ会員規約
-
-
ウィンズ会員規約
-
-
-
-
-
-
-
-
-
- ザ・ウィンド・アンサンブル会員規約
-
-
-
-
-
-
-
目的並びに会の設置
-
-
-
第一条
-
-
-
- 音楽を通じて自己の情操の育成を図るとともに、仲間との友好を深め、長岡市および地域住民の公共的活動に寄与し、各種演奏活動を通じて地域および個人の音楽技術の向上を図ることを目的とし、ザ・ウィンド・アンサンブル(以下ウィンズという)を設置する。
-
-
-
-
-
-
名称
-
-
-
第二条
-
-
-
- ウィンズの正式名称はザ・ウィンド・アンサンブルであるが、対外的な事等でどこの団体かはっきりさせた方が良い場合などは、長岡ザ・ウィンド・アンサンブルと呼ぶ場合もある。また、愛称としてウィンズと呼ぶ場合もある。
-
-
-
-
-
-
組織
-
-
-
第三条
-
-
-
ウィンズは第一条の目的を理解し、入会した者をもって組織する。
-
-
-
-
-
事務局
-
-
-
第四条
-
-
-
ウィンズの事務局は長岡市在住の役員の家に置く。
-
-
-
-
-
役員
-
-
-
第五条
-
-
-
ウィンズに次の役員を置く。
-
-
-
- 代表 |
- 1名 |
-
-
- 代表代行 |
- 1名 |
-
-
- 事務局長 |
- 1名 |
-
-
- ステージマネージャー(演奏会総括) |
- 1名 |
-
-
- 会計 |
- 1名 |
-
-
- トレーナー |
- 1名 |
-
-
-
-
-
-
二
-
-
-
役員はザ・ウィンド・アンサンブル会員(以下会員という)の中から選出して決定する。
-
-
-
-
-
役員会
-
-
-
第五条二
-
-
-
ウィンズの運営を行うため第五条の役員をもって役員会を構成する。
-
-
-
二
-
-
-
-
-
-
役員の任期
-
-
-
第六条
-
-
-
役員の任期は一年とし、毎年総会にて決定する。ただし再任を妨げない。
-
-
-
二
-
-
-
役員に欠員が生じた場合は、十四日以内に前任者の指名もしくは会員の選出で補充する。
-
-
-
-
-
役員の任務
-
-
-
第七条
-
-
-
-
二
-
-
-
代表代行は代表を補佐するとともに、不在の時これを代行する。
-
-
-
三
-
-
-
事務局長は事務局を運営し、通常活動における事務を担当する。
-
-
-
四
-
-
-
ステージマネージャーは演奏会活動における事務を担当する。また、演奏会に関する会議を招集する。
-
-
-
五
-
-
-
会計は運営資金の出納、出納簿の管理を行う。
-
-
-
六
-
-
-
- トレーナーは指揮者を補佐するとともに、不在の時はこれを代行する。また、指揮者が会員で無い場合は音楽全般について統轄する。
-
-
-
-
-
-
指揮者
-
-
-
第八条
-
-
-
- 上記役員とは別に、指揮者を置く。指揮者は音楽全般について統轄する。また、指揮者が必要と認めたとき、副指揮者、トレーナー等を指名することができる。
-
-
-
-
-
-
係
-
-
-
第九条
-
-
-
上記役員の他に必要に応じて次の係を置くことができる。統轄は事務局とする。
-
会場予約、楽譜、受付、お弁当、打ち上げ、ポスター、チケット、パートマネージャー 等
-
-
-
-
-
会員の義務
-
-
-
第十条
-
-
-
会員は常に音楽技術の向上に努めなければならない。
-
-
-
二
-
-
-
練習中および演奏中は規律ある態度のもとに全力を挙げてこれに専念しなければならない。
-
-
-
三
-
-
-
会員は自々の本業に著しく支障をきたす活動を行ったり、これを強要してはいけない。
-
-
-
四
-
-
-
- 会員は特殊な事情の無い限り定期演奏会に出演することとし、その時運営資金として役員会が決定した金額を収めなければならない。
-
-
-
-
-
-
義務違反
-
-
-
第十一条
-
-
-
- 代表は会員が前条の会員の義務に反し、若しくはウィンズの規律を乱しウィンズ会員として好ましくないと認めた時は退団を命ずることができる。
-
-
-
-
-
-
欠席等の届け出
-
-
-
第十二条
-
-
-
- 会員は出演日に欠席しようとするときはあらかじめ代表もしくはパートマネージャーに届け出るものとする。
-
-
-
-
-
-
服装
-
-
-
第十三条
-
-
-
会員は出演するときは定められた服装を着用するものとする。
-
-
-
-
-
運営資金
-
-
-
第十四条
-
-
-
ウィンズの運営資金は会費から徴収する運営資金と演奏活動収益金をもってこれに充てる。
-
-
-
二
-
-
-
運営資金の会計年度は毎年3月1日から翌年2月末までとし、総会にて決算報告をするものとする。
-
-
-
三
-
-
-
会計監査を設置し、会計の実施した出納に関して監査を行うものとする。
-
-
-
-
-
演奏
-
-
-
第十五条
-
-
-
ウィンズは次の場合に演奏する。
-
ただし会員の都合等で演奏不能と代表が認めた場合はこの限りではない。
-
- -
- 一ウィンズの定期演奏会および各種演奏会。
-
- -
- 二公共的諸行事で演奏の依頼を受けたとき。
-
- -
- 三代表が特に必要と認めるとき。
-
-
-
-
-
-
-
演奏中の心得
-
-
-
第十六条
-
-
-
会員は演奏するとき次の事項を守らねばならない。
-
- -
- 一代表の命に従い、規律ある団体行動をすること。
-
- -
- 二容姿を端正にし品位の保持に努めること。
-
-
-
-
-
-
-
会議
-
-
-
第十七条
-
-
-
- 会議は総会および特別会とし、総会は年一回の定例会の他必要に応じて開催し、特別会は必要の都度代表が指名したものを招集し開催する。
-
-
-
-
二
-
-
-
総会は在籍会員の過半数の出席(委任状含む)がなければ開催することができない。
-
-
-
三
-
-
-
会議の議長は、会議ごとに、出席した会員の中から選任する。
-
-
-
-
-
入会手続き
-
-
-
第十八条
-
-
-
ウィンズの入会を希望するものは代表にその旨届出、受理されたのち会員となる。
-
入会希望届の管理、届出の受理および処理について事務局長がこれを担当する。
-
-
-
二
-
-
-
入会したものはすみやかにザ・ウィンド・アンサンブル会員名簿に登載される。
-
-
-
-
-
入会資格
-
-
-
第十九条
-
-
-
- ウィンズの入会資格は長岡市内に居住または、関係のある者で、満十八歳以上(高校生を除く)の者でなければならない。ただし、ウィンズの編成等により特に代表が必要と認めた場合はこの限りではない。
-
-
-
-
-
-
簿冊
-
-
-
第二十条
-
-
-
ウィンズに次の簿冊を備える。
-
- -
- 一ザ・ウィンド・アンサンブル会員名簿
-
- -
- 二備品台帳
-
- -
- 三楽譜台帳
-
- -
- 四出納簿
-
-
-
-
-
-
-
規約の改正
-
-
-
第二十一条
-
-
-
この規約を改正しようとするときは、総会出席会員の過半数(委任状含む)の賛成を得なければならない。
-
-
-
-
付則
-
- - この規約は、昭和62年11月1日より施行する。
- - この規約は、平成23年3月21日より改制する。
- - この規約は、平成30年3月17日より改制する。
- - この規約は、平成31年3月9日より改制する。
- - この規約は、令和元年12月9日より改制する。
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(About)
diff --git a/client/src/Component/Auth/Setting/Terms/Terms.scss b/client/src/Component/Auth/Setting/Terms/Terms.scss
deleted file mode 100644
index f6d42818..00000000
--- a/client/src/Component/Auth/Setting/Terms/Terms.scss
+++ /dev/null
@@ -1,208 +0,0 @@
-.terms {
- &.pc {
- .title {
- // padding: 13px 16px 14px;
- padding: 16px 16px 0;
- font-size: 1rem;
- }
- }
-
- .title {
- padding: 12px 12px 0;
-
- display: flex;
- align-items: center;
-
- & > div:first-child {
- display: flex;
- justify-content: center;
- align-items: center;
- border: 0.55px solid #eee;
- border-radius: 20px;
- background: #fff;
-
- svg {
- width: 60px;
- height: 60px;
- padding: 4px;
- fill: #b60005;
- }
- }
-
- & > div:last-child {
- margin-left: 16px;
- border: 0;
- flex: 2;
-
- display: flex;
- justify-content: center;
- flex-direction: column;
-
- & .title span:first-child {
- font-size: 16px;
- }
- }
- }
-
- .text {
- .provision {
- margin: 16px 0;
-
- display: grid;
- grid-template-columns: 64px 1fr;
- grid-template-columns: max-content 1fr;
-
- .sub-title {
- grid-row: 1/2;
- grid-column: 1/3;
- }
-
- & > div {
- margin: 2px 0;
- }
-
- .list-number {
- grid-row: 2/3;
- grid-column: 1/2;
- text-align: left;
-
- & + div {
- grid-row: 2/3;
- grid-column: 2/3;
- }
- }
-
- .list-number-second {
- grid-row: 3/4;
- grid-column: 1/2;
- text-align: right;
-
- & + div {
- grid-row: 3/4;
- grid-column: 2/3;
- }
- }
-
- .list-number-third {
- grid-row: 4/5;
- grid-column: 1/2;
- text-align: right;
-
- & + div {
- grid-row: 4/5;
- grid-column: 2/3;
- }
- }
-
- .list-number-fourth {
- grid-row: 5/6;
- grid-column: 1/2;
- text-align: right;
-
- & + div {
- grid-row: 5/6;
- grid-column: 2/3;
- }
- }
-
- .list-number-fifth {
- grid-row: 6/7;
- grid-column: 1/2;
- text-align: right;
-
- & + div {
- grid-row: 6/7;
- grid-column: 2/3;
- }
- }
-
- .list-number-sixth {
- grid-row: 7/8;
- grid-column: 1/2;
- text-align: right;
-
- & + div {
- grid-row: 7/8;
- grid-column: 2/3;
- }
- }
- }
-
- .supplementary-provision {
- h3 {
- font-weight: bold;
- color: #333;
-
- &:before {
- content: none;
- }
-
- &:after {
- content: none;
- }
- }
- }
-
- h3 {
- margin: 0;
- font-weight: normal;
- font-size: 14px;
- color: #666;
-
- &:before {
- content: '(';
- }
-
- &:after {
- content: ')';
- }
- }
-
- h2 {
- margin: 0 0.5em 0 0;
- font-weight: bold;
- font-size: 14px;
- }
-
- p {
- margin: 0;
- font-size: 14px;
- }
-
- table {
- font-size: 14px;
- text-align: left;
-
- th {
- padding: 0 0.5em 0 0;
- font-weight: normal;
- }
-
- td {
- padding: 0;
- }
- }
-
- ol {
- margin: 0;
- padding: 0;
- // list-style-type: cjk-ideographic;
- list-style-type: none;
- font-size: 14px;
-
- li {
- span {
- margin-right: 0.5em;
-
- &:before {
- content: '(';
- }
-
- &:after {
- content: ')';
- }
- }
- }
- }
- }
-}
diff --git a/client/src/Component/Auth/Tutorial/Tutorial.js b/client/src/Component/Auth/Tutorial/Tutorial.js
deleted file mode 100644
index 1e63fb07..00000000
--- a/client/src/Component/Auth/Tutorial/Tutorial.js
+++ /dev/null
@@ -1,218 +0,0 @@
-import React, { Component } from 'react'
-
-import { connect } from 'react-redux'
-
-import Swiper from 'react-id-swiper'
-
-import { setDisplayTutorial } from '../../../Actions/Tutorial'
-
-import * as lib from '../../../Library/Library'
-
-import WindsLogo from '../../../Asset/logo.svg'
-import WindsIcon from '../../../Asset/hr.svg'
-
-import './Tutorial.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
-
- userAgent: state.tutorial.userAgent,
- standalone: state.tutorial.standalone,
-
- displayTutorial: state.tutorial.displayTutorial,
- tutorialMode: state.tutorial.tutorialMode,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setDisplayTutorial(displayTutorial, tutorialMode) {
- dispatch(setDisplayTutorial(displayTutorial, tutorialMode))
- },
- }
-}
-
-class Tutorial extends Component {
- renderiosGuide() {
- return (
-
-
-
全画面で表示するには
-
- Safariメニューのから
- を押してホーム画面に追加してください
-
-
-
- )
- }
-
- renderFirstTutorial() {
- const standaloneTutorial = [
- {
- title: 'ようこそ',
- subtitle: 'ウィンズアプリへ',
- contents: ['このアプリは会員専用ページのコンテンツをまとめたものです'],
- img: 'icon',
- },
- { title: 'はじめましょう', contents: ['このページは設定からいつでも表示できます'], img: 'icon', button: true },
- ]
- const iosTutorial = [
- {
- title: 'ようこそ',
- subtitle: 'ウィンズアプリへ',
- contents: ['このアプリは会員専用ページのコンテンツをまとめたものです'],
- img: 'icon',
- },
- {
- title: 'まずはじめに',
- contents: ['全画面表示でのご利用を推奨しています', '下のメニューからホーム画面に追加してください'],
- iosGuide: true,
- },
- { title: 'はじめましょう', contents: ['このページは設定からいつでも表示できます'], img: 'icon', button: true },
- ]
- const androidTutorial = [
- {
- title: 'ようこそ',
- subtitle: 'ウィンズアプリへ',
- contents: ['このアプリは会員専用ページのコンテンツをまとめたものです'],
- img: 'icon',
- },
- { title: 'まずはじめに', contents: ['メニューからホーム画面に追加してください'], img: 'icon' },
- { title: 'はじめましょう', contents: ['このページは設定からいつでも表示できます'], img: 'icon', button: true },
- ]
- const pcTutorial = [
- {
- title: 'ようこそ',
- subtitle: 'ウィンズアプリへ',
- contents: ['このアプリは会員専用ページのコンテンツをまとめたものです'],
- img: 'icon',
- },
- { title: 'はじめましょう', contents: ['このページは設定からいつでも表示できます'], img: 'icon', button: true },
- ]
- const tutorialContents =
- this.props.userAgent === 'other'
- ? pcTutorial
- : this.props.standalone
- ? standaloneTutorial
- : this.props.userAgent === 'Android'
- ? androidTutorial
- : iosTutorial
- const tutorialList = tutorialContents.map((each, i) => {
- const img =
- each.img === 'icon' ? (
-
-
-
- ) : (
- false
- )
- const subtitle = each.subtitle ?
{each.subtitle}
: false
- const contents = each.contents ? each.contents.map((text, i) =>
{text}
) : false
- const button = each.button ? (
-
this.props.setDisplayTutorial(false, undefined)}>
- スタート
-
- ) : (
- false
- )
- const iosGuide = each.iosGuide ? this.renderiosGuide() : false
- return (
-
-
- {img}
-
-
{each.title}
- {subtitle}
-
- {contents}
- {button}
- {iosGuide}
-
-
- )
- })
- const params = {
- // spaceBetween: 45,
- grabCursor: true,
- navigation: {
- nextEl: '.swiper-custom-button-next',
- prevEl: '.swiper-custom-button-prev',
- },
- renderPrevButton: () => (
-
-
-
- ),
- renderNextButton: () => (
-
-
-
- ),
-
- // カーソルキーでの操作
- keyboard: true,
- // スライドごとにwrapperのサイズを変更
- watchSlidesProgress: true,
- // 最初のスライドを指定
- initialSlide: 0,
- // 次のスライドがどれくらい見えていたら次へ行くか
- longSwipesRatio: 0.4,
- preloadImages: false,
- lazy: true,
-
- pagination: {
- el: '.swiper-pagination',
- clickable: true,
- },
- }
- return (
-
- {tutorialList}
-
- )
- }
-
- renderTutorialSlide() {
- if (!this.props.tutorialMode) return
- if (this.props.tutorialMode === 'first') return this.renderFirstTutorial()
- }
-
- render() {
- if (!this.props.displayTutorial) return
-
- const showTutorialSlide = this.renderTutorialSlide()
- const displayTutorialClass = this.props.displayTutorial ? ' open' : ''
-
- return (
-
-
-
- {/*
this.props.setDisplayEditScoreModal(false, undefined, undefined)}>キャンセル
*/}
-
-
-
-
this.props.setDisplayTutorial(false, undefined)}
- >
- スキップ
-
-
-
-
-
-
-
- )
- }
-}
-
-const CustomButton = ({ className, children, pc }) => {
- return
{children}
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Tutorial)
diff --git a/client/src/Component/Base/Base.js b/client/src/Component/Base/Base.js
deleted file mode 100644
index b4dc1fab..00000000
--- a/client/src/Component/Base/Base.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import React, { Component } from 'react'
-import { Route, Switch } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-import { loginAuth, windowWidthChange } from '../../Actions/Status'
-
-import Login from './Login/Login'
-import Reg from './Reg/Reg'
-import EmailValidation from './EmailValidation/EmailValidation'
-
-import Header from './Component/Header/Header'
-
-import Loading from '../Loading/Loading'
-
-import './Base.css'
-
-function mapStateToProps(state) {
- return {
- login: state.status.login,
- loading: state.status.loading,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- loginAuth(location) {
- dispatch(loginAuth(location))
- },
- windowWidthChange() {
- dispatch(windowWidthChange())
- },
- }
-}
-
-class Base extends Component {
- UNSAFE_componentWillMount() {
- this.props.loginAuth(false)
- }
-
- componentDidMount() {
- this.props.windowWidthChange()
- window.addEventListener('resize', () => {
- this.props.windowWidthChange()
- })
- }
-
- componentWillUnmount() {
- window.removeEventListener('resize', () => {})
- }
-
- render() {
- const { loading } = this.props
- // if (login) return
- if (loading) return
- return (
-
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Base)
diff --git a/client/src/Component/Base/Base.scss b/client/src/Component/Base/Base.scss
deleted file mode 100644
index 0efe4b75..00000000
--- a/client/src/Component/Base/Base.scss
+++ /dev/null
@@ -1,266 +0,0 @@
-.base {
- // display: flex;
-
- .navigation-header {
- .header {
- height: 60px;
-
- &.pc {
- height: 90px;
- }
- }
- }
-
- .contents {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- margin: 60.5px 0 0 0;
- overflow-x: hidden;
- overflow-y: scroll;
- -webkit-overflow-scrolling: touch;
- will-change: scroll-position;
- contain: size style layout;
- z-index: 1;
-
- display: flex;
- justify-content: flex-start;
- align-items: center;
- flex-direction: column;
-
- // background: rgba(220,220,220,.2);
- // background: #efeff4;
- // background: rgb(230, 236, 240);
-
- margin-top: calc(constant(safe-area-inset-top) + 60.5px);
- margin-top: calc(env(safe-area-inset-top) + 60.5px);
-
- & {
- background: #efeff4;
- }
- @media (prefers-color-scheme: dark) {
- & {
- background: #000;
- }
- }
-
- &.pc {
- margin: 91px 0 0 0;
- }
-
- .form-base {
- width: 100%;
- max-width: 450px;
- margin: 12px 0 0;
- padding: 12px;
-
- & {
- background: #fff;
- color: #333;
- }
- @media (prefers-color-scheme: dark) {
- & {
- background: #1c1c1e;
- color: #fff;
- }
- }
-
- &.pc {
- margin: 36px 0 0;
- padding: 36px;
- }
-
- .form {
- margin: 12px 24px;
-
- &.pc {
- margin: 0;
- }
- }
-
- h2 {
- margin: 0 0 12px 0;
- font-size: 20px;
- font-weight: normal;
-
- &.pc {
- margin: 0 0 36px 0;
- }
- }
-
- .text {
- margin: 24px 0;
- font-size: 14px;
-
- p {
- margin: 0;
- padding: 0;
-
- .red {
- margin: 0 2px;
- padding: 0 2px;
- border-radius: 2px;
- background: rgba(255, 59, 48, 0.8);
- color: #fff;
- // color: rgba(255,59,48,1);
- }
- }
- }
-
- label {
- display: block;
- margin: 12px 0 2px;
- font-size: 14px;
- }
-
- input {
- display: block;
- width: calc(100% - 30px - 2px);
- margin: 0 0 12px 0;
- padding: 10px 15px;
- border-radius: 4px;
- font-size: 16px;
- }
-
- input:focus,
- input[type='password']:focus {
- border: solid 1px rgba(182, 0, 5, 0.6);
- outline: 0;
- }
-
- .error {
- margin: 36px 0;
- padding: 12px;
- border-radius: 4px;
- font-size: 14px;
- color: #f0506e;
-
- & {
- color: #f0506e;
- background: #fef4f6;
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: hsl(349, 84%, 43%);
- background: #333;
- }
- }
- }
-
- .links {
- margin: 36px 0 12px;
- display: flex;
- align-items: center;
-
- button {
- flex: 1;
- display: block;
- width: 100%;
- height: 44px;
- padding: 6px 18px;
- border: none;
- border-radius: 4px;
- background: rgba(182, 0, 5, 0.6);
- color: #fff;
- font-size: 14px;
- cursor: pointer;
- outline: none;
- transition: all ease-in-out 0.2s;
-
- &:focus {
- // box-shadow: 0 0 0 0.2rem rgba(182,0,5,.25);
- }
-
- &:hover,
- &:active,
- &:focus {
- background: rgba(182, 0, 5, 0.8);
- transition: all ease-in-out 0.1s;
- color: #fff;
- }
-
- &:active,
- &:focus {
- box-shadow: 0 0 0 0.2rem rgba(182, 0, 5, 0.25);
- }
-
- &:disabled {
- cursor: default;
-
- & {
- color: #888;
- background: #f8f8f8;
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: #888;
- background: #333;
- }
- }
- }
- }
-
- .link {
- flex: 2;
- // text-align: center;
-
- a {
- text-decoration: none;
- font-size: 14px;
-
- &:hover {
- text-decoration: underline;
- }
-
- & {
- color: #666;
- &:hover {
- color: #333;
- }
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: #aaa;
- &:hover {
- color: #ccc;
- }
- }
- }
- }
- }
- }
- }
- }
-
- footer {
- width: 100%;
- margin: 48px 0;
- text-align: center;
- color: #888;
-
- a {
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- }
-
- & {
- color: #888;
- &:hover {
- color: #333;
- }
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: #aaa;
- &:hover {
- color: #ccc;
- }
- }
- }
- }
- }
-}
diff --git a/client/src/Component/Base/Component/Footer/Footer.js b/client/src/Component/Base/Component/Footer/Footer.js
deleted file mode 100644
index a633c4aa..00000000
--- a/client/src/Component/Base/Component/Footer/Footer.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import React, { Component } from 'react'
-
-import { connect } from 'react-redux'
-
-import './Footer.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- }
-}
-
-function mapDispatchToProps() {
- return {}
-}
-
-class Footer extends Component {
- render() {
- return (
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Footer)
diff --git a/client/src/Component/Base/Component/Footer/Footer.scss b/client/src/Component/Base/Component/Footer/Footer.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Base/Component/Header/Header.js b/client/src/Component/Base/Component/Header/Header.js
deleted file mode 100644
index e0ed6f4a..00000000
--- a/client/src/Component/Base/Component/Header/Header.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import React, { Component } from 'react'
-
-import { connect } from 'react-redux'
-
-import * as lib from '../../../../Library/Library'
-
-import WindsLogo from '../../../../Asset/logo.svg'
-
-import './Header.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- }
-}
-
-function mapDispatchToProps() {
- return {}
-}
-
-class Header extends Component {
- render() {
- const { pc } = this.props
- return (
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Header)
diff --git a/client/src/Component/Base/Component/Header/Header.scss b/client/src/Component/Base/Component/Header/Header.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Base/EmailValidation/EmailValidation.js b/client/src/Component/Base/EmailValidation/EmailValidation.js
deleted file mode 100644
index 7c467648..00000000
--- a/client/src/Component/Base/EmailValidation/EmailValidation.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import React, { Component } from 'react'
-
-import { connect } from 'react-redux'
-import { setKey, checkAuth, requestLogin, changeWindsid, changePassword } from '../../../Actions/EmailValidation'
-
-import Footer from '../Component/Footer/Footer'
-
-import * as lib from '../../../Library/Library'
-
-import './EmailValidation.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- loading: state.emailValidation.loading,
- key: state.emailValidation.key,
- windsid: state.emailValidation.windsid,
- password: state.emailValidation.password,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- setKey(key) {
- dispatch(setKey(key))
- },
- checkAuth(key) {
- dispatch(checkAuth(key))
- },
- requestLogin() {
- dispatch(requestLogin())
- },
- changeWindsid(windsid) {
- dispatch(changeWindsid(windsid))
- },
- changePassword(password) {
- dispatch(changePassword(password))
- },
- }
-}
-
-class EmailValidation extends Component {
- constructor(props) {
- super(props)
- const { params } = this.props.match
- const key = params.key ? params.key : ''
- this.props.setKey(key)
- this.props.checkAuth(key)
- this.inputRef = React.createRef()
- }
-
- componentDidMount() {
- if (this.inputRef) this.inputRef.focus()
- }
-
- keyPress(e) {
- if (e.which === 13) this.props.requestLogin()
- }
-
- render() {
- // if (this.props.loading) return
読み込み中
- const { windsid, password, errorMessage, loading } = this.props
- const { changeWindsid, changePassword } = this.props
- const buttonLabel = loading ? '読み込み中' : '送信'
- const disabled = windsid && password ? (loading ? true : false) : true
- const showError = errorMessage ?
{errorMessage}
: false
- return (
-
-
-
-
ログイン
-
-
changeWindsid(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- ref={(i) => (this.inputRef = i)}
- />
-
-
changePassword(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- />
- {showError}
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(EmailValidation)
diff --git a/client/src/Component/Base/EmailValidation/EmailValidation.scss b/client/src/Component/Base/EmailValidation/EmailValidation.scss
deleted file mode 100644
index e69de29b..00000000
diff --git a/client/src/Component/Base/Login/Login.js b/client/src/Component/Base/Login/Login.js
deleted file mode 100644
index 4d9655ce..00000000
--- a/client/src/Component/Base/Login/Login.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-import { changeWindsid, changePassword, login, setErrorMessage } from '../../../Actions/Login'
-
-import Footer from '../Component/Footer/Footer'
-
-import * as lib from '../../../Library/Library'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- windsid: state.login.windsid,
- password: state.login.password,
- errorMessage: state.login.errorMessage,
- loading: state.login.loading,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- changeWindsid(windsid) {
- dispatch(changeWindsid(windsid))
- },
- changePassword(password) {
- dispatch(changePassword(password))
- },
- login() {
- dispatch(login())
- },
- setErrorMessage(string) {
- dispatch(setErrorMessage(string))
- },
- }
-}
-
-class Login extends Component {
- constructor(props) {
- super(props)
- this.inputRef = React.createRef()
- }
-
- componentDidMount() {
- if (this.inputRef) this.inputRef.focus()
- }
-
- componentWillUnmount() {
- this.props.changeWindsid('')
- this.props.changePassword('')
- this.props.setErrorMessage(false)
- }
-
- keyPress(e) {
- if (e.which === 13) this.props.login()
- }
-
- render() {
- const { windsid, password, errorMessage, loading } = this.props
- const { changeWindsid, changePassword } = this.props
- const buttonLabel = loading ? '読み込み中' : '送信'
- const disabled = windsid && password ? (loading ? true : false) : true
- const showError = errorMessage ?
{errorMessage}
: false
- return (
-
-
-
-
ログイン
-
-
changeWindsid(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- ref={(i) => (this.inputRef = i)}
- />
-
-
changePassword(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- />
- {showError}
-
-
-
- 新規登録はこちら
-
-
-
-
-
-
-
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Login)
diff --git a/client/src/Component/Base/Reg/Reg.js b/client/src/Component/Base/Reg/Reg.js
deleted file mode 100644
index 00e2b408..00000000
--- a/client/src/Component/Base/Reg/Reg.js
+++ /dev/null
@@ -1,187 +0,0 @@
-import React, { Component } from 'react'
-import { Link } from 'react-router-dom'
-
-import { connect } from 'react-redux'
-import {
- updateMode,
- resetMode,
- changeWindsid,
- changePassword,
- changeKey,
- register,
- setErrorMessage,
-} from '../../../Actions/Reg'
-
-import Footer from '../Component/Footer/Footer'
-
-import * as lib from '../../../Library/Library'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- mode: state.reg.mode,
- windsid: state.reg.windsid,
- password: state.reg.password,
- approvalKey: state.reg.approvalKey,
- errorMessage: state.reg.errorMessage,
- loading: state.reg.loading,
- }
-}
-
-function mapDispatchToProps(dispatch) {
- return {
- updateMode() {
- dispatch(updateMode())
- },
- resetMode() {
- dispatch(resetMode())
- },
- changeWindsid(windsid) {
- dispatch(changeWindsid(windsid))
- },
- changePassword(password) {
- dispatch(changePassword(password))
- },
- changeKey(approvalKey) {
- dispatch(changeKey(approvalKey))
- },
- register() {
- dispatch(register())
- },
- setErrorMessage(string) {
- dispatch(setErrorMessage(string))
- },
- }
-}
-
-class Reg extends Component {
- constructor(props) {
- super(props)
- this.inputKeyRef = React.createRef()
- this.inputWindsidRef = React.createRef()
- // ちょっとトリッキー(mode: true のときのfocus()用)
- this.inputWindsidRefFlag = true
- }
-
- componentDidMount() {
- if (this.inputKeyRef) {
- this.inputKeyRef.focus()
- }
- }
-
- componentDidUpdate() {
- if (this.inputWindsidRef && this.inputWindsidRefFlag && this.props.mode) {
- this.inputWindsidRef.focus()
- this.inputWindsidRefFlag = false
- }
- }
-
- componentWillUnmount() {
- this.props.changeWindsid('')
- this.props.changePassword('')
- this.props.changeKey('')
- this.props.resetMode()
- this.props.setErrorMessage(false)
- }
-
- keyPress(e) {
- if (e.which === 13) {
- this.props.mode ? this.props.register() : this.props.updateMode()
- }
- }
-
- render() {
- const { mode, windsid, password, approvalKey, errorMessage, loading } = this.props
- const { updateMode, changeWindsid, changePassword, changeKey, register } = this.props
- if (!mode) {
- const buttonLabel = loading ? '読み込み中' : '次へ'
- const disabled = approvalKey ? (loading ? true : false) : true
- const showError = errorMessage ?
{errorMessage}
: false
- return (
-
-
-
-
新規登録
- {/*
-
認証サーバアップデートに伴い、
-
2019年6月4日に全ての登録情報を削除しました
-
既に登録していた方はお手数ですが改めて登録をお願いします
-
*/}
-
-
-
changeKey(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- ref={(i) => (this.inputKeyRef = i)}
- />
- {showError}
-
-
-
- ログインはこちら
-
-
-
-
-
-
-
-
- )
- } else {
- const buttonLabel = loading ? '読み込み中...' : '送信'
- const disabled = windsid && password ? (loading ? true : false) : true
- const showError = errorMessage ?
{errorMessage}
: false
- return (
-
-
-
-
新規登録
-
ユーザー名とパスワードは自由に指定できます
-
-
changeWindsid(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- ref={(i) => (this.inputWindsidRef = i)}
- />
-
-
changePassword(e.target.value)}
- onKeyPress={(e) => this.keyPress(e)}
- />
- {/*
*/}
- {/*
changeKey(e.target.value)} onKeyPress={(e) => this.keyPress(e)} /> */}
- {showError}
-
-
-
- ログインはこちら
-
-
-
-
-
-
-
-
- )
- }
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Reg)
diff --git a/client/src/Component/Loading/Loading.js b/client/src/Component/Loading/Loading.js
deleted file mode 100644
index ab6c2e7b..00000000
--- a/client/src/Component/Loading/Loading.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import React, { Component } from 'react'
-
-import { connect } from 'react-redux'
-
-import Header from '../Base/Component/Header/Header'
-
-// import WindsLogo from '../../../Asset/logo.svg'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- }
-}
-
-function mapDispatchToProps() {
- return {}
-}
-
-class Loading extends Component {
- render() {
- const { pc } = this.props
- return (
-
- )
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Loading)
diff --git a/client/src/Component/Toast/Toast.js b/client/src/Component/Toast/Toast.js
deleted file mode 100644
index 68aa928e..00000000
--- a/client/src/Component/Toast/Toast.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import React, { Component } from 'react'
-
-import { connect } from 'react-redux'
-
-import './Toast.css'
-
-function mapStateToProps(state) {
- return {
- pc: state.status.pc,
- string: state.toast.string,
- status: state.toast.status,
- hide: state.toast.hide,
- end: state.toast.end,
- }
-}
-
-function mapDispatchToProps() {
- return {}
-}
-
-class Toast extends Component {
- render() {
- const { string, status, hide } = this.props
- if (status) {
- var className = 'toast'
- if (hide) {
- className += ' hide'
- }
- return (
-
- )
- } else {
- return
- }
- }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(Toast)
diff --git a/client/src/Component/Toast/Toast.scss b/client/src/Component/Toast/Toast.scss
deleted file mode 100644
index 104daf4a..00000000
--- a/client/src/Component/Toast/Toast.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-.toast {
- position: absolute;
- top: -70px;
- left: 10px;
- right: 10px;
- max-width: 600px;
- margin: auto;
- border-radius: 10px;
- background: rgba(0, 0, 0, 0.9);
- color: white;
- transform: translate3d(0, 80px, 0);
- transition-delay: initial;
- transition-property: none;
- transition: transform 0.2s ease-in-out;
- z-index: 99;
-
- margin-top: constant(safe-area-inset-top);
- margin-top: env(safe-area-inset-top);
-
- & > div {
- padding: 16px 16px;
- font-size: 13px;
-
- b {
- font-weight: 600;
- }
- }
-
- &.hide {
- transform: translate3d(0, -80px, 0);
- transition-delay: initial;
- transition-property: none;
- transition: transform 0.6s ease-in-out;
- }
-}
diff --git a/client/src/Library/Icons/Back.js b/client/src/Library/Icons/Back.js
deleted file mode 100644
index 3e3e722b..00000000
--- a/client/src/Library/Icons/Back.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-import './Back.css'
-
-const Back = () => (
-
-)
-
-export default Back
diff --git a/client/src/Library/Icons/Back.scss b/client/src/Library/Icons/Back.scss
deleted file mode 100644
index 033f89bc..00000000
--- a/client/src/Library/Icons/Back.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-svg.back {
- display: block;
- width: 20px;
- height: 20px;
- margin-right: 10px;
- fill: #c8c7cc;
-}
diff --git a/client/src/Library/Icons/Forward.js b/client/src/Library/Icons/Forward.js
deleted file mode 100644
index 56dd6a5d..00000000
--- a/client/src/Library/Icons/Forward.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-import './Forward.css'
-
-const Forward = () => (
-
-)
-
-export default Forward
diff --git a/client/src/Library/Icons/Forward.scss b/client/src/Library/Icons/Forward.scss
deleted file mode 100644
index aba20580..00000000
--- a/client/src/Library/Icons/Forward.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-svg.forward {
- display: block;
- width: 20px;
- height: 20px;
- margin-right: 10px;
- fill: #c8c7cc;
-}
diff --git a/client/src/Library/Library.js b/client/src/Library/Library.js
deleted file mode 100644
index 2c478e70..00000000
--- a/client/src/Library/Library.js
+++ /dev/null
@@ -1,113 +0,0 @@
-import uuidv1 from 'uuid/v1'
-
-// constants
-export const appName = 'member'
-export const version = '0.6.9'
-// mode を true にするとローカルのAPIを使う
-const surveyProductionMode = true
-const authProductionMode = true
-const appProductionMode = true
-const scoreProductionMode = true
-
-export function getClientid() {
- if (window.localStorage.clientid) return window.localStorage.clientid
- const clientid = uuidv1().split('-').join('')
- window.localStorage.setItem('clientid', clientid)
- return clientid
-}
-
-export function removeLocalStorage() {
- const clientid = getClientid()
- window.localStorage.clear()
- window.localStorage.setItem('clientid', clientid)
-}
-
-export function getSurveyPath() {
- return surveyProductionMode ? 'https://survey.winds-n.com' : 'http://localhost:3002'
-}
-
-export function getAuthPath() {
- return authProductionMode ? 'https://auth.winds-n.com' : 'http://localhost:3003'
-}
-
-export function getAppPath() {
- return appProductionMode ? 'https://app.winds-n.com' : 'http://localhost:3007'
-}
-
-export function getScorePath() {
- return scoreProductionMode ? 'https://score.winds-n.com' : 'http://localhost:3000'
-}
-
-export function getApiPath() {
- return 'https://api.winds-n.com'
-}
-
-export function getSession() {
- return {
- userid: window.localStorage.windsid,
- clientid: getClientid(),
- clientToken: window.localStorage.token,
- useragent: window.navigator.userAgent,
- version: version + '-web',
- }
-}
-
-export function getToken(user) {
- if (!('clientList' in user)) return false
- const client = user.clientList.filter((e) => {
- return e.id === getClientid()
- })
- if (client.length === 0) return false
- return client[0].token
-}
-
-export function browser(userAgent) {
- const agent = userAgent.toLowerCase()
- if (agent.indexOf('iphone') > -1) {
- return 'iPhone'
- } else if (agent.indexOf('ipad') > -1) {
- return 'iPad'
- } else if (agent.indexOf('android') > -1 && agent.indexOf('mobile') > -1) {
- return 'Android'
- } else if (agent.indexOf('android') > -1 && agent.indexOf('mobile') == -1) {
- return 'Android' // Tablet
- } else if (agent.indexOf('msie') > -1) {
- return 'Internet Explorer'
- } else if (agent.indexOf('trident/7') > -1) {
- return 'Internet Explorer 11'
- } else if (agent.indexOf('edge') > -1) {
- return 'Edge'
- } else if (agent.indexOf('chrome') > -1) {
- return 'Chrome'
- } else if (agent.indexOf('safari') > -1) {
- return 'Safari'
- } else if (agent.indexOf('opera') > -1) {
- return 'Opera'
- } else if (agent.indexOf('firefox') > -1) {
- return 'Firefox'
- }
- return 'Unknown'
-}
-
-export function playTime(t) {
- var hms = ''
- var h = (t / 3600) | 0
- var m = ((t % 3600) / 60) | 0
- var s = t % 60
- const z2 = (v) => {
- const s = '00' + v
- return s.substr(s.length - 2, 2)
- }
- if (h != 0) {
- hms = h + ':' + z2(m) + ':' + z2(s)
- } else if (m != 0) {
- hms = z2(m) + ':' + z2(s)
- } else {
- hms = '00:' + z2(s)
- }
- return hms
-}
-
-export function pcClass(status) {
- return status ? ' pc' : ' mobile'
-}
diff --git a/client/src/Library/Request.js b/client/src/Library/Request.js
deleted file mode 100644
index bda8356c..00000000
--- a/client/src/Library/Request.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import request from 'superagent'
-
-export function post(url, send, callback) {
- request
- .post(url)
- .type('form')
- .send(send)
- .end((error, response) => {
- return callback(error, response)
- })
-}
-
-export function countUp(send) {
- request
- .post('https://app.winds-n.com/api/count')
- .type('form')
- .send(send)
- .end(() => {
- return
- })
-}
-
-export function sendSeek(send) {
- request
- .post('https://app.winds-n.com/api/seek')
- .type('form')
- .send(send)
- .end(() => {
- return
- })
-}
-
-export function sendPath(send) {
- request
- .post('https://app.winds-n.com/api/path')
- .type('form')
- .send(send)
- .end(() => {
- return
- })
-}
diff --git a/client/src/Reducers/Archive.js b/client/src/Reducers/Archive.js
deleted file mode 100644
index 32878888..00000000
--- a/client/src/Reducers/Archive.js
+++ /dev/null
@@ -1,204 +0,0 @@
-const initialState = {
- loading: false,
- concertList: undefined,
- // concertListLoad: false,
- displayMain:
- 'displayMain' in window.localStorage ? (window.localStorage.displayMain === 'true' ? true : false) : true,
- displayMini:
- 'displayMini' in window.localStorage ? (window.localStorage.displayMini === 'true' ? true : false) : true,
- displayOther:
- 'displayOther' in window.localStorage ? (window.localStorage.displayOther === 'true' ? true : false) : true,
- concertid: undefined,
-
- // Search
- loadingSearch: false,
- searchRef: undefined,
- searchQuery: '',
- searchResult: undefined,
-
- // Photo
- loadingPhoto: false,
- photoConcertid: undefined,
- photoList: undefined,
- photoBaseSrcThumbnail: undefined,
- photoBaseSrcOriginal: undefined,
- photoUrl: undefined,
- displayPhotoSlideModal: false,
- photoNumber: undefined,
-
- // Video
- loadingVideo: false,
- videoConcertid: undefined,
- videoList: undefined,
- videoBaseSrc: undefined,
- videoUrl: undefined,
- videoPoster: undefined,
-
- // プレイヤー操作
- videoRef: undefined,
- displayVideoController: false,
- // オーディオプレイヤーが開いていたか記録
- audioPlayerDisplay: undefined,
- loadingVideoSource: false,
- videoLoadPercent: undefined,
-
- videoCurrent: undefined,
- videoCurrentTime: undefined,
- videoDuration: undefined,
- videoDurationTime: undefined,
- videoPlayPercent: undefined,
-
- videoPlayStatus: undefined,
- videoPlayTrack: undefined,
-
- countFlag: true,
-}
-
-const prefix = 'ARCHIVE_'
-
-export default function archiveReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'SET_CONCERT_LIST':
- return {
- ...state,
- concertList: action.payload.concertList,
- }
- // case prefix + 'SET_CONCERT_LIST_LOAD':
- // return {
- // ...state,
- // concertListLoad: action.payload.concertListLoad
- // }
- case prefix + 'SET_DISPLAY_MAIN':
- return {
- ...state,
- displayMain: action.payload.displayMain,
- }
- case prefix + 'SET_DISPLAY_MINI':
- return {
- ...state,
- displayMini: action.payload.displayMini,
- }
- case prefix + 'SET_DISPLAY_OTHER':
- return {
- ...state,
- displayOther: action.payload.displayOther,
- }
- case prefix + 'SET_OVERVIEW_ID':
- return {
- ...state,
- concertid: action.payload.concertid,
- }
-
- // Search
- case prefix + 'LOADING_SEARCH':
- return {
- ...state,
- loadingSearch: action.payload.loadingSearch,
- }
- case prefix + 'SET_SEARCH_REF':
- return {
- ...state,
- searchRef: action.payload.searchRef,
- }
- case prefix + 'SET_SEARCH_QUERY':
- return {
- ...state,
- searchQuery: action.payload.searchQuery,
- }
- case prefix + 'SET_SEARCH_RESULT':
- return {
- ...state,
- searchResult: action.payload.searchResult,
- }
-
- // Photo and PhotoSlide Component
- case prefix + 'LOADING_PHOTO':
- return {
- ...state,
- loadingPhoto: action.payload.loadingPhoto,
- }
- case prefix + 'SET_PHOTO_LIST':
- return {
- ...state,
- photoConcertid: action.payload.photoConcertid,
- photoList: action.payload.photoList,
- photoBaseSrcThumbnail: action.payload.photoBaseSrcThumbnail,
- photoBaseSrcOriginal: action.payload.photoBaseSrcOriginal,
- photoUrl: action.payload.photoUrl,
- }
- case prefix + 'SET_DISPLAY_PHOTO_SLIDE_MODAL':
- return {
- ...state,
- displayPhotoSlideModal: action.payload.displayPhotoSlideModal,
- photoNumber: action.payload.photoNumber,
- }
-
- // Video and VideoController Component
- case prefix + 'LOADING_VIDEO':
- return {
- ...state,
- loadingVideo: action.payload.loadingVideo,
- }
- case prefix + 'SET_VIDEO_LIST':
- return {
- ...state,
- videoConcertid: action.payload.videoConcertid,
- videoList: action.payload.videoList,
- videoBaseSrc: action.payload.videoBaseSrc,
- videoUrl: action.payload.videoUrl,
- videoPoster: action.payload.videoPoster,
- }
-
- // プレイヤー操作
- case prefix + 'SET_VIDEO_REF':
- return {
- ...state,
- videoRef: action.payload.videoRef,
- }
- case prefix + 'SET_DISPLAY_VIDEO_CONTROLLER':
- return {
- ...state,
- displayVideoController: action.payload.displayVideoController,
- audioPlayerDisplay: action.payload.audioPlayerDisplay,
- }
- case prefix + 'SET_LOADING_VIDEO_SOURCE':
- return {
- ...state,
- loadingVideoSource: action.payload.loadingVideoSource,
- }
- case prefix + 'VIDEO_LOAD_PERCENT_UPDATE':
- return {
- ...state,
- videoLoadPercent: action.payload.videoLoadPercent,
- }
- case prefix + 'VIDEO_PLAY_UPDATE':
- return {
- ...state,
- videoCurrent: action.payload.videoCurrent,
- videoCurrentTime: action.payload.videoCurrentTime,
- videoDuration: action.payload.videoDuration,
- videoDurationTime: action.payload.videoDurationTime,
- videoPlayPercent: action.payload.videoPlayPercent,
- }
- case prefix + 'SET_VIDEO_PLAY_STATUS':
- return {
- ...state,
- videoPlayStatus: action.payload.videoPlayStatus,
- videoPlayTrack: action.payload.videoPlayTrack,
- }
-
- case prefix + 'SET_COUNT_FLAG':
- return {
- ...state,
- countFlag: action.payload.countFlag,
- }
-
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Audio.js b/client/src/Reducers/Audio.js
deleted file mode 100644
index 83305011..00000000
--- a/client/src/Reducers/Audio.js
+++ /dev/null
@@ -1,216 +0,0 @@
-const initialState = {
- // アーカイブプレイリスト(トラック情報全体)
- loadingArchivePlaylist: false,
- archivePlaylist: undefined,
- archiveBaseUrl: undefined,
-
- // 練習記録プレイリスト
- loadingPracticePlaylist: false,
- practicePlaylist: undefined,
- practiceBaseUrl: undefined,
-
- // 参考音源プレイリスト
- loadingSourcePlaylist: false,
- sourcePlaylist: undefined,
- sourceBaseUrl: undefined,
-
- // オーディオタグ本体
- audioRef: undefined,
-
- // 要素の表示状態
-
- // プレイヤーの表示状態
- displayPlayer: window.localStorage.displayPlayer === 'true' ? true : false,
- // プレイリストの表示状態
- displayPlaylist: false,
- // プレイリストが存在するか
- playlistLoad: false,
-
- // オーディオタグの情報
-
- // ファイル読み込み状態
- loadingAudio: false,
- loadPercent: undefined,
- // オーディオの再生状態
- playStatus: false,
- // 再生時間
- current: undefined,
- currentTime: undefined,
- duration: undefined,
- durationTime: undefined,
- playPercent: undefined,
-
- // 曲情報
-
- // 再生モード => archive, practice
- playmode: undefined,
-
- // アーカイブモード
- concertid: undefined,
- number: undefined,
- // album: undefined,
- // track: undefined,
-
- // 練習記録モード
- practiceid: undefined,
- fileNumber: undefined,
- requestTime: undefined,
- // practiceAlbum: undefined,
- // file: undefined,
-
- // 参考音源モード
- sourceid: undefined,
- sourceNumber: undefined,
-
- countFlag: true,
-}
-
-const prefix = 'AUDIO_'
-
-export default function audioReducer(state = initialState, action) {
- switch (action.type) {
- // アーカイブプレイリスト
- case prefix + 'LOADING_ARCHIVE_PLAYLIST':
- return {
- ...state,
- loadingArchivePlaylist: action.payload.loadingArchivePlaylist,
- }
- case prefix + 'SET_ARCHIVE_PLAYLIST':
- return {
- ...state,
- archivePlaylist: action.payload.archivePlaylist,
- archiveBaseUrl: action.payload.archiveBaseUrl,
- }
-
- // 練習記録プレイリスト
- case prefix + 'LOADING_PRACTICE_PLAYLIST':
- return {
- ...state,
- loadingPracticePlaylist: action.payload.loadingPracticePlaylist,
- }
- case prefix + 'SET_PRACTICE_PLAYLIST':
- return {
- ...state,
- practicePlaylist: action.payload.practicePlaylist,
- practiceBaseUrl: action.payload.practiceBaseUrl,
- }
-
- // 参考音源プレイリスト
- case prefix + 'LOADING_SOURCE_PLAYLIST':
- return {
- ...state,
- loadingSourcePlaylist: action.payload.loadingSourcePlaylist,
- }
- case prefix + 'SET_SOURCE_PLAYLIST':
- return {
- ...state,
- sourcePlaylist: action.payload.sourcePlaylist,
- sourceBaseUrl: action.payload.sourceBaseUrl,
- }
-
- // オーディオタグ本体
- case prefix + 'SET_AUDIO_REF':
- return {
- ...state,
- audioRef: action.payload.audioRef,
- }
-
- // 要素の表示状態
- case prefix + 'SET_DISPLAY_PLAYER':
- return {
- ...state,
- displayPlayer: action.payload.displayPlayer,
- }
- case prefix + 'SET_DISPLAY_PLAYLIST':
- return {
- ...state,
- displayPlaylist: action.payload.displayPlaylist,
- }
-
- // オーディオタグの情報
- case prefix + 'LOADING_AUDIO':
- return {
- ...state,
- loadingAudio: action.payload.loadingAudio,
- }
- case prefix + 'LOADING_UPDATE':
- return {
- ...state,
- loadPercent: action.payload.loadPercent,
- }
- case prefix + 'SET_PLAY_STATUS':
- return {
- ...state,
- playStatus: action.payload.playStatus,
- }
- case prefix + 'PLAY_UPDATE':
- return {
- ...state,
- current: action.payload.current,
- currentTime: action.payload.currentTime,
- duration: action.payload.duration,
- durationTime: action.payload.durationTime,
- playPercent: action.payload.playPercent,
- }
-
- // 曲情報
- case prefix + 'ARCHIVE_SET_PLAY_BASE':
- return {
- ...state,
- playmode: action.payload.playmode,
- concertid: action.payload.concertid,
- number: action.payload.number,
- // album: action.payload.album,
- // track: action.payload.track,
- // playlistLoad: action.payload.playlistLoad
- }
- // case prefix + 'ARCHIVE_SET_PLAY':
- // return {
- // ...state,
- // // playmode: action.payload.playmode,
- // // concertid: action.payload.concertid,
- // // number: action.payload.number,
- // album: action.payload.album,
- // track: action.payload.track,
- // playlistLoad: action.payload.playlistLoad
- // }
-
- // 曲情報
- case prefix + 'PRACTICE_SET_PLAY_BASE':
- return {
- ...state,
- playmode: action.payload.playmode,
- practiceid: action.payload.practiceid,
- fileNumber: action.payload.fileNumber,
- requestTime: action.payload.requestTime,
- }
- // case prefix + 'PRACTICE_SET_PLAY':
- // return {
- // ...state,
- // // playmode: action.payload.playmode,
- // // concertid: action.payload.concertid,
- // // number: action.payload.number,
- // practiceAlbum: action.payload.practiceAlbum,
- // file: action.payload.file,
- // playlistLoad: action.payload.playlistLoad
- // }
-
- // 曲情報
- case prefix + 'SOURCE_SET_PLAY_BASE':
- return {
- ...state,
- playmode: action.payload.playmode,
- sourceid: action.payload.sourceid,
- sourceNumber: action.payload.sourceNumber,
- }
-
- case prefix + 'SET_COUNT_FLAG':
- return {
- ...state,
- countFlag: action.payload.countFlag,
- }
-
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/BBS.js b/client/src/Reducers/BBS.js
deleted file mode 100644
index e664779c..00000000
--- a/client/src/Reducers/BBS.js
+++ /dev/null
@@ -1,65 +0,0 @@
-const initialState = {
- list: undefined,
- showList: [],
- showCount: 0,
- showMore: true,
- acquired: false,
- loading: false,
-
- loadingPost: false,
- postName: '',
- postText: '',
- postPass: '',
-}
-
-const prefix = 'BBS_'
-
-export default function bbsReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'UPDATE':
- return {
- ...state,
- list: action.payload.list,
- }
- case prefix + 'SHOW_LIST_UPDATE':
- return {
- ...state,
- showList: action.payload.showList,
- showCount: action.payload.showCount,
- showMore: action.payload.showMore,
- }
- case prefix + 'ACQUIRED':
- return {
- ...state,
- acquired: action.payload.acquired,
- }
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
-
- case prefix + 'LOADING_POST':
- return {
- ...state,
- loadingPost: action.payload.loadingPost,
- }
- case prefix + 'SET_POST_NAME':
- return {
- ...state,
- postName: action.payload.postName,
- }
- case prefix + 'SET_POST_TEXT':
- return {
- ...state,
- postText: action.payload.postText,
- }
- case prefix + 'SET_POST_PASS':
- return {
- ...state,
- postPass: action.payload.postPass,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/EmailValidation.js b/client/src/Reducers/EmailValidation.js
deleted file mode 100644
index 7bb4725b..00000000
--- a/client/src/Reducers/EmailValidation.js
+++ /dev/null
@@ -1,53 +0,0 @@
-const initialState = {
- loading: false,
- key: undefined,
- valid: false,
- windsid: '',
- password: '',
- err: undefined,
- errorMessage: false,
-}
-
-const prefix = 'EMAIL_VALIDATION_'
-
-export default function emailValidationReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'SET_KEY':
- return {
- ...state,
- key: action.payload.key,
- }
- case prefix + 'SET_VALID':
- return {
- ...state,
- valid: action.payload.valid,
- }
- case 'LOGIN_INPUT_WINDSID':
- return {
- ...state,
- windsid: action.payload.windsid,
- }
- case 'LOGIN_INPUT_PASSWORD':
- return {
- ...state,
- password: action.payload.password,
- }
- case prefix + 'SET_ERROR':
- return {
- ...state,
- err: action.payload.err,
- }
- case prefix + 'SET_ERROR_MESSAGE':
- return {
- ...state,
- errorMessage: action.payload.errorMessage,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/History.js b/client/src/Reducers/History.js
deleted file mode 100644
index bddc0ff9..00000000
--- a/client/src/Reducers/History.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const initialState = {
- list: undefined,
- showList: [],
- showMore: true,
- acquired: false,
- loading: false,
-}
-
-const prefix = 'HISTORY_'
-
-export default function historyReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'SET_LIST':
- return {
- ...state,
- list: action.payload.list,
- }
- case prefix + 'SHOW_LIST_UPDATE':
- return {
- ...state,
- showList: action.payload.showList,
- }
- case prefix + 'ACQUIRED':
- return {
- ...state,
- acquired: action.payload.acquired,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Login.js b/client/src/Reducers/Login.js
deleted file mode 100644
index aff50eb1..00000000
--- a/client/src/Reducers/Login.js
+++ /dev/null
@@ -1,38 +0,0 @@
-const initialState = {
- windsid: '',
- password: '',
- errorMessage: false,
- loading: false,
-}
-
-export default function loginReducer(state = initialState, action) {
- switch (action.type) {
- case 'LOGIN_INPUT_WINDSID':
- return {
- ...state,
- windsid: action.payload.windsid,
- }
- case 'LOGIN_INPUT_PASSWORD':
- return {
- ...state,
- password: action.payload.password,
- }
- case 'LOGIN_TOKEN':
- return {
- ...state,
- token: action.payload.token,
- }
- case 'LOGIN_ERROR':
- return {
- ...state,
- errorMessage: action.payload.errorMessage,
- }
- case 'LOGIN_LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Manager.js b/client/src/Reducers/Manager.js
deleted file mode 100644
index 7e9ed8d1..00000000
--- a/client/src/Reducers/Manager.js
+++ /dev/null
@@ -1,147 +0,0 @@
-const initialState = {
- data: undefined,
- acquired: false,
- loading: false,
-
- loadingSelectionPhase: false,
- selectionPhase: false,
-
- loadingSelectionList: false,
- loadingSelectionListSearch: false,
- searchQuery: '',
- selectionList: false,
- searchBoxRef: undefined,
-
- loadingSelectionLike: false,
- selectionLike: false,
- loadingSelectionSendLike: false,
-
- loadingSelectionPostDetail: false,
- loadingSelectionPost: false,
- loadingSelectionRemovePost: false,
- selectionPostid: false,
- selectionPost: {
- title: '',
- titleJa: '',
- titleEn: '',
- composer: [''],
- arranger: [''],
- duration: '',
- time: '',
- url: [''],
- memo: '',
- },
-
- loadingSelectionDetail: false,
- selectionDetailid: false,
- selectionDetail: false,
-}
-
-const prefix = 'MANAGER_'
-
-export default function managerReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'UPDATE':
- return {
- ...state,
- data: action.payload.data,
- }
- case prefix + 'ACQUIRED':
- return {
- ...state,
- acquired: action.payload.acquired,
- }
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'LOADING_SELECTION_PHASE':
- return {
- ...state,
- loadingSelectionPhase: action.payload.loadingSelectionPhase,
- }
- case prefix + 'SET_SELECTION_PHASE':
- return {
- ...state,
- selectionPhase: action.payload.selectionPhase,
- }
- case prefix + 'LOADING_SELECTION_LIST':
- return {
- ...state,
- loadingSelectionList: action.payload.loadingSelectionList,
- }
- case prefix + 'LOADING_SELECTION_LIST_SEARCH':
- return {
- ...state,
- loadingSelectionListSearch: action.payload.loadingSelectionListSearch,
- }
- case prefix + 'SET_SEARCH_QUERY':
- return {
- ...state,
- searchQuery: action.payload.searchQuery,
- }
- case prefix + 'SET_SELECTION_LIST':
- return {
- ...state,
- selectionList: action.payload.selectionList,
- }
- case prefix + 'SET_SEARCH_BOX_REF':
- return {
- ...state,
- searchBoxRef: action.payload.searchBoxRef,
- }
- case prefix + 'LOADING_SELECTION_LIKE':
- return {
- ...state,
- loadingSelectionLike: action.payload.loadingSelectionLike,
- }
- case prefix + 'SET_SELECTION_LIKE':
- return {
- ...state,
- selectionLike: action.payload.selectionLike,
- }
- case prefix + 'LOADING_SELECTION_SEND_LIKE':
- return {
- ...state,
- loadingSelectionSendLike: action.payload.loadingSelectionSendLike,
- }
- case prefix + 'LOADING_SELECTION_POST_DETAIL':
- return {
- ...state,
- loadingSelectionPostDetail: action.payload.loadingSelectionPostDetail,
- }
- case prefix + 'LOADING_SELECTION_POST':
- return {
- ...state,
- loadingSelectionPost: action.payload.loadingSelectionPost,
- }
- case prefix + 'SET_SELECTION_POSTID':
- return {
- ...state,
- selectionPostid: action.payload.selectionPostid,
- }
- case prefix + 'SET_SELECTION_POST':
- return {
- ...state,
- selectionPost: action.payload.selectionPost,
- }
- case prefix + 'LOADING_SELECTION_DETAIL':
- return {
- ...state,
- loadingSelectionDetail: action.payload.loadingSelectionDetail,
- }
- case prefix + 'SET_SELECTION_DETAILID':
- return {
- ...state,
- selectionDetailid: action.payload.selectionDetailid,
- }
- case prefix + 'SET_SELECTION_DETAIL':
- return {
- ...state,
- selectionDetail: action.payload.selectionDetail,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Navigation.js b/client/src/Reducers/Navigation.js
deleted file mode 100644
index be259791..00000000
--- a/client/src/Reducers/Navigation.js
+++ /dev/null
@@ -1,37 +0,0 @@
-const initialState = {
- title: false,
- titleConcertid: false,
- backNavigation: false,
- backNavigationPath: undefined,
- menuOpen: false,
-}
-
-const prefix = 'NAVIGATION_'
-
-export default function navigationReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'MENU':
- return {
- ...state,
- menuOpen: action.payload.menuOpen,
- }
- case prefix + 'SET_NAVIGATION_TITLE':
- return {
- ...state,
- title: action.payload.title,
- }
- case prefix + 'SET_NAVIGATION_TITLE_ARCHIVE_CONCERT_ID':
- return {
- ...state,
- titleConcertid: action.payload.titleConcertid,
- }
- case prefix + 'SET_BACKLINK':
- return {
- ...state,
- backNavigation: action.payload.backNavigation,
- backNavigationPath: action.payload.backNavigationPath,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Reg.js b/client/src/Reducers/Reg.js
deleted file mode 100644
index e940d9f1..00000000
--- a/client/src/Reducers/Reg.js
+++ /dev/null
@@ -1,50 +0,0 @@
-const initialState = {
- mode: false,
- windsid: '',
- password: '',
- approvalKey: '',
- errorMessage: false,
- loading: false,
-}
-
-export default function regReducer(state = initialState, action) {
- switch (action.type) {
- case 'REG_SET_MODE':
- return {
- ...state,
- mode: action.payload.mode,
- }
- case 'REG_INPUT_WINDSID':
- return {
- ...state,
- windsid: action.payload.windsid,
- }
- case 'REG_INPUT_PASSWORD':
- return {
- ...state,
- password: action.payload.password,
- }
- case 'REG_INPUT_KEY':
- return {
- ...state,
- approvalKey: action.payload.approvalKey,
- }
- // case 'LOGIN_TOKEN':
- // return {
- // ...state,
- // token: action.payload.token
- // }
- case 'REG_ERROR':
- return {
- ...state,
- errorMessage: action.payload.errorMessage,
- }
- case 'REG_LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Schedule.js b/client/src/Reducers/Schedule.js
deleted file mode 100644
index 8c224849..00000000
--- a/client/src/Reducers/Schedule.js
+++ /dev/null
@@ -1,27 +0,0 @@
-const initialState = {
- data: undefined,
- acquired: false,
- loading: false,
-}
-
-export default function scheduleReducer(state = initialState, action) {
- switch (action.type) {
- case 'SCHEDULE_UPDATE':
- return {
- ...state,
- data: action.payload.data,
- }
- case 'SCHEDULE_ACQUIRED':
- return {
- ...state,
- acquired: action.payload.acquired,
- }
- case 'SCHEDULE_LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Score.js b/client/src/Reducers/Score.js
deleted file mode 100644
index 91f78b93..00000000
--- a/client/src/Reducers/Score.js
+++ /dev/null
@@ -1,129 +0,0 @@
-const initialState = {
- loading: false,
- scoreList: undefined,
- showList: [],
- loadMoreLoading: false,
- searchQuery: '',
- loadingSearch: false,
- searchBoxRef: undefined,
- displayScoreModal: false,
- modalContent: undefined,
-
- // score detail
- detailLoading: false,
- scoreid: undefined,
- scoreDetail: undefined,
- boxUse: undefined,
- boxList: undefined,
-
- // score edit
- editPreLoading: false,
- scoreEdit: undefined,
- editLoading: false,
- editModalRef: undefined,
-
- // editMode: undefined,
- editMode: undefined,
-
- displayEditScoreModal: false,
-}
-
-const prefix = 'SCORE_'
-
-export default function scoreReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'SET_SCORE_LIST':
- return {
- ...state,
- scoreList: action.payload.scoreList,
- }
- case prefix + 'SHOW_LIST_UPDATE':
- return {
- ...state,
- showList: action.payload.showList,
- }
- case prefix + 'LOAD_MORE_LOADING':
- return {
- ...state,
- loadMoreLoading: action.payload.loadMoreLoading,
- }
-
- case prefix + 'SET_SEARCH_QUERY':
- return {
- ...state,
- searchQuery: action.payload.searchQuery,
- }
- case prefix + 'LOADING_SEARCH':
- return {
- ...state,
- loadingSearch: action.payload.loadingSearch,
- }
- case prefix + 'SET_SEARCH_BOX_REF':
- return {
- ...state,
- searchBoxRef: action.payload.searchBoxRef,
- }
- case prefix + 'SET_DISPLAY_SCORE_MODAL':
- return {
- ...state,
- displayScoreModal: action.payload.displayScoreModal,
- modalContent: action.payload.modalContent,
- }
- case prefix + 'DETAIL_LOADING':
- return {
- ...state,
- detailLoading: action.payload.detailLoading,
- }
- case prefix + 'SET_SCORE_DETAIL':
- return {
- ...state,
- scoreid: action.payload.scoreid,
- scoreDetail: action.payload.scoreDetail,
- boxUse: action.payload.boxUse,
- }
- case prefix + 'SET_BOX_LIST':
- return {
- ...state,
- boxList: action.payload.boxList,
- }
-
- // score edit
- case prefix + 'SET_EDIT_MODAL_REF':
- return {
- ...state,
- editModalRef: action.payload.editModalRef,
- }
- case prefix + 'EDIT_PRE_LOADING':
- return {
- ...state,
- editPreLoading: action.payload.editPreLoading,
- }
- case prefix + 'EDIT_LOADING':
- return {
- ...state,
- editLoading: action.payload.editLoading,
- }
- case prefix + 'SET_EDIT_MODE':
- return {
- ...state,
- editMode: action.payload.editMode,
- }
- case prefix + 'SET_SCORE_EDIT':
- return {
- ...state,
- scoreEdit: action.payload.scoreEdit,
- }
- case prefix + 'UPDATE_DISPLAY_EDIT_SCORE_MODAL':
- return {
- ...state,
- displayEditScoreModal: action.payload.displayEditScoreModal,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/ScoreBox.js b/client/src/Reducers/ScoreBox.js
deleted file mode 100644
index 92d737bf..00000000
--- a/client/src/Reducers/ScoreBox.js
+++ /dev/null
@@ -1,59 +0,0 @@
-const initialState = {
- loading: false,
- boxList: undefined,
- acquired: false,
-
- displayBoxModal: false,
- modalContent: undefined,
-
- inputBoxLocate: '',
- loadingUpdateBoxLocate: false,
-
- loadingAddBox: false,
-}
-
-const prefix = 'SCOREBOX_'
-
-export default function scoreBoxReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'SET_BOX_LIST':
- return {
- ...state,
- boxList: action.payload.boxList,
- }
- case prefix + 'ACQUIRED':
- return {
- ...state,
- acquired: action.payload.acquired,
- }
- case prefix + 'SET_DISPLAY_BOX_MODAL':
- return {
- ...state,
- displayBoxModal: action.payload.displayBoxModal,
- modalContent: action.payload.modalContent,
- inputBoxLocate: action.payload.inputBoxLocate,
- }
- case prefix + 'LOADING_UPDATE_BOX_LOCATE':
- return {
- ...state,
- loadingUpdateBoxLocate: action.payload.loadingUpdateBoxLocate,
- }
- case prefix + 'CHANGE_INPUT_BOX_LOCATE':
- return {
- ...state,
- inputBoxLocate: action.payload.inputBoxLocate,
- }
- case prefix + 'LOADING_ADD_BOX':
- return {
- ...state,
- loadingAddBox: action.payload.loadingAddBox,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Setting.js b/client/src/Reducers/Setting.js
deleted file mode 100644
index 0bd6466d..00000000
--- a/client/src/Reducers/Setting.js
+++ /dev/null
@@ -1,130 +0,0 @@
-const initialState = {
- loading: false,
-
- modifyText: '',
- loadingModify: false,
-
- loadingDeleteEmailRequest: false,
-
- // Password
- oldPassword: '',
- newPassword: '',
- loadingUpdatePassword: false,
-
- // Administrator
- loadingAdminRequest: false,
- adminRequestPass: '',
-
- // Delete Account
- deletePassword: '',
- loadingDeleteAccount: false,
-
- // Score Setting
- loadingScoreAdminRequest: false,
- scoreAdminRequestPass: '',
-
- loadingScoreCount: false,
- scoreCount: undefined,
- loadingScoreMailRequest: false,
-}
-
-const prefix = 'SETTING_'
-
-export default function settingReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
-
- case prefix + 'SET_MODIFY_TEXT':
- return {
- ...state,
- modifyText: action.payload.modifyText,
- }
- case prefix + 'LOADING_MODIFY':
- return {
- ...state,
- loadingModify: action.payload.loadingModify,
- }
-
- case prefix + 'LOADING_DELETE_EMAIL_REQUEST':
- return {
- ...state,
- loadingDeleteEmailRequest: action.payload.loadingDeleteEmailRequest,
- }
-
- // Password
- case prefix + 'SET_OLD_PASSWORD':
- return {
- ...state,
- oldPassword: action.payload.oldPassword,
- }
- case prefix + 'SET_NEW_PASSWORD':
- return {
- ...state,
- newPassword: action.payload.newPassword,
- }
- case prefix + 'LOADING_UPDATE_PASSWORD':
- return {
- ...state,
- loadingUpdatePassword: action.payload.loadingUpdatePassword,
- }
-
- // Administrator
- case prefix + 'LOADING_ADMIN_REQUEST':
- return {
- ...state,
- loadingAdminRequest: action.payload.loadingAdminRequest,
- }
- case prefix + 'SET_ADMIN_REQUEST_PASS':
- return {
- ...state,
- adminRequestPass: action.payload.adminRequestPass,
- }
-
- // Delete Account
- case prefix + 'SET_DELETE_PASSWORD':
- return {
- ...state,
- deletePassword: action.payload.deletePassword,
- }
- case prefix + 'LOADING_DELETE_ACCOUNT':
- return {
- ...state,
- loadingDeleteAccount: action.payload.loadingDeleteAccount,
- }
-
- // Score Setting
- case prefix + 'LOADING_SCORE_ADMIN_REQUEST':
- return {
- ...state,
- loadingScoreAdminRequest: action.payload.loadingScoreAdminRequest,
- }
- case prefix + 'SET_SCORE_ADMIN_REQUEST_PASS':
- return {
- ...state,
- scoreAdminRequestPass: action.payload.scoreAdminRequestPass,
- }
-
- case prefix + 'LOADING_SCORE_COUNT':
- return {
- ...state,
- loadingScoreCount: action.payload.loadingScoreCount,
- }
- case prefix + 'SET_SCORE_COUNT':
- return {
- ...state,
- scoreCount: action.payload.scoreCount,
- }
-
- case prefix + 'LOADING_SCORE_MAIL_REQUEST':
- return {
- ...state,
- loadingScoreMailRequest: action.payload.loadingScoreMailRequest,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Source.js b/client/src/Reducers/Source.js
deleted file mode 100644
index 780d30ee..00000000
--- a/client/src/Reducers/Source.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const initialState = {
- list: undefined,
- acquired: false,
- loading: false,
-}
-
-const prefix = 'SOURCE_'
-
-export default function sourceReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'SET_LIST':
- return {
- ...state,
- list: action.payload.list,
- }
- case prefix + 'ACQUIRED':
- return {
- ...state,
- acquired: action.payload.acquired,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Status.js b/client/src/Reducers/Status.js
deleted file mode 100644
index 435f6f98..00000000
--- a/client/src/Reducers/Status.js
+++ /dev/null
@@ -1,58 +0,0 @@
-const initialState = {
- login: false,
- user: undefined,
- windsid: '',
- token: '',
- loading: false,
- width: 0,
- pc: true,
- mobile: false,
-}
-
-const prefix = 'STATUS_'
-
-export default function statusReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'LOGIN':
- return {
- ...state,
- login: action.payload.login,
- }
- case prefix + 'SET_USER':
- return {
- ...state,
- user: action.payload.user,
- }
- case prefix + 'WINDSID':
- return {
- ...state,
- windsid: action.payload.windsid,
- }
- case prefix + 'TOKEN':
- return {
- ...state,
- token: action.payload.token,
- }
- case prefix + 'LOADING':
- return {
- ...state,
- loading: action.payload.loading,
- }
- case prefix + 'WINDOW_WIDTH':
- return {
- ...state,
- width: action.payload.width,
- pc: action.payload.pc,
- mobile: action.payload.mobile,
- }
- // react-router-redux の Action をフック
- // リンク移動先を保存
- // case '@@router/LOCATION_CHANGE':
- // window.localStorage.setItem('location', action.payload.pathname)
- // return {
- // ...state,
- // }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Toast.js b/client/src/Reducers/Toast.js
deleted file mode 100644
index ec7dfa0b..00000000
--- a/client/src/Reducers/Toast.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const initialState = {
- string: '',
- status: false,
- hide: true,
- end: true,
-}
-
-export default function toastReducer(state = initialState, action) {
- switch (action.type) {
- case 'TOAST_DISPLAY':
- return {
- ...state,
- string: action.payload.string,
- status: action.payload.status,
- hide: action.payload.hide,
- end: action.payload.end,
- }
- case 'TOAST_HIDE':
- return {
- ...state,
- status: action.payload.status,
- hide: action.payload.hide,
- end: action.payload.end,
- }
- case 'TOAST_END':
- return {
- ...state,
- string: action.payload.string,
- status: action.payload.status,
- hide: action.payload.hide,
- end: action.payload.end,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Reducers/Tutorial.js b/client/src/Reducers/Tutorial.js
deleted file mode 100644
index 17a4e798..00000000
--- a/client/src/Reducers/Tutorial.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const initialState = {
- userAgent: undefined,
- standalone: undefined,
-
- displayTutorial: false,
- tutorialMode: undefined,
-}
-
-const prefix = 'TUTORIAL_'
-
-export default function sourceReducer(state = initialState, action) {
- switch (action.type) {
- case prefix + 'SET_USER_AGENT':
- return {
- ...state,
- userAgent: action.payload.userAgent,
- }
- case prefix + 'SET_STANDALONE':
- return {
- ...state,
- standalone: action.payload.standalone,
- }
- case prefix + 'SET_DISPLAY_TUTORIAL':
- return {
- ...state,
- displayTutorial: action.payload.displayTutorial,
- tutorialMode: action.payload.tutorialMode,
- }
- default:
- return state
- }
-}
diff --git a/client/src/Store/Store.js b/client/src/Store/Store.js
deleted file mode 100644
index ae78a678..00000000
--- a/client/src/Store/Store.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import { createStore as reduxCreateStore, combineReducers, applyMiddleware } from 'redux'
-import { routerReducer, routerMiddleware } from 'react-router-redux'
-// import logger from 'redux-logger'
-import thunk from 'redux-thunk'
-// import authenticateReducer from '../Reducers/Authenticate'
-import statusReducer from '../Reducers/Status'
-
-import audioReducer from '../Reducers/Audio'
-import navigationReducer from '../Reducers/Navigation'
-import toastReducer from '../Reducers/Toast'
-
-import managerReducer from '../Reducers/Manager'
-import scheduleReducer from '../Reducers/Schedule'
-import historyReducer from '../Reducers/History'
-import bbsReducer from '../Reducers/BBS'
-import sourceReducer from '../Reducers/Source'
-
-import archiveReducer from '../Reducers/Archive'
-import scoreReducer from '../Reducers/Score'
-import scoreBoxReducer from '../Reducers/ScoreBox'
-
-import settingReducer from '../Reducers/Setting'
-
-import tutorialReducer from '../Reducers/Tutorial'
-
-import loginReducer from '../Reducers/Login'
-import regReducer from '../Reducers/Reg'
-
-import emailValidationReducer from '../Reducers/EmailValidation'
-
-// historyはsrc/App.jsから渡す
-export default function createStore(history) {
- return reduxCreateStore(
- combineReducers({
- // authenticate: authenticateReducer,
- status: statusReducer,
-
- audio: audioReducer,
- navigation: navigationReducer,
- toast: toastReducer,
-
- schedule: scheduleReducer,
- history: historyReducer,
- manager: managerReducer,
- bbs: bbsReducer,
- source: sourceReducer,
-
- archive: archiveReducer,
- score: scoreReducer,
- scoreBox: scoreBoxReducer,
-
- setting: settingReducer,
-
- tutorial: tutorialReducer,
-
- reg: regReducer,
- login: loginReducer,
-
- emailValidation: emailValidationReducer,
-
- // react-router-reduxのReducer
- router: routerReducer,
- // history: historyReducer
- }),
- applyMiddleware(
- // logger,
- thunk,
- // react-router-reduxのRedux Middleware
- routerMiddleware(history)
- )
- )
-}
diff --git a/client/src/_color.scss b/client/src/_color.scss
deleted file mode 100644
index 6532dadf..00000000
--- a/client/src/_color.scss
+++ /dev/null
@@ -1,37 +0,0 @@
-// $base-color: #B60005;
-$base-color: hsl(358, 100, 36%);
-$base-color-dark: hsl(358, 100, 30%);
-$base-color-bright: hsl(358, 100, 40%);
-
-$base-play-color: hsla(358, 100%, 36%, 1);
-$base-play-color-light: hsla(358, 58%, 94%, 1);
-$base-play-color-very-light: hsla(358, 58%, 98%, 1);
-$base-play-color-half-light: hsl(358, 100%, 60%);
-
-$main-base-color: #ea5505;
-$mini-base-color: rgba(0, 191, 255, 1);
-$other-base-color: #888;
-
-$main-base-color-dark: hsl(21, 96%, 42%);
-$mini-base-color-dark: hsl(195, 100%, 45%);
-$other-base-color-dark: hsl(0, 0%, 48%);
-
-$main-play-color: #ea5505;
-$mini-play-color: rgba(0, 191, 255, 1);
-$other-play-color: #888;
-
-// $main-play-color-dark: hsl(21,96%,42%);
-// $mini-play-color-dark: hsl(195,100%,45%);
-// $other-play-color-dark: hsl(0,0%,48%);
-
-$main-play-color-light: #fdeee6;
-$mini-play-color-light: #e5f8ff;
-$other-play-color-light: #eee;
-
-$main-play-color-dark: hsl(21, 96%, 20%);
-$mini-play-color-dark: hsl(195, 100%, 23%);
-$other-play-color-dark: hsl(0, 0%, 26%);
-
-$main-play-color-half-light: hsl(21, 96%, 60%);
-$mini-play-color-half-light: hsl(195, 100%, 60%);
-$other-play-color-half-light: hsl(0, 0%, 60%);
diff --git a/client/src/index.js b/client/src/index.js
deleted file mode 100644
index 0d5d632e..00000000
--- a/client/src/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react'
-import ReactDOM from 'react-dom'
-
-import App from './App'
-import './index.css'
-
-ReactDOM.render(
, document.getElementById('root'))
diff --git a/client/src/index.scss b/client/src/index.scss
deleted file mode 100644
index 4707c1ba..00000000
--- a/client/src/index.scss
+++ /dev/null
@@ -1,401 +0,0 @@
-@import './_color.scss';
-
-body {
- margin: 0;
- padding: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', '游ゴシック Medium',
- meiryo, sans-serif;
- // line-height: 1;
- line-height: 1.6;
- // -webkit-touch-callout: none;
- // -webkit-user-select: none;
-
- & {
- background: #efeff4;
- }
- @media (prefers-color-scheme: dark) {
- & {
- background: #333;
- }
- }
-}
-
-html {
- padding-top: constant(safe-area-inset-top);
- padding-bottom: constant(safe-area-inset-bottom);
- padding-left: constant(safe-area-inset-left);
- padding-right: constant(safe-area-inset-right);
-
- padding-top: env(safe-area-inset-top);
- padding-bottom: env(safe-area-inset-bottom);
- padding-left: env(safe-area-inset-left);
- padding-right: env(safe-area-inset-right);
-}
-
-* {
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- outline: none;
-}
-
-a {
- -webkit-touch-callout: none;
-}
-
-// input:focus,
-// input[type="password"]:focus {
-// border: solid 1px $base-color!important;
-// outline: 0;
-// }
-
-// Forms
-input[type='text'],
-input[type='email'],
-input[type='address'],
-input[type='password'],
-input[type='date'],
-input[type='time'],
-textarea {
- -webkit-appearance: none;
-}
-
-input[type='text'],
-input[type='email'],
-input[type='password'] {
- -webkit-appearance: none;
- display: block;
- width: calc(100% - 20px - 2px);
- margin: 0;
- padding: 8px 10px;
- border-radius: 0.25rem;
- font-size: 17px;
- font-family: -apple-system, BlinkMacSystemFont, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', '游ゴシック Medium',
- meiryo, sans-serif;
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-
- & {
- color: #333;
- background: #fff;
- border: 1px solid #cbcbcd;
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: #fff;
- background: #222;
- border: 1px solid #333;
- }
- }
-
- &:focus {
- border: solid 1px rgba(182, 0, 5, 1);
- box-shadow: 0 0 0 0.2rem rgba(182, 0, 5, 0.25);
- outline: 0;
- }
-
- &:active {
- border: solid 1px rgba(182, 0, 5, 1);
- }
-}
-
-textarea {
- -webkit-appearance: none;
- display: block;
- width: calc(100% - 20px - 2px);
- height: 6em;
- margin: 0 auto;
- padding: 8px 10px;
- border-radius: 0.25rem;
- font-size: 17px;
- font-family: -apple-system, BlinkMacSystemFont, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', '游ゴシック Medium',
- meiryo, sans-serif;
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-
- & {
- color: #333;
- background: #fff;
- border: 1px solid #cbcbcd;
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: #fff;
- background: #222;
- border: 1px solid #333;
- }
- }
-
- &:focus {
- border: solid 1px rgba(182, 0, 5, 0.6);
- box-shadow: 0 0 0 0.2rem rgba(182, 0, 5, 0.25);
- outline: 0;
- }
-}
-
-::selection {
- background: hsla(358, 100, 36%, 0.4);
- color: #ffffff;
-}
-::-moz-selection {
- background: hsla(358, 100, 36%, 0.4);
- color: #ffffff;
-}
-
-div {
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- outline: none;
-}
-
-// 演奏会リストの表示に使用
-// @-webkit-keyframes fadein {
-// 0% {
-// opacity: 0;
-// }
-// 100% {
-// opacity: 1;
-// }
-// }
-
-// @keyframes fadein {
-// 0% {
-// opacity: 0;
-// }
-// 100% {
-// opacity: 1;
-// }
-// }
-
-.full-loading {
- width: 100vw;
- height: 100%;
- display: flex;
- // flex-direction: row;
- justify-content: center;
- align-items: center;
- background: #efeff4;
-
- & {
- background: #efeff4;
- }
- @media (prefers-color-scheme: dark) {
- & {
- background: #1c1c1e;
- }
- }
-}
-
-.loading {
- padding: 28px 0;
- margin: 0 auto;
- width: 60px;
- display: flex;
- justify-content: space-between;
-}
-
-.loading > div {
- width: 16px;
- height: 16px;
- background-color: #ccc;
-
- border-radius: 100%;
- display: inline-block;
- -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
- animation: sk-bouncedelay 1.4s infinite ease-in-out both;
-}
-
-.loading .loading1 {
- -webkit-animation-delay: -0.32s;
- animation-delay: -0.32s;
-}
-
-.loading .loading2 {
- -webkit-animation-delay: -0.16s;
- animation-delay: -0.16s;
-}
-
-@-webkit-keyframes sk-bouncedelay {
- 0%,
- 80%,
- 100% {
- -webkit-transform: scale(0);
- }
- 40% {
- -webkit-transform: scale(1);
- }
-}
-
-@keyframes sk-bouncedelay {
- 0%,
- 80%,
- 100% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 40% {
- -webkit-transform: scale(1);
- transform: scale(1);
- }
-}
-
-.react-confirm-alert-overlay {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- z-index: 10;
- display: flex;
- justify-content: center;
- -ms-align-items: center;
- align-items: center;
- /* opacity: 1; */
-
- & {
- background: rgba(0, 0, 0, 0.3);
- }
- @media (prefers-color-scheme: dark) {
- & {
- background: rgba(0, 0, 0, 0.6);
- }
- }
-}
-
-.react-confirm-alert-body {
- width: 270px;
- padding: 0;
- background: #fcfcfc;
- border-radius: 12px;
- color: #000;
-
- & > h1 {
- padding: 16px 16px;
- margin: 8px 0 0 0;
- font-size: 17px;
- font-weight: 600;
- text-align: center;
- }
-}
-
-.react-confirm-alert-button-group {
- display: flex;
- justify-content: flex-start;
- margin: 0;
- border-top: 1px solid #dbdbdf;
-
- & > button {
- display: inline-block;
- width: 50%;
- height: 44px;
- margin: 0;
- padding: 6px 18px;
- border: none;
- background: #f8f8f8;
- font-size: 17px;
- cursor: pointer;
- outline: none;
- &:first-child {
- border-right: 1px solid #dbdbdf;
- border-radius: 0 0 0 12px;
- color: #488aff;
- font-weight: 600;
- }
- &:last-child {
- border-radius: 0 0 12px 0;
- color: #f53d3d;
- }
- }
-}
-.react-confirm-alert {
- .alert {
- width: 270px;
- padding: 0;
- border-radius: 12px;
-
- & {
- color: #000;
- background: #f0f0f0;
- }
- @media (prefers-color-scheme: dark) {
- & {
- color: #fff;
- background: #232323;
- }
- }
-
- & > h1 {
- padding: 12px 16px 7px;
- margin: 8px 0 0 0;
- font-size: 17px;
- font-weight: 600;
- text-align: center;
- }
-
- & > p {
- padding: 0 16px 21px;
- margin: 0;
- text-align: center;
- font-size: 13px;
- }
-
- & > .button-group {
- display: flex;
- justify-content: flex-start;
- margin: 0;
-
- & {
- border-top: 0.55px solid #cbcbcd;
- }
- @media (prefers-color-scheme: dark) {
- & {
- border-top: 0.55px solid #2d2d2f;
- }
- }
-
- & > button {
- display: inline-block;
- width: 50%;
- height: 44px;
- margin: 0;
- padding: 6px 18px;
- border: none;
- font-size: 17px;
- cursor: pointer;
- outline: none;
-
- & {
- background: #f0f0f0;
- }
- @media (prefers-color-scheme: dark) {
- & {
- background: #232323;
- }
- }
-
- &:first-child {
- border-radius: 0 0 0 12px;
- color: #488aff;
- font-weight: 600;
-
- & {
- border-right: 0.55px solid #cbcbcd;
- }
- @media (prefers-color-scheme: dark) {
- & {
- border-right: 0.55px solid #2d2d2f;
- }
- }
- }
- &:last-child {
- border-radius: 0 0 12px 0;
- color: #f53d3d;
- }
-
- &:hover {
- background: #dedede;
- }
- @media (prefers-color-scheme: dark) {
- &:hover {
- background: #434345;
- }
- }
- }
- }
- }
-}
diff --git a/package.json b/package.json
index 72b75b4e..d1944266 100644
--- a/package.json
+++ b/package.json
@@ -1,68 +1,65 @@
{
"name": "member",
"version": "0.6.9",
- "description": "",
- "main": "index.js",
+ "private": true,
"scripts": {
- "start": "node app.js",
- "watch": "webpack -w",
- "build-js": "webpack --config webpack.dev.js",
- "build-production": "webpack --config webpack.prod.js",
- "test": "echo \"Error: no test specified\" && exit 1",
- "build-css": "node-sass client/src/ -o client/src/ --output-style compressed",
- "watch-css": "yarn run build-css && webpack -w",
- "build": "yarn run build-css && yarn run build-js",
- "build-prod": "yarn run build-css && yarn run build-production",
- "build-dev": "yarn run build-css && yarn run build-js -- --devtool source-map",
- "dev-start": "yarn run build-dev; DEBUG=express:* node app.js",
- "lint": "yarn run lint-client && yarn run lint-server",
- "lint-client": "eslint ./client/src --config .eslintrc-client.json",
- "lint-server": "eslint ./app.js --config .eslintrc-server.json",
- "prettier": "prettier --write 'client/src/**/*.{js,jsx,ts,tsx,json,scss,md}'"
+ "build": "REACT_APP_VERSION=\"$npm_package_version\" react-scripts build",
+ "eject": "react-scripts eject",
+ "lint": "eslint --fix 'src/**/*.{js,jsx,ts,tsx}'",
+ "prettier": "prettier --write 'src/**/*.{js,jsx,ts,tsx,json,scss,md}'",
+ "prettiercheck": "prettier --check 'src/**/*.{js,jsx,ts,tsx,json,scss,md}'",
+ "start": "REACT_APP_VERSION=\"$npm_package_version\" react-scripts start",
+ "test": "react-scripts test",
+ "typecheck": "tsc --noEmit"
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
},
- "author": "",
- "license": "ISC",
"dependencies": {
- "body-parser": "^1.19.0",
- "compression": "^1.7.4",
- "express": "^4.17.1",
- "file-loader": "^1.1.11",
- "flux": "^3.1.3",
- "history": "^4.10.1",
- "nedb": "^1.8.0",
- "project-version": "^1.0.0",
- "react": "^16.13.1",
- "react-confirm-alert": "^2.6.1",
- "react-dom": "^16.13.1",
- "react-id-swiper": "^1.6.9",
- "react-modal": "^3.11.2",
- "react-redux": "^5.1.2",
- "react-router-dom": "^4.2.2",
- "react-router-redux": "^5.0.0-alpha.9",
- "redux": "^4.0.5",
- "redux-logger": "^3.0.6",
- "redux-thunk": "^2.3.0",
- "serialize-javascript": "^3.1.0",
- "superagent": "^3.8.2",
- "uuid": "^3.4.0"
+ "@hookform/resolvers": "^2.9.10",
+ "@testing-library/jest-dom": "^5.16.5",
+ "@testing-library/react": "^13.4.0",
+ "@testing-library/user-event": "^13.5.0",
+ "@types/jest": "^27.5.2",
+ "@types/node": "^16.18.11",
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.10",
+ "clsx": "^1.2.1",
+ "react": "^18.2.0",
+ "react-confirm-alert": "^3.0.6",
+ "react-dom": "^18.2.0",
+ "react-error-boundary": "^3.1.4",
+ "react-hook-form": "^7.41.3",
+ "react-query": "^3.39.2",
+ "react-query-auth": "^1.1.0",
+ "react-scripts": "5.0.1",
+ "swiper": "^8.4.5",
+ "typescript": "^4.9.4",
+ "uuid": "^9.0.0",
+ "web-vitals": "^2.1.4",
+ "zod": "^3.20.2",
+ "zustand": "^4.2.0"
},
"devDependencies": {
- "@babel/cli": "^7.8.4",
- "@babel/core": "^7.9.6",
- "@babel/polyfill": "^7.8.7",
- "@babel/preset-env": "^7.9.6",
- "@babel/preset-es2015": "^7.0.0-beta.53",
- "@babel/preset-react": "^7.9.4",
- "babel-loader": "^8.1.0",
- "css-loader": "^3.5.3",
- "eslint": "^6.8.0",
- "eslint-plugin-react": "^7.19.0",
- "node-sass": "^4.14.0",
- "prettier": "^2.1.2",
- "style-loader": "^0.20.2",
- "svg-react-loader": "^0.4.5",
- "webpack": "^4.43.0",
- "webpack-cli": "^3.3.11",
- "webpack-merge": "^4.2.2"
+ "@types/swiper": "^6.0.0",
+ "@types/uuid": "^9.0.0",
+ "prettier": "^2.8.1",
+ "react-router-dom": "^6.6.1",
+ "sass": "^1.57.1"
}
}
diff --git a/client/build/apple-touch-icon.png b/public/apple-touch-icon.png
similarity index 100%
rename from client/build/apple-touch-icon.png
rename to public/apple-touch-icon.png
diff --git a/client/build/apple_splash_640.png b/public/apple_splash_640.png
similarity index 100%
rename from client/build/apple_splash_640.png
rename to public/apple_splash_640.png
diff --git a/client/build/favicon.ico b/public/favicon.ico
similarity index 100%
rename from client/build/favicon.ico
rename to public/favicon.ico
diff --git a/client/build/icon-144.png b/public/icon-144.png
similarity index 100%
rename from client/build/icon-144.png
rename to public/icon-144.png
diff --git a/client/build/icon-192.png b/public/icon-192.png
similarity index 100%
rename from client/build/icon-192.png
rename to public/icon-192.png
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 00000000..fb42d975
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
会員専用ページ
+
+
+
+
+
+
+
diff --git a/client/build/manifest.json b/public/manifest.json
similarity index 99%
rename from client/build/manifest.json
rename to public/manifest.json
index c6c9528b..22c943e7 100644
--- a/client/build/manifest.json
+++ b/public/manifest.json
@@ -26,4 +26,4 @@
"display": "standalone",
"theme_color": "#ffffff",
"background_color": "#ffffff"
-}
\ No newline at end of file
+}
diff --git a/client/build/pwa-icon.png b/public/pwa-icon.png
similarity index 100%
rename from client/build/pwa-icon.png
rename to public/pwa-icon.png
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 00000000..e9e57dc4
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/src/App.scss b/src/App.scss
new file mode 100644
index 00000000..7a9e06f6
--- /dev/null
+++ b/src/App.scss
@@ -0,0 +1,16 @@
+body {
+ margin: 0;
+ padding: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', '游ゴシック Medium',
+ meiryo, sans-serif;
+ line-height: 1.6;
+
+ & {
+ background: #efeff4;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #333;
+ }
+ }
+}
diff --git a/src/App.test.tsx b/src/App.test.tsx
new file mode 100644
index 00000000..3a7a8cc5
--- /dev/null
+++ b/src/App.test.tsx
@@ -0,0 +1,9 @@
+import React from 'react'
+import { render, screen } from '@testing-library/react'
+import App from './App'
+
+test('renders learn react link', () => {
+ render(
)
+ const linkElement = screen.getByText(/learn react/i)
+ expect(linkElement).toBeInTheDocument()
+})
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 00000000..f1f3e103
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,13 @@
+import { AppProvider } from './providers/app'
+import { AppRoutes } from './routes'
+import './App.scss'
+
+function App() {
+ return (
+
+
+
+ )
+}
+
+export default App
diff --git a/src/assets/arrow-up.svg b/src/assets/arrow-up.svg
new file mode 100644
index 00000000..e124957f
--- /dev/null
+++ b/src/assets/arrow-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/backward.svg b/src/assets/backward.svg
new file mode 100644
index 00000000..bddf00b5
--- /dev/null
+++ b/src/assets/backward.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/box.svg b/src/assets/box.svg
new file mode 100644
index 00000000..aefde2c4
--- /dev/null
+++ b/src/assets/box.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/check.svg b/src/assets/check.svg
new file mode 100644
index 00000000..8f2a94ea
--- /dev/null
+++ b/src/assets/check.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/close-circle.svg b/src/assets/close-circle.svg
new file mode 100644
index 00000000..a3c9cd66
--- /dev/null
+++ b/src/assets/close-circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/close.svg b/src/assets/close.svg
new file mode 100644
index 00000000..cb00cfe9
--- /dev/null
+++ b/src/assets/close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/css.svg b/src/assets/css.svg
new file mode 100644
index 00000000..02ae4157
--- /dev/null
+++ b/src/assets/css.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/desktop.svg b/src/assets/desktop.svg
new file mode 100644
index 00000000..2674ffd3
--- /dev/null
+++ b/src/assets/desktop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/down.svg b/src/assets/down.svg
new file mode 100644
index 00000000..dead7fe2
--- /dev/null
+++ b/src/assets/down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/edit.svg b/src/assets/edit.svg
new file mode 100644
index 00000000..89940aa0
--- /dev/null
+++ b/src/assets/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/forward.svg b/src/assets/forward.svg
new file mode 100644
index 00000000..4aa77962
--- /dev/null
+++ b/src/assets/forward.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/home.svg b/src/assets/home.svg
new file mode 100644
index 00000000..20753289
--- /dev/null
+++ b/src/assets/home.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/Asset/hr.svg b/src/assets/hr.svg
similarity index 100%
rename from client/src/Asset/hr.svg
rename to src/assets/hr.svg
diff --git a/src/assets/html.svg b/src/assets/html.svg
new file mode 100644
index 00000000..2d4859c7
--- /dev/null
+++ b/src/assets/html.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/information.svg b/src/assets/information.svg
new file mode 100644
index 00000000..a2b11b89
--- /dev/null
+++ b/src/assets/information.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/javascript.svg b/src/assets/javascript.svg
new file mode 100644
index 00000000..81ccfbcd
--- /dev/null
+++ b/src/assets/javascript.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/left-circle.svg b/src/assets/left-circle.svg
new file mode 100644
index 00000000..391e5149
--- /dev/null
+++ b/src/assets/left-circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/left.svg b/src/assets/left.svg
new file mode 100644
index 00000000..b61d6647
--- /dev/null
+++ b/src/assets/left.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/src/assets/list.svg b/src/assets/list.svg
new file mode 100644
index 00000000..9e842d7f
--- /dev/null
+++ b/src/assets/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/lock.svg b/src/assets/lock.svg
new file mode 100644
index 00000000..29d4f2b2
--- /dev/null
+++ b/src/assets/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/Asset/Logo/logo.svg b/src/assets/logo.svg
similarity index 100%
rename from client/src/Asset/Logo/logo.svg
rename to src/assets/logo.svg
diff --git a/src/assets/logout.svg b/src/assets/logout.svg
new file mode 100644
index 00000000..efcfda67
--- /dev/null
+++ b/src/assets/logout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/menu.svg b/src/assets/menu.svg
new file mode 100644
index 00000000..7daca0c6
--- /dev/null
+++ b/src/assets/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/mobile.svg b/src/assets/mobile.svg
new file mode 100644
index 00000000..eeb07c3f
--- /dev/null
+++ b/src/assets/mobile.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/musical-note.svg b/src/assets/musical-note.svg
new file mode 100644
index 00000000..9a5f839f
--- /dev/null
+++ b/src/assets/musical-note.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/nodejs.svg b/src/assets/nodejs.svg
new file mode 100644
index 00000000..04c82d13
--- /dev/null
+++ b/src/assets/nodejs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/pause.svg b/src/assets/pause.svg
new file mode 100644
index 00000000..e99b59c1
--- /dev/null
+++ b/src/assets/pause.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/play-circle-outline.svg b/src/assets/play-circle-outline.svg
new file mode 100644
index 00000000..46ddf642
--- /dev/null
+++ b/src/assets/play-circle-outline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/play-circle.svg b/src/assets/play-circle.svg
new file mode 100644
index 00000000..1228a2ba
--- /dev/null
+++ b/src/assets/play-circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/play.svg b/src/assets/play.svg
new file mode 100644
index 00000000..72978d4c
--- /dev/null
+++ b/src/assets/play.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/plus.svg b/src/assets/plus.svg
new file mode 100644
index 00000000..0bc3d64b
--- /dev/null
+++ b/src/assets/plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/react.svg b/src/assets/react.svg
new file mode 100644
index 00000000..8fc39c4b
--- /dev/null
+++ b/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/right-circle.svg b/src/assets/right-circle.svg
new file mode 100644
index 00000000..affb50ee
--- /dev/null
+++ b/src/assets/right-circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/right.svg b/src/assets/right.svg
new file mode 100644
index 00000000..91e88631
--- /dev/null
+++ b/src/assets/right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/search.svg b/src/assets/search.svg
new file mode 100644
index 00000000..c415d0bc
--- /dev/null
+++ b/src/assets/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/stop.svg b/src/assets/stop.svg
new file mode 100644
index 00000000..045d338e
--- /dev/null
+++ b/src/assets/stop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/tablet.svg b/src/assets/tablet.svg
new file mode 100644
index 00000000..0289d633
--- /dev/null
+++ b/src/assets/tablet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/up.svg b/src/assets/up.svg
new file mode 100644
index 00000000..dce0e43d
--- /dev/null
+++ b/src/assets/up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/video-off.svg b/src/assets/video-off.svg
new file mode 100644
index 00000000..9c8b9c57
--- /dev/null
+++ b/src/assets/video-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/video.svg b/src/assets/video.svg
new file mode 100644
index 00000000..42fe6f79
--- /dev/null
+++ b/src/assets/video.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/Alert/Alert.module.scss b/src/components/Alert/Alert.module.scss
new file mode 100644
index 00000000..daf1cd4b
--- /dev/null
+++ b/src/components/Alert/Alert.module.scss
@@ -0,0 +1,95 @@
+.alert {
+ width: 270px;
+ padding: 0;
+ border-radius: 12px;
+
+ & {
+ color: #000;
+ background: #f0f0f0;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #fff;
+ background: #232323;
+ }
+ }
+
+ & > h1 {
+ padding: 12px 16px 7px;
+ margin: 8px 0 0 0;
+ font-size: 17px;
+ font-weight: 600;
+ text-align: center;
+ }
+
+ & > p {
+ padding: 0 16px 21px;
+ margin: 0;
+ text-align: center;
+ font-size: 13px;
+ }
+
+ & > .button-group {
+ display: flex;
+ justify-content: flex-start;
+ margin: 0;
+
+ & {
+ border-top: 0.55px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ border-top: 0.55px solid #2d2d2f;
+ }
+ }
+
+ & > button {
+ display: inline-block;
+ width: 50%;
+ height: 44px;
+ margin: 0;
+ padding: 6px 18px;
+ border: none;
+ font-size: 17px;
+ cursor: pointer;
+ outline: none;
+
+ & {
+ background: #f0f0f0;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #232323;
+ }
+ }
+
+ &:first-child {
+ border-radius: 0 0 0 12px;
+ color: #488aff;
+ font-weight: 600;
+
+ & {
+ border-right: 0.55px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ border-right: 0.55px solid #2d2d2f;
+ }
+ }
+ }
+ &:last-child {
+ border-radius: 0 0 12px 0;
+ color: #f53d3d;
+ }
+
+ &:hover {
+ background: #dedede;
+ }
+ @media (prefers-color-scheme: dark) {
+ &:hover {
+ background: #434345;
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/Alert/Alert.tsx b/src/components/Alert/Alert.tsx
new file mode 100644
index 00000000..2e9be2c9
--- /dev/null
+++ b/src/components/Alert/Alert.tsx
@@ -0,0 +1,36 @@
+import styles from './Alert.module.scss'
+import './react-confirm-alert.css'
+
+export const Alert = ({
+ title,
+ message,
+ confirmButtonLabel = '確認',
+ cancelButtonLabel = 'キャンセル',
+ onConfirm,
+ onClose,
+}: {
+ title: string
+ message: string
+ confirmButtonLabel?: string
+ cancelButtonLabel?: string
+ onConfirm: () => void
+ onClose: () => void
+}) => {
+ return (
+
+
{title}
+
{message}
+
+
+
+
+
+ )
+}
diff --git a/src/components/Alert/react-confirm-alert.css b/src/components/Alert/react-confirm-alert.css
new file mode 100644
index 00000000..d8f61987
--- /dev/null
+++ b/src/components/Alert/react-confirm-alert.css
@@ -0,0 +1,117 @@
+body.react-confirm-alert-body-element {
+ overflow: hidden;
+}
+
+.react-confirm-alert-blur {
+ filter: url(#gaussian-blur);
+ filter: blur(2px);
+ -webkit-filter: blur(2px);
+}
+
+.react-confirm-alert-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 99;
+ background: rgba(0, 0, 0, 0.3);
+ display: -webkit-flex;
+ display: -moz-flex;
+ display: -ms-flex;
+ display: -o-flex;
+ display: flex;
+ justify-content: center;
+ -ms-align-items: center;
+ align-items: center;
+ opacity: 1;
+ /* -webkit-animation: react-confirm-alert-fadeIn 0.5s 0.2s forwards; */
+ /* -moz-animation: react-confirm-alert-fadeIn 0.5s 0.2s forwards; */
+ /* -o-animation: react-confirm-alert-fadeIn 0.5s 0.2s forwards; */
+ /* animation: react-confirm-alert-fadeIn 0.5s 0.2s forwards; */
+}
+
+.react-confirm-alert-body {
+ font-family: Arial, Helvetica, sans-serif;
+ width: 400px;
+ padding: 30px;
+ text-align: left;
+ background: #fff;
+ border-radius: 10px;
+ box-shadow: 0 20px 75px rgba(0, 0, 0, 0.13);
+ color: #666;
+}
+
+.react-confirm-alert-svg {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+.react-confirm-alert-body > h1 {
+ margin-top: 0;
+}
+
+.react-confirm-alert-body > h3 {
+ margin: 0;
+ font-size: 16px;
+}
+
+.react-confirm-alert-button-group {
+ display: -webkit-flex;
+ display: -moz-flex;
+ display: -ms-flex;
+ display: -o-flex;
+ display: flex;
+ justify-content: flex-start;
+ margin-top: 20px;
+}
+
+.react-confirm-alert-button-group > button {
+ outline: none;
+ background: #333;
+ border: none;
+ display: inline-block;
+ padding: 6px 18px;
+ color: #eee;
+ margin-right: 10px;
+ border-radius: 5px;
+ font-size: 12px;
+ cursor: pointer;
+}
+
+@-webkit-keyframes react-confirm-alert-fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@-moz-keyframes react-confirm-alert-fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@-o-keyframes react-confirm-alert-fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes react-confirm-alert-fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
diff --git a/src/components/ContentsBox/ContentsBox.module.scss b/src/components/ContentsBox/ContentsBox.module.scss
new file mode 100644
index 00000000..a584b19c
--- /dev/null
+++ b/src/components/ContentsBox/ContentsBox.module.scss
@@ -0,0 +1,279 @@
+.box {
+ margin: 32px 0 32px 0;
+
+ &.no-margin-top {
+ margin-top: 0;
+ }
+
+ & {
+ background: #fff;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #1c1c1e;
+ }
+ }
+
+ &.pc {
+ .title-frame > label {
+ padding: 8px 16px;
+ font-size: 20px;
+ }
+
+ .text {
+ padding: 16px;
+ font-size: 1rem;
+ }
+
+ .link ul li a .inner {
+ padding-left: 16px;
+ }
+
+ .link ul li .disabled-link .inner {
+ padding-left: 16px;
+ }
+
+ .link ul li .link-button .inner {
+ padding-left: 16px;
+ }
+
+ .back-link ul li a .inner {
+ padding-left: 16px;
+ }
+ }
+
+ &.mobile {
+ & {
+ border-top: 0.55px solid #cbcbcd;
+ border-bottom: 0.55px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ border-top: 0.55px solid #2d2d2f;
+ border-bottom: 0.55px solid #2d2d2f;
+ }
+ }
+ }
+
+ .link {
+ font-size: 1rem;
+
+ ul {
+ margin: 0;
+ padding: 0;
+
+ li {
+ list-style: none;
+
+ a {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #333;
+
+ &:hover {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #ccc;
+
+ &:hover {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+ }
+
+ &.link {
+ cursor: pointer;
+ }
+
+ .inner {
+ padding-left: 12px;
+ cursor: pointer;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ span {
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ i {
+ padding-right: 12px;
+ color: #666;
+ font-size: 1.2rem;
+ }
+ }
+
+ .disabled-link {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #ccc;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #333;
+ }
+ }
+
+ .inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ cursor: default;
+
+ span {
+ // margin: 11px 8px 11px 0;
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ i {
+ padding-right: 12px;
+ color: #eee;
+ font-size: 1.2rem;
+ }
+
+ svg {
+ fill: #eee;
+
+ & {
+ fill: #eee;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ fill: #333;
+ }
+ }
+ }
+ }
+ }
+
+ .link-button {
+ cursor: pointer;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ & {
+ color: #333;
+
+ &:hover {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #ccc;
+
+ &:hover {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+ span {
+ line-height: 44px;
+ font-size: 16px;
+ }
+ }
+ }
+ }
+ }
+
+ &.back-to-home {
+ padding: 0;
+ }
+
+ .back-link {
+ font-size: 1rem;
+ line-height: 1.6;
+
+ ul {
+ margin: 0;
+ padding: 0;
+
+ li {
+ list-style: none;
+
+ a {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #333;
+
+ &:hover {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #ccc;
+
+ &:hover {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+
+ .inner {
+ padding-left: 12px;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+
+ span {
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ i {
+ padding-right: 8px;
+ color: #666;
+ font-size: 1.2rem;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/ContentsBox/ContentsBox.tsx b/src/components/ContentsBox/ContentsBox.tsx
new file mode 100644
index 00000000..726d3d84
--- /dev/null
+++ b/src/components/ContentsBox/ContentsBox.tsx
@@ -0,0 +1,9 @@
+import type { ReactNode } from 'react'
+import clsx from 'clsx'
+import { useStyle } from '../../utilities/useStyle'
+import styles from './ContentsBox.module.scss'
+
+export const ContentsBox = ({ children, withLabel }: { children: ReactNode; withLabel?: boolean }) => {
+ const pc = useStyle()
+ return
{children}
+}
diff --git a/src/components/ContentsBox/Loading.module.scss b/src/components/ContentsBox/Loading.module.scss
new file mode 100644
index 00000000..978edc17
--- /dev/null
+++ b/src/components/ContentsBox/Loading.module.scss
@@ -0,0 +1,59 @@
+.loading {
+ padding: 28px 0;
+ margin: 0 auto;
+ width: 60px;
+ display: flex;
+ justify-content: space-between;
+}
+
+.loading > div {
+ width: 16px;
+ height: 16px;
+ background-color: #ccc;
+
+ border-radius: 100%;
+ display: inline-block;
+ -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
+ animation: sk-bouncedelay 1.4s infinite ease-in-out both;
+}
+
+.loading .loading1 {
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s;
+}
+
+.loading .loading2 {
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s;
+}
+
+@keyframes sk-bouncedelay {
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+.full-loading {
+ width: 100vw;
+ height: 100vh;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background: #efeff4;
+
+ & {
+ background: #efeff4;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #1c1c1e;
+ }
+ }
+}
diff --git a/src/components/ContentsBox/Loading.tsx b/src/components/ContentsBox/Loading.tsx
new file mode 100644
index 00000000..4b324612
--- /dev/null
+++ b/src/components/ContentsBox/Loading.tsx
@@ -0,0 +1,24 @@
+import { ContentsBox } from './ContentsBox'
+import styles from './Loading.module.scss'
+
+export const Loading = () => (
+
+)
+
+export const FullScreenLoading = () => {
+ return (
+
+
+
+ )
+}
+
+export const ContentsLoading = () => (
+
+
+
+)
diff --git a/src/components/ContentsBox/Text.module.scss b/src/components/ContentsBox/Text.module.scss
new file mode 100644
index 00000000..a548eb6d
--- /dev/null
+++ b/src/components/ContentsBox/Text.module.scss
@@ -0,0 +1,14 @@
+.text {
+ padding: 12px;
+ font-size: 0.9rem;
+
+ &.pc {
+ padding: 16px;
+ font-size: 1rem;
+ }
+
+ p {
+ margin: 0;
+ padding: 0;
+ }
+}
diff --git a/src/components/ContentsBox/Text.tsx b/src/components/ContentsBox/Text.tsx
new file mode 100644
index 00000000..c61a1dfe
--- /dev/null
+++ b/src/components/ContentsBox/Text.tsx
@@ -0,0 +1,9 @@
+import type { ReactNode } from 'react'
+import clsx from 'clsx'
+import { useStyle } from '../../utilities/useStyle'
+import styles from './Text.module.scss'
+
+export const Text = ({ children }: { children: ReactNode }) => {
+ const pc = useStyle()
+ return
{children}
+}
diff --git a/src/components/ContentsBox/TitleFrame.module.scss b/src/components/ContentsBox/TitleFrame.module.scss
new file mode 100644
index 00000000..1ba97a41
--- /dev/null
+++ b/src/components/ContentsBox/TitleFrame.module.scss
@@ -0,0 +1,37 @@
+.title-frame {
+ & > label {
+ display: block;
+ padding: 0 12px;
+ font-size: 18px;
+ letter-spacing: 0.1rem;
+
+ &.pc {
+ padding: 8px 16px;
+ font-size: 20px;
+ }
+
+ & {
+ background: #fff;
+ border-bottom: 0.55px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #1c1c1e;
+ border-bottom: 0.55px solid #2d2d2f;
+ }
+ }
+
+ line-height: 44px;
+ }
+
+ &.border-bottom {
+ & {
+ border-bottom: 0.55px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ border-bottom: 0.55px solid #2d2d2f;
+ }
+ }
+ }
+}
diff --git a/src/components/ContentsBox/TitleFrame.tsx b/src/components/ContentsBox/TitleFrame.tsx
new file mode 100644
index 00000000..fd2189d2
--- /dev/null
+++ b/src/components/ContentsBox/TitleFrame.tsx
@@ -0,0 +1,22 @@
+import type { ReactNode } from 'react'
+import clsx from 'clsx'
+import { useStyle } from '../../utilities/useStyle'
+import styles from './TitleFrame.module.scss'
+
+export const TitleFrame = ({
+ title,
+ borderBottom,
+ children,
+}: {
+ title?: string | ReactNode
+ borderBottom?: boolean
+ children: ReactNode
+}) => {
+ const pc = useStyle()
+ return (
+
+ {title && }
+ {children}
+
+ )
+}
diff --git a/src/components/ContentsBox/index.ts b/src/components/ContentsBox/index.ts
new file mode 100644
index 00000000..e6f2c539
--- /dev/null
+++ b/src/components/ContentsBox/index.ts
@@ -0,0 +1,4 @@
+export * from './ContentsBox'
+export * from './Text'
+export * from './TitleFrame'
+export * from './Loading'
diff --git a/src/components/Form/Button.module.scss b/src/components/Form/Button.module.scss
new file mode 100644
index 00000000..dd3859ec
--- /dev/null
+++ b/src/components/Form/Button.module.scss
@@ -0,0 +1,42 @@
+.button {
+ display: block;
+ width: 100%;
+ height: 44px;
+ padding: 6px 18px;
+ border: none;
+ border-radius: 4px;
+ background: rgba(182, 0, 5, 0.6);
+ color: #fff;
+ font-size: 14px;
+ cursor: pointer;
+ outline: none;
+ transition: all ease-in-out 0.2s;
+
+ &:hover,
+ &:active,
+ &:focus {
+ background: rgba(182, 0, 5, 0.8);
+ transition: all ease-in-out 0.1s;
+ color: #fff;
+ }
+
+ &:active,
+ &:focus {
+ box-shadow: 0 0 0 0.2rem rgba(182, 0, 5, 0.25);
+ }
+
+ &:disabled {
+ cursor: default;
+
+ & {
+ color: #888;
+ background: #f8f8f8;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #888;
+ background: #333;
+ }
+ }
+ }
+}
diff --git a/src/components/Form/Button.tsx b/src/components/Form/Button.tsx
new file mode 100644
index 00000000..9f8c02a7
--- /dev/null
+++ b/src/components/Form/Button.tsx
@@ -0,0 +1,15 @@
+import { ButtonHTMLAttributes, forwardRef } from 'react'
+import styles from './Button.module.scss'
+
+type ButtonProps = ButtonHTMLAttributes
& { isLoading?: boolean }
+
+export const Button = forwardRef(
+ ({ type = 'button', isLoading = false, ...props }, ref) => {
+ const { children, ...rest } = props
+ return (
+
+ )
+ }
+)
diff --git a/src/components/Form/Form.tsx b/src/components/Form/Form.tsx
new file mode 100644
index 00000000..52539344
--- /dev/null
+++ b/src/components/Form/Form.tsx
@@ -0,0 +1,28 @@
+import { ReactNode, useEffect } from 'react'
+import { useForm, SubmitHandler, UseFormReturn, UseFormProps } from 'react-hook-form'
+import type { ZodType, ZodTypeDef } from 'zod'
+import { zodResolver } from '@hookform/resolvers/zod'
+
+export const Form = <
+ TFieldValues extends Record = Record,
+ ValidationScheme extends ZodType = ZodType
+>({
+ onSubmit,
+ children,
+ options,
+ validationScheme,
+}: {
+ onSubmit: SubmitHandler
+ children: (methods: UseFormReturn) => ReactNode
+ options?: UseFormProps
+ validationScheme?: ValidationScheme
+}) => {
+ const methods = useForm({ ...options, resolver: validationScheme && zodResolver(validationScheme) })
+ const { formState, reset } = methods
+ useEffect(() => {
+ if (formState.isSubmitSuccessful) {
+ reset()
+ }
+ }, [formState.isSubmitSuccessful, reset])
+ return
+}
diff --git a/src/components/Form/Input.module.scss b/src/components/Form/Input.module.scss
new file mode 100644
index 00000000..ff90e53b
--- /dev/null
+++ b/src/components/Form/Input.module.scss
@@ -0,0 +1,105 @@
+.input {
+ label {
+ display: block;
+ margin: 12px 0 2px;
+ font-size: 14px;
+ }
+
+ input {
+ display: block;
+ width: calc(100% - 30px - 2px);
+ margin: 0 0 12px 0;
+ padding: 10px 15px;
+ border-radius: 4px;
+ font-size: 16px;
+
+ font-family: -apple-system, BlinkMacSystemFont, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', '游ゴシック Medium',
+ meiryo, sans-serif;
+
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none;
+
+ & {
+ color: #333;
+ background: #fff;
+ border: 1px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #fff;
+ background: #222;
+ border: 1px solid #333;
+ }
+ }
+
+ &:focus {
+ border: solid 1px rgba(182, 0, 5, 1);
+ box-shadow: 0 0 0 0.2rem rgba(182, 0, 5, 0.25);
+ outline: 0;
+ }
+
+ &:active {
+ border: solid 1px rgba(182, 0, 5, 1);
+ }
+ }
+
+ input:focus,
+ input[type='password']:focus {
+ border: solid 1px rgba(182, 0, 5, 0.6);
+ outline: 0;
+ }
+
+ .error {
+ margin: 2px 0 12px;
+ padding: 12px;
+ border-radius: 4px;
+ font-size: 14px;
+ color: #f0506e;
+
+ & {
+ color: #f0506e;
+ background: #fef4f6;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: hsl(349, 84%, 43%);
+ background: #333;
+ }
+ }
+ }
+}
+
+.input {
+ textarea {
+ -webkit-appearance: none;
+ display: block;
+ width: calc(100% - 20px - 2px);
+ height: 6em;
+ margin: 0 auto;
+ padding: 8px 10px;
+ border-radius: 0.25rem;
+ font-size: 17px;
+ font-family: -apple-system, BlinkMacSystemFont, 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', '游ゴシック Medium',
+ meiryo, sans-serif;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+
+ & {
+ color: #333;
+ background: #fff;
+ border: 1px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #fff;
+ background: #222;
+ border: 1px solid #333;
+ }
+ }
+
+ &:focus {
+ border: solid 1px rgba(182, 0, 5, 0.6);
+ box-shadow: 0 0 0 0.2rem rgba(182, 0, 5, 0.25);
+ outline: 0;
+ }
+ }
+}
diff --git a/src/components/Form/Input.tsx b/src/components/Form/Input.tsx
new file mode 100644
index 00000000..24c294be
--- /dev/null
+++ b/src/components/Form/Input.tsx
@@ -0,0 +1,36 @@
+import type { FieldError, UseFormRegisterReturn } from 'react-hook-form'
+import styles from './Input.module.scss'
+
+type FormInfo = {
+ label: string
+ error?: FieldError
+}
+
+type InputProps = FormInfo & {
+ type: 'text' | 'password'
+ registration: Partial
+}
+
+export const Input = ({ type, registration, label, error }: InputProps) => {
+ return (
+
+
+
+ {error?.message &&
{error.message}
}
+
+ )
+}
+
+type TextareaProps = FormInfo & {
+ registration: Partial
+}
+
+export const Textarea = ({ registration, label, error }: TextareaProps) => {
+ return (
+
+
+
+ {error?.message &&
{error.message}
}
+
+ )
+}
diff --git a/src/components/Form/index.ts b/src/components/Form/index.ts
new file mode 100644
index 00000000..0626cfec
--- /dev/null
+++ b/src/components/Form/index.ts
@@ -0,0 +1,3 @@
+export * from './Form'
+export * from './Input'
+export * from './Button'
diff --git a/client/src/Component/Auth/Component/NavigationHeader/NavigationHeader.scss b/src/components/Layout/Header.module.scss
similarity index 52%
rename from client/src/Component/Auth/Component/NavigationHeader/NavigationHeader.scss
rename to src/components/Layout/Header.module.scss
index 59d855aa..cef3098e 100644
--- a/client/src/Component/Auth/Component/NavigationHeader/NavigationHeader.scss
+++ b/src/components/Layout/Header.module.scss
@@ -5,8 +5,6 @@
position: fixed;
height: 44px;
width: 100%;
- // max-width: 920px;
- // border-bottom: 1px solid #ccc;
border-bottom: 0.5px solid #cbcbcd;
text-align: center;
z-index: 20;
@@ -29,10 +27,6 @@
border: 0;
}
- &.font {
- // font-family: "kan48typos-std",sans-serif;
- }
-
display: flex;
justify-content: center;
align-items: center;
@@ -50,33 +44,23 @@
.logo {
width: calc(100% - 44px);
- // width: 100%;
height: 36px;
- // width: 80%;
overflow: hidden;
svg {
+ width: calc(100% - 44px);
+ height: 36px;
+ overflow: hidden;
fill: #b60005;
}
-
- // p {
- // margin: 0;
- // font-weight: bold;
- // overflow: hidden;
- // text-overflow: ellipsis;
- // white-space: nowrap;
- // }
}
}
.label {
position: fixed;
- // top: 0;
left: 0;
width: 44px;
height: 44px;
- // color: #0D5783;
- // color: #488aff;
color: #b60005;
z-index: 21;
cursor: pointer;
@@ -85,13 +69,17 @@
justify-content: center;
align-items: center;
+ &.menu {
+ svg {
+ width: 26px;
+ height: 26px;
+ }
+ }
+
&.back {
- // left: 8px;
width: auto;
a {
- // color: #054469;
- // color: #488aff;
color: #b60005;
text-decoration: none;
@@ -117,15 +105,10 @@
left: -6px;
font-size: 17px;
}
-
- // &:hover, &:active {
- // color: #f65a5f;
- // }
}
}
&.home-navigation {
- // top: 0;
left: auto;
right: 0;
@@ -138,6 +121,11 @@
display: flex;
justify-content: center;
align-items: center;
+
+ svg {
+ width: 16px;
+ fill: #b60005;
+ }
}
}
}
@@ -152,7 +140,6 @@
height: 100vh;
background: black;
opacity: 0;
- // -webkit-transition: opacity .6s ease-in-out;
transition: 0.3s ease-in-out;
&.open {
@@ -169,11 +156,6 @@
opacity: 0.35;
}
}
-
- // .hoge.show{
- // display: block;
- // animation: show 1s linear 0s;
- // }
}
.menu-content {
@@ -196,105 +178,5 @@
transform: translate3d(0%, 0, 0);
box-shadow: 6px 0 25px rgba(0, 0, 0, 0.15);
}
-
- // .account-info {
- // position: -webkit-sticky;
- // position: sticky;
- // top: 0;
- // width: calc(100% - 8px);
- // padding: 4px;
- // background: #fff;
-
- // display: flex;
- // align-items: center;
-
- // img {
- // display: block;
- // width: 60px;
- // height: 60px;
- // // margin: 5px 0 0 5px;
- // border-radius: 50%;
- // }
-
- // span {
- // // flex: 2;
- // display: block;
- // margin-left: 8px;
- // color: #333;
- // font-size: 24px;
- // font-family: "ten-mincho",serif;
- // }
- // }
-
- // ol {
- // margin: 6px 0;
- // padding: 0;
- // list-style: none;
- // line-height: 48px;
-
- // a {
- // color: #333;
- // text-decoration: none;
-
- // &:hover, &:active {
- // background: #ccc;
- // }
-
- // div {
- // padding: 0 0 0 8px;
-
- // i {
- // display: inline-block;
- // width: 40px;
- // color: #666;
- // font-size: 1.2em;
- // text-align: center;
- // }
- // }
- // }
-
- // .link {
- // padding: 0;
- // color: #333;
- // text-decoration: none;
- // cursor: pointer;
-
- // &:hover {
- // background: #efefef;
- // }
-
- // &:active {
- // background: #eee;
- // }
-
- // div {
- // padding: 0 0 0 8px;
-
- // i {
- // display: inline-block;
- // width: 40px;
- // color: #666;
- // font-size: 1.2em;
- // text-align: center;
- // }
- // }
- // }
-
- // .active {
- // background: #eee;
-
- // a {
-
- // &:hover {
- // background: #ccc;
- // }
-
- // &:active {
- // background: #ccc;
- // }
- // }
- // }
-
- // }
}
}
diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx
new file mode 100644
index 00000000..a98d1349
--- /dev/null
+++ b/src/components/Layout/Header.tsx
@@ -0,0 +1,127 @@
+import { useState } from 'react'
+import clsx from 'clsx'
+import { Link, useMatch } from 'react-router-dom'
+import { useStyle } from '../../utilities/useStyle'
+import styles from './Header.module.scss'
+import { ReactComponent as WindsLogo } from '../../assets/logo.svg'
+import { ReactComponent as HomeIcon } from '../../assets/home.svg'
+import { ReactComponent as MenuIcon } from '../../assets/menu.svg'
+import { ReactComponent as BackIcon } from '../../assets/left.svg'
+import { MenuContents } from './MenuContents'
+
+type PreviousPage = {
+ isMatch: boolean
+ path: string
+}
+
+export const Header = ({ title }: { title: string | null }) => {
+ const pc = useStyle()
+ const [menuOpen, setMenuOpen] = useState(false)
+
+ const PREVIOUS_PAGE_MAP: PreviousPage[] = [
+ { isMatch: !!useMatch('/practice'), path: '/' },
+ { isMatch: !!useMatch('/practice/source'), path: '/practice' },
+ { isMatch: !!useMatch('/practice/history'), path: '/practice' },
+ { isMatch: !!useMatch('/manager'), path: '/' },
+ { isMatch: !!useMatch('/bbs'), path: '/' },
+ { isMatch: !!useMatch('/bbs/post'), path: '/bbs' },
+ { isMatch: !!useMatch('/archive'), path: '/' },
+ { isMatch: !!useMatch('/archive/overview/:concertId'), path: '/archive' },
+ {
+ isMatch: !!useMatch('/archive/photo/:concertId'),
+ path: '/archive/overview/' + useMatch('/archive/photo/:concertId')?.params.concertId,
+ },
+ {
+ isMatch: !!useMatch('/archive/video/:concertId'),
+ path: '/archive/overview/' + useMatch('/archive/video/:concertId')?.params.concertId,
+ },
+ { isMatch: !!useMatch('/score'), path: '/' },
+ { isMatch: !!useMatch('/score/detail/:id'), path: '/score' },
+ { isMatch: !!useMatch('/score/box'), path: '/score' },
+ { isMatch: !!useMatch('/setting'), path: '/' },
+ { isMatch: !!useMatch('/setting/name'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/email'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/valid/:key'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/password'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/session'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/admin'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/delete'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/score/mail'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/score/admin'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/terms'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/about'), path: '/setting' },
+ { isMatch: !!useMatch('/setting/license'), path: '/setting' },
+ ]
+ const previousPage = PREVIOUS_PAGE_MAP.find((value) => value.isMatch) ?? null
+
+ return (
+
+
+ {title &&
{title}
}
+ {!title && (
+
+
+
+ )}
+
setMenuOpen(true)} />
+
+
+
setMenuOpen(false)}
+ >
+
+ setMenuOpen(false)} />
+
+
+ )
+}
+
+const LeftNavigations = ({
+ previousPage,
+ onMenuOpen,
+}: {
+ previousPage: PreviousPage | null
+ onMenuOpen: () => void
+}) => {
+ const pc = useStyle()
+
+ return (
+ <>
+ {pc === 'mobile' && previousPage && (
+ <>
+
+ >
+ )}
+ {pc === 'mobile' && !previousPage && (
+
+
+
+ )}
+ >
+ )
+}
+
+const RightNavigations = () => {
+ const pc = useStyle()
+ const isMatch = !!useMatch('/')
+
+ if (pc === 'pc' || isMatch) {
+ return null
+ }
+
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/components/Layout/Layout.module.scss b/src/components/Layout/Layout.module.scss
new file mode 100644
index 00000000..cc5a7197
--- /dev/null
+++ b/src/components/Layout/Layout.module.scss
@@ -0,0 +1,231 @@
+.auth {
+ & {
+ color: #333;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #eee;
+ }
+ }
+
+ .contents {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: block;
+ margin: 44.5px 0 0 0;
+
+ z-index: 1;
+
+ // transform: translateZ(0); // Retinaスクロール対策
+
+ margin-top: calc(constant(safe-area-inset-top) + 44.5px);
+ // margin-bottom: constant(safe-area-inset-bottom);
+ margin-left: constant(safe-area-inset-left);
+ margin-right: constant(safe-area-inset-right);
+
+ margin-top: calc(env(safe-area-inset-top) + 44.5px);
+ // margin-bottom: env(safe-area-inset-bottom);
+ margin-left: env(safe-area-inset-left);
+ margin-right: env(safe-area-inset-right);
+
+ // background: rgba(220,220,220,.2);
+ // background: #efeff4;
+ // background: #f3f2f8;
+ // background: rgb(230, 236, 240);
+
+ & {
+ background: #efeff4;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #000;
+ }
+ }
+
+ &.pc {
+ margin: 61px 0 0 0;
+ }
+ }
+
+ .contents-inner {
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ -webkit-overflow-scrolling: touch;
+ overflow-scrolling: touch;
+ // Chromeだけっぽい
+ // scroll-behavior: smooth;
+ will-change: scroll-position;
+ contain: size style layout;
+ // transform: translateZ(0); // Retinaスクロール対策
+ }
+
+ .flex-frame {
+ // menu: 240px, contents: 900px, margin: 16px * 4
+ max-width: 1204px;
+ margin: 0 auto;
+
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: flex-start;
+ }
+
+ // pcモードのとき追加
+ .inline-contents {
+ width: 900px;
+ min-width: 0; // 長いテキストを表示したときに要素を可変にするため
+ margin: 36px 16px 36px;
+ }
+
+ // mobileモードのとき追加
+ .full-contents {
+ margin: 32px 0;
+ }
+}
+
+.contents-layout {
+ width: 100%;
+ margin: 0 auto;
+}
+
+.contents-header {
+ margin: 0;
+ padding: 12px 0;
+
+ & {
+ background: #fff;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #1c1c1e;
+ }
+ }
+
+ &.pc {
+ padding: 16px 0;
+
+ .bread-navigation {
+ padding: 0 16px;
+ font-size: 13px;
+ }
+
+ h2 {
+ padding: 0 16px;
+ }
+
+ p {
+ padding: 0 16px;
+ }
+ }
+
+ &.mobile {
+ & {
+ border-top: 0.55px solid #cbcbcd;
+ border-bottom: 0.55px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ border-top: 0.55px solid #2d2d2f;
+ border-bottom: 0.55px solid #2d2d2f;
+ }
+ }
+ }
+
+ .bread-navigation {
+ padding: 0 12px;
+ font-size: 12px;
+ color: #888;
+ display: flex;
+ align-items: center;
+
+ & {
+ color: #888;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #777;
+ }
+ }
+
+ a {
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: underline;
+ }
+
+ & {
+ color: #888;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #777;
+ }
+ }
+ }
+
+ svg {
+ width: 14px;
+ height: 14px;
+ padding: 0 0.6em;
+ font-size: 10px;
+
+ & {
+ svg {
+ fill: #888;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ svg {
+ fill: #777;
+ }
+ }
+ }
+ }
+
+ span {
+ & {
+ color: #666;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #999;
+ }
+ }
+ }
+ }
+
+ h2 {
+ margin: 8px 0;
+ padding: 0 12px;
+ font-size: 16px;
+ font-weight: normal;
+ }
+
+ p {
+ margin: 0;
+ padding: 0 12px;
+ font-size: 0.9rem;
+ }
+}
+
+.menu-contents-inline {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 36px;
+ margin: 36px 16px 16px;
+ width: 240px;
+ background: #ccc;
+}
+
+footer {
+ width: 100%;
+ margin: 48px 0;
+ text-align: center;
+ color: #888;
+}
diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx
new file mode 100644
index 00000000..f394f016
--- /dev/null
+++ b/src/components/Layout/Layout.tsx
@@ -0,0 +1,88 @@
+import { Fragment, ReactNode } from 'react'
+import { Link } from 'react-router-dom'
+import clsx from 'clsx'
+
+import { useStyle } from '../../utilities/useStyle'
+import { Header } from './Header'
+import { MenuContents } from './MenuContents'
+import { ReactComponent as RightIcon } from '../../assets/right.svg'
+
+import styles from './Layout.module.scss'
+
+type BreadItem = {
+ path: string
+ label: string
+ isLoading?: boolean
+}
+
+type LayoutProps = {
+ breadList: BreadItem[]
+ title: string
+ subTitle?: string | ReactNode
+ mobileTitle?: string | null
+ children: ReactNode
+}
+
+export const Layout = (props: LayoutProps) => {
+ const pc = useStyle()
+ const { mobileTitle, title } = props
+ return (
+
+ )
+}
+
+const NavigationInline = () => {
+ const pc = useStyle()
+ if (pc === 'mobile') {
+ return null
+ }
+ return (
+
+
+
+ )
+}
+
+const ContentsLayout = ({ breadList, title, subTitle, children }: LayoutProps) => {
+ const pc = useStyle()
+ return (
+
+
+
+ {breadList.map((breadItem, index, array) => {
+ return (
+
+ {breadItem.isLoading && <>読み込み中>}
+ {!breadItem.isLoading && {breadItem.label}}
+ {array.length - 1 !== index && }
+
+ )
+ })}
+
+
{title}
+ {subTitle && typeof subTitle === 'string' &&
{subTitle}
}
+ {subTitle && typeof subTitle !== 'string' && subTitle}
+
+ {children}
+
+ )
+}
+
+const Footer = () => (
+
+)
diff --git a/client/src/Component/Auth/Component/NavigationMenuContents/NavigationMenuContents.scss b/src/components/Layout/MenuContents.module.scss
similarity index 89%
rename from client/src/Component/Auth/Component/NavigationMenuContents/NavigationMenuContents.scss
rename to src/components/Layout/MenuContents.module.scss
index e7c0ce7a..57dd5c8e 100644
--- a/client/src/Component/Auth/Component/NavigationMenuContents/NavigationMenuContents.scss
+++ b/src/components/Layout/MenuContents.module.scss
@@ -27,12 +27,6 @@
width: 240px;
}
- // &.open {
- // -webkit-transform: translateX(0%);
- // transform: translateX(0%);
- // box-shadow: 6px 0 25px rgba(0,0,0,.15);
- // }
-
.app-info {
position: -webkit-sticky;
position: sticky;
@@ -78,7 +72,6 @@
display: none;
width: 60px;
height: 60px;
- // margin: 5px 0 0 5px;
border-radius: 50%;
@media (prefers-color-scheme: dark) {
@@ -89,12 +82,10 @@
}
span {
- // flex: 2;
display: block;
margin-left: 8px;
color: #333;
font-size: 20px;
- // font-family: "ten-mincho",serif;
& {
color: #333;
@@ -128,10 +119,10 @@
div {
padding: 0 0 0 1em;
- i {
+ svg {
display: inline-block;
width: 40px;
- color: #666;
+ fill: #666;
font-size: 1.2em;
text-align: center;
}
@@ -139,6 +130,7 @@
}
.link {
+ display: block;
padding: 0;
text-decoration: none;
cursor: pointer;
@@ -169,19 +161,19 @@
div {
padding: 0 0 0 1em;
+ display: flex;
- i {
- display: inline-block;
- width: 40px;
+ svg {
+ width: 24px;
font-size: 1.2em;
text-align: center;
& {
- color: #666;
+ fill: #666;
}
@media (prefers-color-scheme: dark) {
& {
- color: #aaa;
+ fill: #aaa;
}
}
}
diff --git a/src/components/Layout/MenuContents.tsx b/src/components/Layout/MenuContents.tsx
new file mode 100644
index 00000000..cdd34e6f
--- /dev/null
+++ b/src/components/Layout/MenuContents.tsx
@@ -0,0 +1,73 @@
+import { NavLink } from 'react-router-dom'
+import clsx from 'clsx'
+import { confirmAlert } from 'react-confirm-alert'
+import { ReactComponent as Logo } from '../../assets/hr.svg'
+import { ReactComponent as LogoutIcon } from '../../assets/logout.svg'
+import styles from './MenuContents.module.scss'
+import { useStyle } from '../../utilities/useStyle'
+import { useAuth } from '../../library/auth'
+import { LogoutAlert } from '../Logout/LogoutAlert'
+
+const menuList = [
+ { label: 'ホーム', path: '/' },
+ { label: '練習について', path: '/practice' },
+ { label: 'お知らせ', path: '/manager' },
+ { label: '掲示板', path: '/bbs' },
+ { label: 'アーカイブ', path: '/archive' },
+ { label: 'ウィンズスコア', path: '/score' },
+ { label: '設定', path: '/setting' },
+]
+
+export const MenuContents = ({ onMenuClose }: { onMenuClose?: () => void }) => {
+ const pc = useStyle()
+ const { logout } = useAuth()
+
+ const onClickLogoutHandler = () => {
+ confirmAlert({
+ customUI: ({ onClose }) => await logout()} onClose={onClose} />,
+ })
+ }
+
+ return (
+
+
+
+
+
+
+
会員専用ページ
+
+
+ {menuList.map((menuItem) => {
+ return (
+ -
+
+
+ )
+ })}
+
+
+ -
+
+
+
+
+ )
+}
+
+const CustomLink = ({ label, to, onClick }: { label: string; to: string; onClick?: () => void }) => {
+ return (
+ (isActive ? clsx(styles.link, styles.active) : styles.link)}
+ >
+ {label}
+
+ )
+}
diff --git a/src/components/Layout/index.ts b/src/components/Layout/index.ts
new file mode 100644
index 00000000..19b84975
--- /dev/null
+++ b/src/components/Layout/index.ts
@@ -0,0 +1 @@
+export * from './Layout'
diff --git a/src/components/Logout/LogoutAlert.tsx b/src/components/Logout/LogoutAlert.tsx
new file mode 100644
index 00000000..97ae1b09
--- /dev/null
+++ b/src/components/Logout/LogoutAlert.tsx
@@ -0,0 +1,13 @@
+import { Alert } from '../Alert/Alert'
+
+export const LogoutAlert = ({ onConfirm, onClose }: { onConfirm: () => void; onClose: () => void }) => {
+ return (
+
+ )
+}
diff --git a/src/components/Navigations/BackLink.module.scss b/src/components/Navigations/BackLink.module.scss
new file mode 100644
index 00000000..715bd61c
--- /dev/null
+++ b/src/components/Navigations/BackLink.module.scss
@@ -0,0 +1,65 @@
+.back-link {
+ font-size: 1rem;
+ line-height: 1.6;
+
+ ul {
+ margin: 0;
+ padding: 0;
+
+ li {
+ list-style: none;
+
+ a {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #333;
+
+ &:hover {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #ccc;
+
+ &:hover {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+
+ .inner {
+ padding-left: 12px;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+
+ span {
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ svg {
+ display: block;
+ width: 20px;
+ height: 20px;
+ margin-right: 10px;
+ fill: #c8c7cc;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/Navigations/BackLink.tsx b/src/components/Navigations/BackLink.tsx
new file mode 100644
index 00000000..172458ec
--- /dev/null
+++ b/src/components/Navigations/BackLink.tsx
@@ -0,0 +1,23 @@
+import { Link } from 'react-router-dom'
+import { ContentsBox } from '../ContentsBox'
+import { ReactComponent as LeftIcon } from '../../assets/left.svg'
+import styles from './BackLink.module.scss'
+
+export const BackLink = ({ path, label = '戻る' }: { path: string; label?: string }) => {
+ return (
+
+
+
+ -
+
+
+
+ {label}
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/Navigations/BackToHome.module.scss b/src/components/Navigations/BackToHome.module.scss
new file mode 100644
index 00000000..eb52597a
--- /dev/null
+++ b/src/components/Navigations/BackToHome.module.scss
@@ -0,0 +1,69 @@
+.back-to-home {
+ padding: 0;
+}
+
+.back-link {
+ font-size: 1rem;
+ line-height: 1.6;
+
+ ul {
+ margin: 0;
+ padding: 0;
+
+ li {
+ list-style: none;
+
+ a {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #333;
+
+ &:hover {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #ccc;
+
+ &:hover {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+
+ .inner {
+ padding-left: 12px;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+
+ span {
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ svg {
+ display: block;
+ width: 20px;
+ height: 20px;
+ margin-right: 10px;
+ fill: #c8c7cc;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/Navigations/BackToHome.tsx b/src/components/Navigations/BackToHome.tsx
new file mode 100644
index 00000000..e068c3d1
--- /dev/null
+++ b/src/components/Navigations/BackToHome.tsx
@@ -0,0 +1,25 @@
+import { Link } from 'react-router-dom'
+import { ReactComponent as LeftIcon } from '../../assets/left.svg'
+import { ContentsBox } from '../ContentsBox'
+import styles from './BackToHome.module.scss'
+
+export const BackToHome = () => {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/Navigations/ContentsButton.module.scss b/src/components/Navigations/ContentsButton.module.scss
new file mode 100644
index 00000000..f4eb1b54
--- /dev/null
+++ b/src/components/Navigations/ContentsButton.module.scss
@@ -0,0 +1,82 @@
+.contents-button {
+ button {
+ width: 100%;
+ border: none;
+ padding: 0;
+ background-color: transparent;
+ outline: none;
+ appearance: none;
+ cursor: pointer;
+ }
+
+ div {
+ display: block;
+ width: 100%;
+ height: 44px;
+ line-height: 44px;
+ margin: 0 auto;
+ padding: 0;
+ border: none;
+ color: rgba(182, 0, 5, 1);
+ font-size: 16px;
+ text-align: center;
+ text-decoration: none;
+ transition: all ease-in-out 0.2s;
+ cursor: pointer;
+
+ & {
+ background: #fff;
+
+ &:hover,
+ &:focus {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ background: #1c1c1e;
+
+ &:hover,
+ &:focus {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+
+ span {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ svg {
+ width: 16px;
+ height: 16px;
+ margin-right: 0.2em;
+ fill: rgba(182, 0, 5, 1);
+ }
+
+ &.disabled {
+ cursor: default;
+
+ & {
+ color: #888;
+ background: #fff;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #888;
+ background: #1c1c1e;
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/Navigations/ContentsButton.tsx b/src/components/Navigations/ContentsButton.tsx
new file mode 100644
index 00000000..7417d729
--- /dev/null
+++ b/src/components/Navigations/ContentsButton.tsx
@@ -0,0 +1,57 @@
+import { ReactNode } from 'react'
+import clsx from 'clsx'
+
+import styles from './ContentsButton.module.scss'
+
+export const ContentsButton = ({
+ label,
+ icon,
+ isLoading,
+ onClick,
+}: {
+ label: string
+ icon?: ReactNode
+ isLoading?: boolean
+ onClick: () => void
+}) => {
+ return (
+
+
+
+ {isLoading && 'Loading...'}
+ {!isLoading && (
+ <>
+ {icon}
+ {label}
+ >
+ )}
+
+
+
+ )
+}
+
+export const ContentsSubmitButton = ({
+ type,
+ label,
+ isLoading,
+ isDisabled,
+}: {
+ type: 'button' | 'submit' | 'reset'
+ label: string
+ isLoading?: boolean
+ isDisabled?: boolean
+}) => {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/Navigations/ContentsLinks.module.scss b/src/components/Navigations/ContentsLinks.module.scss
new file mode 100644
index 00000000..f8bbb775
--- /dev/null
+++ b/src/components/Navigations/ContentsLinks.module.scss
@@ -0,0 +1,226 @@
+.link {
+ font-size: 1rem;
+
+ ul {
+ margin: 0;
+ padding: 0;
+
+ li {
+ list-style: none;
+
+ & {
+ border-top: 0.55px solid #cbcbcd;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ border-top: 0.55px solid #2d2d2f;
+ }
+ }
+
+ &:first-child {
+ border-top: 0;
+ }
+
+ .disabled-link {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #ccc;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #333;
+ }
+ }
+
+ .inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ cursor: default;
+
+ &.pc {
+ padding-left: 16px;
+ }
+
+ span {
+ // margin: 11px 8px 11px 0;
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ svg {
+ width: 20px;
+ height: 20px;
+ padding-right: 12px;
+ font-size: 1.2rem;
+ }
+
+ svg {
+ fill: #eee;
+ path {
+ stroke: #eee;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ svg {
+ fill: #333;
+ path {
+ stroke: #333;
+ }
+ }
+ }
+ }
+ }
+
+ a {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #333;
+
+ &:hover {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #ccc;
+
+ &:hover {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+ }
+
+ &.link {
+ cursor: pointer;
+ }
+
+ .inner {
+ padding-left: 12px;
+ cursor: pointer;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ &.pc {
+ padding-left: 16px;
+ }
+
+ span {
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ svg {
+ width: 20px;
+ height: 20px;
+ padding-right: 12px;
+ color: #c8c7cc;
+ }
+ }
+
+ .disabled-link {
+ display: block;
+ margin: 0;
+
+ text-decoration: none;
+
+ & {
+ color: #ccc;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #333;
+ }
+ }
+
+ .inner {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ cursor: default;
+
+ span {
+ // margin: 11px 8px 11px 0;
+ line-height: 44px;
+ font-size: 16px;
+ }
+
+ i {
+ padding-right: 12px;
+ color: #eee;
+ font-size: 1.2rem;
+ }
+
+ svg {
+ fill: #eee;
+
+ & {
+ fill: #eee;
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ fill: #333;
+ }
+ }
+ }
+ }
+ }
+
+ .link-button {
+ cursor: pointer;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ & {
+ color: #333;
+
+ &:hover {
+ background: #e6e5eb;
+ }
+
+ &:active {
+ background: #e6e5eb;
+ }
+ }
+ @media (prefers-color-scheme: dark) {
+ & {
+ color: #ccc;
+
+ &:hover {
+ background: #2c2c2e;
+ }
+
+ &:active {
+ background: #2c2c2e;
+ }
+ }
+ }
+ span {
+ line-height: 44px;
+ font-size: 16px;
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/Navigations/ContentsLinks.tsx b/src/components/Navigations/ContentsLinks.tsx
new file mode 100644
index 00000000..45c5a161
--- /dev/null
+++ b/src/components/Navigations/ContentsLinks.tsx
@@ -0,0 +1,51 @@
+import clsx from 'clsx'
+import { Link } from 'react-router-dom'
+import { ReactComponent as RightIcon } from '../../assets/right.svg'
+import { useStyle } from '../../utilities/useStyle'
+import styles from './ContentsLinks.module.scss'
+
+type LinkItem = { path?: string; label: string; isDisabled?: boolean; onClick?: () => void }
+
+export const ContentsLinks = ({ list }: { list: LinkItem[] }) => {
+ const pc = useStyle()
+ return (
+
+
+ {list.map((link, index) => {
+ if (link.path) {
+ return (
+ -
+ {link.isDisabled && (
+
+ )}
+ {!link.isDisabled && (
+
+
+ {link.label}
+
+
+
+ )}
+
+ )
+ } else {
+ return (
+ -
+
+
+ )
+ }
+ })}
+
+
+ )
+}
diff --git a/src/components/Navigations/index.ts b/src/components/Navigations/index.ts
new file mode 100644
index 00000000..e1fbaae1
--- /dev/null
+++ b/src/components/Navigations/index.ts
@@ -0,0 +1,2 @@
+export * from './BackToHome'
+export * from './ContentsLinks'
diff --git a/src/components/Notifications/Notification.module.scss b/src/components/Notifications/Notification.module.scss
new file mode 100644
index 00000000..d73082c1
--- /dev/null
+++ b/src/components/Notifications/Notification.module.scss
@@ -0,0 +1,59 @@
+.notification {
+ display: flex;
+ align-items: center;
+ margin-bottom: 10px;
+ border-radius: 10px;
+ background: rgba(0, 0, 0, 0.9);
+ color: white;
+
+ margin-top: constant(safe-area-inset-top);
+ margin-top: env(safe-area-inset-top);
+
+ .message {
+ margin: 16px;
+ font-size: 13px;
+
+ b {
+ font-weight: 600;
+ }
+ }
+
+ .close {
+ width: 13px;
+ height: 13px;
+ margin-left: auto;
+ padding: 16px;
+ display: flex;
+ align-items: center;
+
+ svg {
+ fill: #fff;
+ }
+ }
+
+ &.show {
+ animation: opacity-show 0.5s ease 0s forwards;
+ }
+
+ &.hide {
+ animation: opacity-hide 0.5s ease 0s forwards;
+ }
+}
+
+@keyframes opacity-show {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+@keyframes opacity-hide {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
diff --git a/src/components/Notifications/Notification.tsx b/src/components/Notifications/Notification.tsx
new file mode 100644
index 00000000..ae94a1b0
--- /dev/null
+++ b/src/components/Notifications/Notification.tsx
@@ -0,0 +1,21 @@
+import styles from './Notification.module.scss'
+import clsx from 'clsx'
+import type { Notification as NotificationType } from '../../stores/notification'
+import { ReactComponent as Close } from '../../assets/close.svg'
+
+export const Notification = ({
+ notification,
+ onDismiss,
+}: {
+ notification: NotificationType
+ onDismiss: (timeId: number) => void
+}) => {
+ return (
+
+
{notification.message}
+
onDismiss(notification.timeId)} className={styles.close}>
+
+
+
+ )
+}
diff --git a/src/components/Notifications/Notifications.module.scss b/src/components/Notifications/Notifications.module.scss
new file mode 100644
index 00000000..6664a2ea
--- /dev/null
+++ b/src/components/Notifications/Notifications.module.scss
@@ -0,0 +1,9 @@
+.notifications {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ right: 10px;
+ max-width: 600px;
+ margin: auto;
+ z-index: 99;
+}
diff --git a/src/components/Notifications/Notifications.tsx b/src/components/Notifications/Notifications.tsx
new file mode 100644
index 00000000..b55032d5
--- /dev/null
+++ b/src/components/Notifications/Notifications.tsx
@@ -0,0 +1,14 @@
+import { useNotificationStore } from '../../stores/notification'
+import { Notification } from './Notification'
+import styles from './Notifications.module.scss'
+
+export const Notifications = () => {
+ const { notifications, dismissNotification } = useNotificationStore()
+ return (
+
+ {notifications.map((notification) => (
+
+ ))}
+
+ )
+}
diff --git a/src/components/Notifications/index.ts b/src/components/Notifications/index.ts
new file mode 100644
index 00000000..c242b953
--- /dev/null
+++ b/src/components/Notifications/index.ts
@@ -0,0 +1 @@
+export * from './Notifications'
diff --git a/src/config/index.ts b/src/config/index.ts
new file mode 100644
index 00000000..51815aa2
--- /dev/null
+++ b/src/config/index.ts
@@ -0,0 +1,5 @@
+export const AUTH_API_URL = process.env.REACT_APP_AUTH_API_URL as string
+export const APP_API_URL = process.env.REACT_APP_APP_API_URL as string
+export const SCORE_API_URL = process.env.REACT_APP_SCORE_API_URL as string
+export const API_PATH = process.env.REACT_APP_API_PATH as string
+export const VERSION = process.env.REACT_APP_VERSION as string
diff --git a/src/features/archive/api/getConcertList.ts b/src/features/archive/api/getConcertList.ts
new file mode 100644
index 00000000..5918e8b0
--- /dev/null
+++ b/src/features/archive/api/getConcertList.ts
@@ -0,0 +1,29 @@
+import { useQuery } from 'react-query'
+import { APP_API_URL } from '../../../config'
+import { fetchApi } from '../../../library/fetch'
+import { MainConcert, MiniConcert, OtherConcert } from '../../../types'
+import { getSession } from '../../../utilities/session'
+
+export type ConcertItem = {
+ id: string
+ time: number
+ type: 'main' | 'mini' | 'other'
+ detail: MainConcert | MiniConcert | OtherConcert
+ _id: string
+}
+
+export type ConcertListApi = {
+ status: boolean
+ list: ConcertItem[]
+}
+
+const getConcertList = async (): Promise => {
+ return await fetchApi(`${APP_API_URL}/api/concert`, { session: getSession() })
+}
+
+export const useConcertList = () => {
+ return useQuery({
+ queryKey: 'archiveList',
+ queryFn: () => getConcertList(),
+ })
+}
diff --git a/src/features/archive/api/getPhoto.ts b/src/features/archive/api/getPhoto.ts
new file mode 100644
index 00000000..0a9b42dc
--- /dev/null
+++ b/src/features/archive/api/getPhoto.ts
@@ -0,0 +1,16 @@
+import { useQuery } from 'react-query'
+import { APP_API_URL } from '../../../config'
+import { fetchApi } from '../../../library/fetch'
+import type { Photo } from '../../../types/photo'
+import { getSession } from '../../../utilities/session'
+
+const getPhoto = async (concertId: string): Promise => {
+ return await fetchApi(`${APP_API_URL}/api/photo`, { session: getSession(), id: concertId })
+}
+
+export const usePhoto = (concertId: string) => {
+ return useQuery({
+ queryKey: ['photo', concertId],
+ queryFn: async () => await getPhoto(concertId),
+ })
+}
diff --git a/src/features/archive/api/getVideo.ts b/src/features/archive/api/getVideo.ts
new file mode 100644
index 00000000..db5204ac
--- /dev/null
+++ b/src/features/archive/api/getVideo.ts
@@ -0,0 +1,16 @@
+import { useQuery } from 'react-query'
+import { APP_API_URL } from '../../../config'
+import { fetchApi } from '../../../library/fetch'
+import type { Video } from '../../../types/video'
+import { getSession } from '../../../utilities/session'
+
+const getVideo = async (concertId: string): Promise
+ }
+ >
+