summaryrefslogtreecommitdiff
path: root/src/client/app/desktop/views/widgets/users.vue
blob: 6e326115b03b084ce594208feb405624d115e6db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<template>
<div class="mkw-users">
	<mk-widget-container :show-header="!props.compact">
		<template slot="header">%fa:users%%i18n:@title%</template>
		<button slot="func" title="%i18n:@refresh%" @click="refresh">%fa:sync%</button>

		<div class="mkw-users--body">
			<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
			<template v-else-if="users.length != 0">
				<div class="user" v-for="_user in users">
					<router-link class="avatar-anchor" :to="_user | userPage">
						<img class="avatar" :src="`${_user.avatarUrl}?thumbnail&size=42`" alt="" v-user-preview="_user.id"/>
					</router-link>
					<div class="body">
						<router-link class="name" :to="_user | userPage" v-user-preview="_user.id">{{ _user | userName }}</router-link>
						<p class="username">@{{ _user | acct }}</p>
					</div>
					<mk-follow-button :user="_user"/>
				</div>
			</template>
			<p class="empty" v-else>%i18n:@no-one%</p>
		</div>
	</mk-widget-container>
</div>
</template>

<script lang="ts">
import define from '../../../common/define-widget';

const limit = 3;

export default define({
	name: 'users',
	props: () => ({
		compact: false
	})
}).extend({
	data() {
		return {
			users: [],
			fetching: true,
			page: 0
		};
	},
	mounted() {
		this.fetch();
	},
	methods: {
		func() {
			this.props.compact = !this.props.compact;
		},
		fetch() {
			this.fetching = true;
			this.users = [];

			(this as any).api('users/recommendation', {
				limit: limit,
				offset: limit * this.page
			}).then(users => {
				this.users = users;
				this.fetching = false;
			});
		},
		refresh() {
			if (this.users.length < limit) {
				this.page = 0;
			} else {
				this.page++;
			}
			this.fetch();
		}
	}
});
</script>

<style lang="stylus" scoped>
root(isDark)
	.mkw-users--body
		> .user
			padding 16px
			border-bottom solid 1px isDark ? #1c2023 : #eee

			&:last-child
				border-bottom none

			&:after
				content ""
				display block
				clear both

			> .avatar-anchor
				display block
				float left
				margin 0 12px 0 0

				> .avatar
					display block
					width 42px
					height 42px
					margin 0
					border-radius 8px
					vertical-align bottom

			> .body
				float left
				width calc(100% - 54px)

				> .name
					margin 0
					font-size 16px
					line-height 24px
					color isDark ? #fff : #555

				> .username
					display block
					margin 0
					font-size 15px
					line-height 16px
					color isDark ? #606984 : #ccc

			> .mk-follow-button
				position absolute
				top 16px
				right 16px

		> .empty
			margin 0
			padding 16px
			text-align center
			color #aaa

		> .fetching
			margin 0
			padding 16px
			text-align center
			color #aaa

			> [data-fa]
				margin-right 4px

.mkw-users[data-darkmode]
	root(true)

.mkw-users:not([data-darkmode])
	root(false)

</style>