Skip to content

Commit 16fa672

Browse files
authored
fix: Home page loading data and card animation (#664)
1 parent cbffa2c commit 16fa672

6 files changed

Lines changed: 106 additions & 83 deletions

File tree

src/components/AppList/index.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ export default class AppList extends PureComponent {
2626

2727
getSearchTitle() {
2828
const { search, title, t } = this.props;
29-
return (search && t('search_results')) || title || t('Newest');
29+
if (search) {
30+
return t('search_results');
31+
}
32+
33+
return title || t('Newest');
3034
}
3135

3236
render() {

src/components/Card/index.scss

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
.card {
44
float: left;
55
display: inline-block;
6+
position: relative;
67
width: $app-card-width;
78
height: $app-card-height;
89
padding: 40px 20px 20px;
@@ -14,6 +15,7 @@
1415
text-align: center;
1516
box-shadow: 0 1px 4px 0 rgba(73, 33, 173, 0.06), 0 4px 8px 0 rgba(35, 35, 36, 0.04);
1617
cursor: pointer;
18+
overflow: hidden;
1719

1820
.label {
1921
font-size: $size-small;
@@ -25,8 +27,14 @@
2527
}
2628
}
2729

28-
.toggleCard{
29-
display: none;
30+
.toggleCard, .basicCard{
31+
position: relative;
32+
left: 0;
33+
transition: all .3s ease-in-out;
34+
}
35+
36+
.toggleCard {
37+
top: -1000px;
3038
}
3139

3240
// mimic toggle card effect
@@ -37,13 +45,12 @@
3745
box-shadow: 0 0 8px 0 rgba(119, 133, 146, 0.04), 0 3px 4px 0 rgba(134, 145, 156, 0.04);
3846

3947
.basicCard {
40-
display: none;
48+
top: -1000px;
4149
}
4250

4351
.toggleCard {
44-
display: block;
52+
top: -132px;
4553
text-align: left;
46-
transition: all .3s ease-in-out;
4754

4855
.title {
4956
.icon {
@@ -67,8 +74,9 @@
6774
margin-left: 8px;
6875
font-weight: bold;
6976
color: $N500;
70-
width: auto;
77+
width: 170px;
7178
@include textCut;
79+
word-break: break-word;
7280
}
7381
}
7482
.desc{

src/pages/Home/SearchBox/index.jsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import styles from './index.scss';
1212

1313
@translate()
1414
@withRouter
15-
@inject('rootStore')
15+
@inject(({ rootStore }) => ({
16+
rootStore,
17+
appStore: rootStore.appStore
18+
}))
1619
@observer
1720
export default class SearchBox extends React.Component {
1821
static propTypes = {
@@ -25,8 +28,10 @@ export default class SearchBox extends React.Component {
2528
};
2629

2730
onClearSearch = () => {
28-
this.props.rootStore.setSearchWord('');
29-
this.props.history.push('/');
31+
const { rootStore, appStore, history } = this.props;
32+
appStore.currentPage = 1;
33+
rootStore.setSearchWord('');
34+
history.push('/');
3035
};
3136

3237
render() {
@@ -37,7 +42,7 @@ export default class SearchBox extends React.Component {
3742
<Input.Search
3843
className={classnames(styles.search, className)}
3944
placeholder={t('search.placeholder')}
40-
value={getUrlParam('q') || searchWord}
45+
value={searchWord || getUrlParam('q')}
4146
onSearch={this.onSearch}
4247
onClear={this.onClearSearch}
4348
/>

src/pages/Home/index.jsx

Lines changed: 58 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import React, { Fragment, Component } from 'react';
1+
import React, { Component } from 'react';
22
import classnames from 'classnames';
33
import { observer, inject } from 'mobx-react';
44
import _ from 'lodash';
55
import { translate } from 'react-i18next';
66

7-
import { Icon, Notification } from 'components/Base';
7+
import { Icon } from 'components/Base';
88
import Layout, { TitleBanner } from 'components/Layout';
99
import AppList from 'components/AppList';
1010
import Loading from 'components/Loading';
1111
import InfiniteScroll from 'components/InfiniteScroll';
1212

13-
import { getScrollTop, getScrollBottom } from 'utils';
13+
import { getScrollTop } from 'utils';
1414
import { getUrlParam } from 'utils/url';
1515

1616
import styles from './index.scss';
@@ -29,36 +29,42 @@ export default class Home extends Component {
2929
static isHome = true;
3030

3131
state = {
32-
pageLoading: true
32+
pageLoading: true,
33+
cate: ''
3334
};
3435

3536
get searchWord() {
36-
return getUrlParam('q');
37+
return this.props.search || getUrlParam('q');
38+
}
39+
40+
get category() {
41+
return this.state.cate || getUrlParam('cate');
3742
}
3843

3944
async componentDidMount() {
40-
const {
41-
rootStore, appStore, categoryStore, match
42-
} = this.props;
43-
const { category } = match.params;
45+
const { rootStore, appStore, categoryStore } = this.props;
46+
47+
rootStore.setNavFix(Boolean(this.category || this.searchWord));
4448

45-
rootStore.setNavFix(Boolean(category || this.searchWord));
46-
if (!(category || this.searchWord)) {
49+
if (!(this.category || this.searchWord)) {
4750
this.threshold = this.getThreshold();
48-
window.onscroll = _.throttle(this.handleScroll, 100);
51+
window.onscroll = _.debounce(this.handleScroll, 100);
4952
}
5053
window.scroll({ top: 0 });
5154

52-
await categoryStore.fetchAll();
55+
await categoryStore.fetchAll({ noLimit: true });
5356
await appStore.fetchStoreAppsCount();
5457

5558
// always fetch active apps
56-
appStore.selectStatus = 'active';
59+
Object.assign(appStore, {
60+
selectStatus: 'active',
61+
currentPage: 1
62+
});
5763

58-
if (this.searchWord || category) {
64+
if (this.searchWord || (this.category && this.category !== cateLatest)) {
5965
await appStore.fetchAll({
6066
search_word: this.searchWord,
61-
category_id: category
67+
category_id: this.category
6268
});
6369
} else {
6470
await appStore.fetchActiveApps();
@@ -69,30 +75,34 @@ export default class Home extends Component {
6975
});
7076
}
7177

72-
async componentDidUpdate(prevProps) {
73-
const { match, appStore, search } = this.props;
74-
const { category } = match.params;
78+
async componentDidUpdate(prevProps, prevState) {
79+
const { appStore, search } = this.props;
80+
const { cate } = this.state;
7581

76-
if (prevProps.match.params.category !== category) {
77-
if (category === cateLatest) {
78-
await appStore.fetchActiveApps({
79-
search_word: this.searchWord
80-
});
82+
appStore.showActiveApps = this.category === cateLatest;
83+
84+
if (prevState.cate !== cate) {
85+
appStore.currentPage = 1;
86+
// reset search wd
87+
appStore.searchWord = '';
88+
if (cate === cateLatest) {
89+
await appStore.fetchActiveApps();
8190
} else {
82-
// reset search wd
83-
appStore.searchWord = '';
8491
await appStore.fetchAll({
85-
category_id: category
92+
category_id: cate
8693
});
8794
}
8895
}
8996

9097
if (prevProps.search !== search) {
9198
appStore.searchWord = search;
92-
if (search) {
93-
await appStore.fetchAll();
94-
} else {
99+
appStore.currentPage = 1;
100+
101+
if (!search) {
102+
this.setState({ cate: cateLatest });
95103
await appStore.fetchActiveApps();
104+
} else {
105+
await appStore.fetchAll();
96106
}
97107
}
98108
}
@@ -115,7 +125,7 @@ export default class Home extends Component {
115125
}
116126

117127
handleScroll = async () => {
118-
const { rootStore, appStore, categoryStore } = this.props;
128+
const { rootStore } = this.props;
119129
const { fixNav } = rootStore;
120130
if (this.threshold <= 0) {
121131
return;
@@ -128,20 +138,22 @@ export default class Home extends Component {
128138
} else if (!needFixNav && fixNav) {
129139
rootStore.setNavFix(false);
130140
}
131-
132-
// todo
133141
};
134142

135-
handleClickCate = cate_id => {
136-
this.props.history.push(`/cat/${cate_id}`);
143+
handleClickCate = cate => {
144+
const { rootStore, history } = this.props;
145+
146+
this.setState({
147+
cate
148+
});
149+
rootStore.setNavFix(true);
150+
rootStore.setSearchWord();
151+
history.push(`/?cate=${cate}`);
137152
};
138153

139154
renderCateMenu() {
140-
const {
141-
match, categoryStore, rootStore, t
142-
} = this.props;
155+
const { categoryStore, rootStore, t } = this.props;
143156
const { categories } = categoryStore;
144-
const { category } = match.params;
145157

146158
return (
147159
<div
@@ -155,7 +167,7 @@ export default class Home extends Component {
155167
<li
156168
key={cateLatest}
157169
className={classnames(styles.item, {
158-
[styles.active]: category === cateLatest
170+
[styles.active]: this.category === cateLatest
159171
})}
160172
onClick={() => this.handleClickCate(cateLatest)}
161173
>
@@ -172,7 +184,7 @@ export default class Home extends Component {
172184
<li
173185
key={category_id}
174186
className={classnames(styles.item, {
175-
[styles.active]: category === category_id
187+
[styles.active]: this.category === category_id
176188
})}
177189
onClick={() => this.handleClickCate(category_id)}
178190
>
@@ -193,7 +205,7 @@ export default class Home extends Component {
193205

194206
render() {
195207
const {
196-
rootStore, appStore, categoryStore, match, t
208+
rootStore, appStore, categoryStore, t
197209
} = this.props;
198210
const { pageLoading } = this.state;
199211
const { fixNav } = rootStore;
@@ -203,13 +215,12 @@ export default class Home extends Component {
203215
isLoading,
204216
hasMore,
205217
currentPage,
206-
loadMoreHomeApps,
218+
loadMore,
207219
countStoreApps
208220
} = appStore;
209221
const { categories } = categoryStore;
210-
const { category } = match.params;
211222
const categoryTitle = _.get(
212-
_.find(categories, { category_id: category }),
223+
_.find(categories, { category_id: this.category }),
213224
'name',
214225
''
215226
);
@@ -231,9 +242,9 @@ export default class Home extends Component {
231242
<InfiniteScroll
232243
className={styles.apps}
233244
pageStart={currentPage}
234-
loadMore={loadMoreHomeApps}
245+
loadMore={loadMore}
235246
isLoading={isLoading}
236-
hasMore={Boolean(category || this.searchWord) && hasMore}
247+
hasMore={Boolean(this.category || this.searchWord) && hasMore}
237248
>
238249
<AppList
239250
apps={apps}

src/routes/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const AppDetail = lazy(() => import('../pages/AppDetail'));
1313

1414
const routes = {
1515
'/': Home,
16-
'/cat/:category': Home,
16+
1717
'/apps/:appId': [AppDetail, { applyHome: true }],
1818

1919
'/login': Login,

0 commit comments

Comments
 (0)