Make network lobby a separate component

This commit is contained in:
Pavel Djundik 2018-07-12 22:24:35 +03:00 committed by Pavel Djundik
parent 8931570c02
commit 3d43b96d5a
5 changed files with 153 additions and 107 deletions

View file

@ -14,7 +14,7 @@
class="logo-inverted" class="logo-inverted"
alt="The Lounge"> alt="The Lounge">
</div> </div>
<Network <NetworkList
:networks="networks" :networks="networks"
:active-channel="activeChannel"/> :active-channel="activeChannel"/>
</div> </div>
@ -93,13 +93,13 @@
</template> </template>
<script> <script>
import Network from "./Network.vue"; import NetworkList from "./NetworkList.vue";
import Chat from "./Chat.vue"; import Chat from "./Chat.vue";
export default { export default {
name: "App", name: "App",
components: { components: {
Network, NetworkList,
Chat, Chat,
}, },
props: { props: {

View file

@ -1,121 +1,48 @@
<template> <template>
<div <ChannelWrapper
v-if="!network.isCollapsed || channel.highlight || channel.type === 'lobby'" :network="network"
:class="[ channel.type, { active: activeChannel && channel === activeChannel.channel } ]" :channel="channel"
:aria-label="channel.name" :active-channel="activeChannel">
:title="channel.name" <span
:data-id="channel.id" :title="channel.name"
:data-target="'#chan-' + channel.id" class="name">{{ channel.name }}</span>
:aria-controls="'#chan-' + channel.id" <span
:aria-selected="activeChannel && channel === activeChannel.channel" v-if="channel.unread"
class="chan" :class="{ highlight: channel.highlight }"
role="tab" class="badge">{{ channel.unread | roundBadgeNumber }}</span>
> <template v-if="channel.type === 'channel'">
<template v-if="channel.type === 'lobby'">
<button
v-if="network.channels.length > 1"
:aria-controls="'network-' + network.uuid"
:aria-label="getExpandLabel(network)"
:aria-expanded="!network.isCollapsed"
class="collapse-network"
@click.prevent="onCollapseClick"
>
<span class="collapse-network-icon"/>
</button>
<span <span
v-else class="close-tooltip tooltipped tooltipped-w"
class="collapse-network"/> aria-label="Leave">
<div class="lobby-wrap">
<span
:title="channel.name"
class="name">{{ channel.name }}</span>
<span
class="not-secure-tooltip tooltipped tooltipped-w"
aria-label="Insecure connection">
<span class="not-secure-icon"/>
</span>
<span
class="not-connected-tooltip tooltipped tooltipped-w"
aria-label="Disconnected">
<span class="not-connected-icon"/>
</span>
<span
v-if="channel.unread"
:class="{ highlight: channel.highlight }"
class="badge">{{ channel.unread | roundBadgeNumber }}</span>
</div>
<span
:aria-label="joinChannelLabel"
class="add-channel-tooltip tooltipped tooltipped-w tooltipped-no-touch">
<button <button
:class="['add-channel', { opened: isJoinChannelShown }]" class="close"
:aria-controls="'join-channel-' + channel.id" aria-label="Leave"/>
:aria-label="joinChannelLabel"
@click.stop="$emit('toggleJoinChannel')"/>
</span> </span>
</template> </template>
<template v-else> <template v-else>
<span <span
:title="channel.name" class="close-tooltip tooltipped tooltipped-w"
class="name">{{ channel.name }}</span> aria-label="Close">
<span <button
v-if="channel.unread" class="close"
:class="{ highlight: channel.highlight }" aria-label="Close"/>
class="badge">{{ channel.unread | roundBadgeNumber }}</span> </span>
<template v-if="channel.type === 'channel'">
<span
class="close-tooltip tooltipped tooltipped-w"
aria-label="Leave">
<button
class="close"
aria-label="Leave"/>
</span>
</template>
<template v-else>
<span
class="close-tooltip tooltipped tooltipped-w"
aria-label="Close">
<button
class="close"
aria-label="Close"/>
</span>
</template>
</template> </template>
</div> </ChannelWrapper>
</template> </template>
<script> <script>
const storage = require("../js/localStorage"); import ChannelWrapper from "./ChannelWrapper.vue";
export default { export default {
name: "Channel", name: "Channel",
components: {
ChannelWrapper,
},
props: { props: {
activeChannel: Object, activeChannel: Object,
network: Object, network: Object,
channel: Object, channel: Object,
isJoinChannelShown: Boolean,
},
computed: {
joinChannelLabel() {
return this.isJoinChannelShown ? "Cancel" : "Join a channel…";
},
},
methods: {
onCollapseClick() {
const networks = new Set(JSON.parse(storage.get("thelounge.networks.collapsed")));
this.network.isCollapsed = !this.network.isCollapsed;
if (this.network.isCollapsed) {
networks.add(this.network.uuid);
} else {
networks.delete(this.network.uuid);
}
storage.set("thelounge.networks.collapsed", JSON.stringify([...networks]));
},
getExpandLabel(network) {
return network.isCollapsed ? "Expand" : "Collapse";
},
}, },
}; };
</script> </script>

View file

@ -0,0 +1,30 @@
<template>
<div
v-if="!network.isCollapsed || channel.highlight || channel.type === 'lobby' || (activeChannel && channel === activeChannel.channel)"
:class="[ channel.type, { active: activeChannel && channel === activeChannel.channel } ]"
:aria-label="channel.name"
:title="channel.name"
:data-id="channel.id"
:data-target="'#chan-' + channel.id"
:aria-controls="'#chan-' + channel.id"
:aria-selected="activeChannel && channel === activeChannel.channel"
class="chan"
role="tab"
>
<slot
:network="network"
:channel="channel"
:activeChannel="activeChannel"/>
</div>
</template>
<script>
export default {
name: "ChannelWrapper",
props: {
network: Object,
channel: Object,
activeChannel: Object,
},
};
</script>

View file

@ -27,8 +27,7 @@
class="network" class="network"
role="region" role="region"
> >
<Channel <NetworkLobby
:channel="network.channels[0]"
:network="network" :network="network"
:active-channel="activeChannel" :active-channel="activeChannel"
:is-join-channel-shown="network.isJoinChannelShown" :is-join-channel-shown="network.isJoinChannelShown"
@ -63,8 +62,9 @@
<script> <script>
import Draggable from "vuedraggable"; import Draggable from "vuedraggable";
import JoinChannel from "./JoinChannel.vue"; import NetworkLobby from "./NetworkLobby.vue";
import Channel from "./Channel.vue"; import Channel from "./Channel.vue";
import JoinChannel from "./JoinChannel.vue";
// TODO: ignoreSortSync should be removed // TODO: ignoreSortSync should be removed
import {findChannel} from "../js/vue"; import {findChannel} from "../js/vue";
@ -72,9 +72,10 @@ import socket from "../js/socket";
// import options from "../js/options"; // import options from "../js/options";
export default { export default {
name: "Network", name: "NetworkList",
components: { components: {
JoinChannel, JoinChannel,
NetworkLobby,
Channel, Channel,
Draggable, Draggable,
}, },

View file

@ -0,0 +1,88 @@
<template>
<ChannelWrapper
:network="network"
:channel="channel"
:active-channel="activeChannel">
<button
v-if="network.channels.length > 1"
:aria-controls="'network-' + network.uuid"
:aria-label="getExpandLabel(network)"
:aria-expanded="!network.isCollapsed"
class="collapse-network"
@click.stop="onCollapseClick"
><span class="collapse-network-icon"/></button>
<span
v-else
class="collapse-network"/>
<div class="lobby-wrap">
<span
:title="channel.name"
class="name">{{ channel.name }}</span>
<span
class="not-secure-tooltip tooltipped tooltipped-w"
aria-label="Insecure connection">
<span class="not-secure-icon"/>
</span>
<span
class="not-connected-tooltip tooltipped tooltipped-w"
aria-label="Disconnected">
<span class="not-connected-icon"/>
</span>
<span
v-if="channel.unread"
:class="{ highlight: channel.highlight }"
class="badge">{{ channel.unread | roundBadgeNumber }}</span>
</div>
<span
:aria-label="joinChannelLabel"
class="add-channel-tooltip tooltipped tooltipped-w tooltipped-no-touch">
<button
:class="['add-channel', { opened: isJoinChannelShown }]"
:aria-controls="'join-channel-' + channel.id"
:aria-label="joinChannelLabel"
@click.stop="$emit('toggleJoinChannel')"/>
</span>
</ChannelWrapper>
</template>
<script>
import ChannelWrapper from "./ChannelWrapper.vue";
const storage = require("../js/localStorage");
export default {
name: "Channel",
components: {
ChannelWrapper,
},
props: {
activeChannel: Object,
network: Object,
isJoinChannelShown: Boolean,
},
computed: {
channel() {
return this.network.channels[0];
},
joinChannelLabel() {
return this.isJoinChannelShown ? "Cancel" : "Join a channel…";
},
},
methods: {
onCollapseClick() {
const networks = new Set(JSON.parse(storage.get("thelounge.networks.collapsed")));
this.network.isCollapsed = !this.network.isCollapsed;
if (this.network.isCollapsed) {
networks.add(this.network.uuid);
} else {
networks.delete(this.network.uuid);
}
storage.set("thelounge.networks.collapsed", JSON.stringify([...networks]));
},
getExpandLabel(network) {
return network.isCollapsed ? "Expand" : "Collapse";
},
},
};
</script>