From b8872a9f64d7908b904b4dc4e84b331254376167 Mon Sep 17 00:00:00 2001 From: Serein <2075337935@qq.com> Date: Mon, 30 Sep 2024 11:19:19 +0800 Subject: [PATCH] fix(ui): unexpected crash when click `StandardListView` on search page (close #69) --- src/Controller/View/SearchPage.cc | 44 ++++++++------- src/Controller/View/SearchPage.h | 2 +- src/Infrastructure/Network/NetworkClient.cc | 11 ++-- ui/views/page/search.slint | 59 +++++++++++---------- 4 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/Controller/View/SearchPage.cc b/src/Controller/View/SearchPage.cc index 437e2397..b83d1feb 100644 --- a/src/Controller/View/SearchPage.cc +++ b/src/Controller/View/SearchPage.cc @@ -30,7 +30,9 @@ void SearchPage::onCreate() { }); self->on_load_department_list([&self = *this] { self.loadDepartmentList(); }); - self->on_load_department_events([&self = *this](int page) { self.loadDepartmentEvents(page); }); + self->on_load_department_events([&self = *this](int page, int departmentIdx) { + self.loadDepartmentEvents(page, departmentIdx); + }); self->on_navigate_to_detail([this](EventStruct eventStruct) { spdlog::debug("navigate to DetailPage, current event is {}", eventStruct.summary.data()); bridge.getViewManager().navigateTo(ViewName::DetailPage, eventStruct); @@ -69,39 +71,35 @@ void SearchPage::loadDepartmentList() { self->set_department( std::make_shared>(model)); - if (!model.empty()) { - self->set_current_department_index(0); - } - self->set_list_state(PageState::Normal); }); } -void SearchPage::loadDepartmentEvents(int page) { +void SearchPage::loadDepartmentEvents(int page, int departmentIdx) { auto& self = *this; - self->set_list_state(PageState::Loading); + self->set_events_state(PageState::Loading); - executor()->asyncExecute( - networkClient()->getDepartmentEventList(std::string(self->get_current_department().text), - page + 1, - self->get_page_size()), - [&self = *this](Result result) { - if (result.isErr()) { - self->set_events_state(PageState::Error); - self.bridge.getMessageManager().showMessage(result.unwrapErr().what(), - MessageType::Error); - return; - } + executor()->asyncExecute(networkClient()->getDepartmentEventList( + std::string(self->get_department()->row_data(departmentIdx)->text), + page + 1, + self->get_page_size()), + [&self = *this](Result result) { + if (result.isErr()) { + self->set_events_state(PageState::Error); + self.bridge.getMessageManager() + .showMessage(result.unwrapErr().what(), MessageType::Error); + return; + } - auto res = result.unwrap(); + auto res = result.unwrap(); - self->set_total(res.total); + self->set_total(res.total); - self->set_event_model(convert::from(res.elements)); + self->set_event_model(convert::from(res.elements)); - self->set_events_state(PageState::Normal); - }); + self->set_events_state(PageState::Normal); + }); } EVENTO_UI_END diff --git a/src/Controller/View/SearchPage.h b/src/Controller/View/SearchPage.h index 00cc316d..88b17218 100644 --- a/src/Controller/View/SearchPage.h +++ b/src/Controller/View/SearchPage.h @@ -16,7 +16,7 @@ class SearchPage : public BasicView, private GlobalAgent { void loadDepartmentList(); - void loadDepartmentEvents(int page); + void loadDepartmentEvents(int page, int departmentIdx); void search(std::string const& keyword); diff --git a/src/Infrastructure/Network/NetworkClient.cc b/src/Infrastructure/Network/NetworkClient.cc index e62499a4..08cf4947 100644 --- a/src/Infrastructure/Network/NetworkClient.cc +++ b/src/Infrastructure/Network/NetworkClient.cc @@ -282,11 +282,12 @@ Task> NetworkClient::getHistoryEventList( Task> NetworkClient::getDepartmentEventList( std::string larkDepartment, int page, int size, std::chrono::steady_clock::duration cacheTtl) { #ifdef EVENTO_API_V1 - auto result = co_await this->request(http::verb::post, - endpoint("/event/list"), - {{"departmentId", - std::to_string( - departmentIdMap[larkDepartment])}}); + auto result = co_await this->request( + http::verb::post, + endpoint("/event/list", + {{"departmentId", std::to_string(departmentIdMap[larkDepartment])}, + {"typeId", ""}, + {"time", ""}})); if (result.isErr()) co_return Err(result.unwrapErr()); diff --git a/ui/views/page/search.slint b/ui/views/page/search.slint index aabc3aca..76ed3130 100644 --- a/ui/views/page/search.slint +++ b/ui/views/page/search.slint @@ -10,19 +10,19 @@ export global SearchPageBridge { in property events-state: normal; in property total: 0; out property page-size: 12; - in-out property current-department; - in-out property current-department-index: -1; callback filter-department(string); callback load-department-list(); - callback load-department-events(int); + callback load-department-events(int, int); callback navigate-to-detail(EventStruct); - public function select(index: int) { - current-department-index = index; - } } export component SearchPage inherits Page { property current-page-index: 0; + property current-department-index: 0; + + changed current-department-index => { + SearchPageBridge.load-department-events(current-page-index, current-department-index); + } TouchArea { pointer-event(e) => { @@ -76,10 +76,11 @@ export component SearchPage inherits Page { if SearchPageBridge.list-state == PageState.normal: Rectangle { StandardListView { model: SearchPageBridge.department; - current-item: SearchPageBridge.current-department-index; current-item-changed(idx) => { - SearchPageBridge.current-department = SearchPageBridge.department[idx]; - SearchPageBridge.load-department-events(root.current-page-index); + if (idx >= 0) { + root.current-department-index = idx; + } + debug(idx); } } } @@ -123,12 +124,12 @@ export component SearchPage inherits Page { Button { text: @tr("重新加载"); clicked => { - SearchPageBridge.load-department-events(current-page-index); + SearchPageBridge.load-department-events(current-page-index, root.current-department-index); } } } - if SearchPageBridge.list-state != PageState.normal || SearchPageBridge.event-model.length == 0: Rectangle { + if SearchPageBridge.list-state != PageState.normal || (SearchPageBridge.event-model.length == 0 && SearchPageBridge.events-state == PageState.normal): Rectangle { Text { text: @tr("什么都没有呢"); font-size: Token.font.body.large.size; @@ -138,25 +139,25 @@ export component SearchPage inherits Page { } } - if SearchPageBridge.total > SearchPageBridge.page-size: Rectangle { - height: 30px; - SPagination { - page-size: SearchPageBridge.page-size; - total: SearchPageBridge.total; - theme: Token.surrealism-ui-default-theme; - active <=> root.current-page-index; + // if SearchPageBridge.total > SearchPageBridge.page-size: Rectangle { + // height: 30px; + // SPagination { + // page-size: SearchPageBridge.page-size; + // total: SearchPageBridge.total; + // theme: Token.surrealism-ui-default-theme; + // active <=> root.current-page-index; - pre => { - SearchPageBridge.load-department-events(root.current-page-index); - } - next => { - SearchPageBridge.load-department-events(root.current-page-index); - } - clicked => { - SearchPageBridge.load-department-events(root.current-page-index); - } - } - } + // pre => { + // SearchPageBridge.load-department-events(root.current-page-index); + // } + // next => { + // SearchPageBridge.load-department-events(root.current-page-index); + // } + // clicked => { + // SearchPageBridge.load-department-events(root.current-page-index); + // } + // } + // } } } }