summaryrefslogtreecommitdiff
path: root/src/client/app/desktop/views/widgets/users.vue
blob: 328fa56697b637d9d46a43a46e3a9ce7a9c1e5b2 (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
<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">
					<mk-avatar class="avatar" :user="_user"/>
					<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;
			this.save();
		},
		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
				display block
				float left
				margin 0 12px 0 0
				width 42px
				height 42px
				border-radius 8px

			> .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>