From e46b560ead02ab5d9df8edbb997c56b835aa21d4 Mon Sep 17 00:00:00 2001 From: shpuld <shp@cock.li> Date: Sun, 23 Dec 2018 19:50:19 +0200 Subject: [PATCH] move closing logic to drawer, add swipe to close --- src/App.js | 5 +- src/App.vue | 14 ++--- src/components/side_drawer/side_drawer.js | 32 ++++++++--- src/components/side_drawer/side_drawer.vue | 67 +++++++++++----------- src/components/user_finder/user_finder.vue | 22 +++---- 5 files changed, 78 insertions(+), 62 deletions(-) diff --git a/src/App.js b/src/App.js index 728c8e547..68fae50e3 100644 --- a/src/App.js +++ b/src/App.js @@ -30,8 +30,7 @@ export default { window.CSS.supports('-moz-mask-size', 'contain') || window.CSS.supports('-ms-mask-size', 'contain') || window.CSS.supports('-o-mask-size', 'contain') - ), - showMobileSidebar: false + ) }), created () { // Load the locale from the storage @@ -93,7 +92,7 @@ export default { this.finderHidden = hidden }, toggleMobileSidebar () { - this.showMobileSidebar = !this.showMobileSidebar + this.$refs.sideDrawer.toggleDrawer() } } } diff --git a/src/App.vue b/src/App.vue index 55cac52c3..59398a345 100644 --- a/src/App.vue +++ b/src/App.vue @@ -14,9 +14,9 @@ </div> <div class='item right'> <a href="#" @click.stop.prevent="toggleMobileSidebar()"><i class="button-icon icon-menu"></i></a> - <user-finder class="button-icon nav-icon" @toggled="onFinderToggled"></user-finder> - <router-link @click.native="activatePanel('timeline')" :to="{ name: 'settings'}"><i class="button-icon icon-cog nav-icon" :title="$t('nav.preferences')"></i></router-link> - <a href="#" v-if="currentUser" @click.prevent="logout"><i class="button-icon icon-logout nav-icon" :title="$t('login.logout')"></i></a> + <user-finder class="button-icon nav-icon mobile-hidden" @toggled="onFinderToggled"></user-finder> + <router-link class="mobile-hidden" @click.native="activatePanel('timeline')" :to="{ name: 'settings'}"><i class="button-icon icon-cog nav-icon" :title="$t('nav.preferences')"></i></router-link> + <a href="#" class="mobile-hidden" v-if="currentUser" @click.prevent="logout"><i class="button-icon icon-logout nav-icon" :title="$t('login.logout')"></i></a> </div> </div> </nav> @@ -25,17 +25,11 @@ <div v-if="" class="container" id="content"> <side-drawer + ref="sideDrawer" :activatePanel="activatePanel" - :closed="!showMobileSidebar" - :clickoutside="toggleMobileSidebar" :logout="logout" > </side-drawer> - <!-- - <button @click="activatePanel(mobileViews.postStatus)">post status</button> - <button @click="activatePanel(mobileViews.notifications)">notifs</button> - <button @click="activatePanel(mobileViews.timeline)">timeline</button> - --> <div class="sidebar-flexer"> <div class="sidebar-bounds"> <div class="sidebar-scroller"> diff --git a/src/components/side_drawer/side_drawer.js b/src/components/side_drawer/side_drawer.js index 6541077b2..2064dfa50 100644 --- a/src/components/side_drawer/side_drawer.js +++ b/src/components/side_drawer/side_drawer.js @@ -1,23 +1,41 @@ +import UserCardContent from '../user_card_content/user_card_content.vue' + +const deltaX = (oldX, newX) => newX - oldX + +const touchEventX = e => e.touches[0].screenX + const SideDrawer = { - props: [ 'activatePanel', 'closed', 'clickoutside', 'logout' ], + props: [ 'activatePanel', 'logout' ], + data: () => ({ + closed: true, + touchX: 0 + }), + components: { UserCardContent }, computed: { currentUser () { return this.$store.state.users.currentUser } }, methods: { + toggleDrawer () { + this.closed = !this.closed + }, gotoPanel (panel) { this.activatePanel(panel) - this.clickoutside && this.clickoutside() - }, - clickedOutside () { - if (typeof this.clickoutside === 'function') { - this.clickoutside() - } + this.toggleDrawer() }, doLogout () { this.logout() this.gotoPanel('timeline') + }, + touchStart (e) { + this.touchX = touchEventX(e) + }, + touchMove (e) { + const delta = deltaX(this.touchX, touchEventX(e)) + if (delta < -30) { + this.toggleDrawer() + } } } } diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue index 1593ae65d..99ea3dd38 100644 --- a/src/components/side_drawer/side_drawer.vue +++ b/src/components/side_drawer/side_drawer.vue @@ -1,6 +1,10 @@ <template> - <div class="side-drawer-container" :class="{'side-drawer-container-closed': closed, 'side-drawer-container-open': !closed}"> - <div class="panel panel-default side-drawer" :class="{'side-drawer-closed': closed}"> + <div class="side-drawer-container" :class="{ 'side-drawer-container-closed': closed, 'side-drawer-container-open': !closed }"> + <div class="panel panel-default side-drawer" :class="{'side-drawer-closed': closed}" @touchstart="touchStart" @touchmove.prevent="touchMove"> + <div class="side-drawer-heading"> + <user-card-content :activatePanel="activatePanel" :user="currentUser" :switcher="false" :hideBio="true"> + </user-card-content> + </div> <ul> <li v-if='currentUser'> <a href="#" @click="gotoPanel('poststatus')"> @@ -54,7 +58,7 @@ </li> </ul> </div> - <div class="side-drawer-click-outside" @click.stop.prevent="clickedOutside" :class="{'side-drawer-click-outside-closed': closed}"></div> + <div class="side-drawer-click-outside" @click.stop.prevent="toggleDrawer" :class="{'side-drawer-click-outside-closed': closed}"></div> </div> </template> @@ -110,7 +114,28 @@ .side-drawer .panel { overflow: hidden; margin: 0; + display: flex; +} + +.side-drawer-heading { + background: transparent; + flex-direction: column; + align-items: stretch; + display: flex; + min-height: 8em; + padding: 0; + margin: 0; + + .profile-panel-background { + border-radius: 0; + .panel-heading { + background: transparent; + flex-direction: column; + align-items: stretch; + } + } } + .side-drawer ul { list-style: none; margin: 0; @@ -123,40 +148,18 @@ border-color: var(--border, $fallback--border); padding: 0; - &:first-child a { - border-top-right-radius: $fallback--panelRadius; - border-top-right-radius: var(--panelRadius, $fallback--panelRadius); - border-top-left-radius: $fallback--panelRadius; - border-top-left-radius: var(--panelRadius, $fallback--panelRadius); - } + a { + display: block; + padding: 0.8em 0.85em; - &:last-child a { - border-bottom-right-radius: $fallback--panelRadius; - border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius); - border-bottom-left-radius: $fallback--panelRadius; - border-bottom-left-radius: var(--panelRadius, $fallback--panelRadius); + &:hover { + background-color: $fallback--lightBg; + background-color: var(--lightBg, $fallback--lightBg); + } } } .side-drawer li:last-child { border: none; } - -.side-drawer a { - display: block; - padding: 0.8em 0.85em; - - &:hover { - background-color: $fallback--lightBg; - background-color: var(--lightBg, $fallback--lightBg); - } - - &.router-link-active { - font-weight: bolder; - - &:hover { - text-decoration: underline; - } - } -} </style> diff --git a/src/components/user_finder/user_finder.vue b/src/components/user_finder/user_finder.vue index eeb76c357..37d628fa7 100644 --- a/src/components/user_finder/user_finder.vue +++ b/src/components/user_finder/user_finder.vue @@ -1,14 +1,16 @@ <template> - <div class="user-finder-container"> - <i class="icon-spin4 user-finder-icon animate-spin-slow" v-if="loading" /> - <a href="#" v-if="hidden" :title="$t('finder.find_user')"><i class="icon-user-plus user-finder-icon" @click.prevent.stop="toggleHidden" /></a> - <template v-else> - <input class="user-finder-input" @keyup.enter="findUser(username)" v-model="username" :placeholder="$t('finder.find_user')" id="user-finder-input" type="text"/> - <button class="btn search-button" @click="findUser(username)"> - <i class="icon-search"/> - </button> - <i class="button-icon icon-cancel user-finder-icon" @click.prevent.stop="toggleHidden"/> - </template> + <div> + <div class="user-finder-container"> + <i class="icon-spin4 user-finder-icon animate-spin-slow" v-if="loading" /> + <a href="#" v-if="hidden" :title="$t('finder.find_user')"><i class="icon-user-plus user-finder-icon" @click.prevent.stop="toggleHidden" /></a> + <template v-else> + <input class="user-finder-input" @keyup.enter="findUser(username)" v-model="username" :placeholder="$t('finder.find_user')" id="user-finder-input" type="text"/> + <button class="btn search-button" @click="findUser(username)"> + <i class="icon-search"/> + </button> + <i class="button-icon icon-cancel user-finder-icon" @click.prevent.stop="toggleHidden"/> + </template> + </div> </div> </template> -- GitLab