Skip to content

Commit a076161

Browse files
Merge pull request #94 from duynguyenhoang/feature/fix_some_error_while_loading
Fix some render errors (Caused by Loading components) and optimize workspace switching
2 parents 8e5c8ee + c368490 commit a076161

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

app.py

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ def switch_to_workspace(self, workspace_number):
107107
loop.create_task(self.animate_loading())
108108
loop.create_task(self.component_did_mount())
109109

110+
@property
111+
def is_chatbox_rendered(self):
112+
return not self._loading and self.chatbox and type(self.chatbox) is ChatBox
113+
110114
@property
111115
def sidebar(self):
112116
return self.columns.contents[0][0].original_widget
@@ -590,13 +594,13 @@ def scroll_messages(self, *args):
590594

591595
@asyncio.coroutine
592596
def mark_read_slack(self, index):
593-
if not self.chatbox.body or not self.chatbox.body.body:
597+
if not self.is_chatbox_rendered:
594598
return
595599

596600
if index is None or index == -1:
597601
index = len(self.chatbox.body.body) - 1
598602

599-
if self.chatbox.body.body and self.chatbox.body.body and len(self.chatbox.body.body) > index:
603+
if len(self.chatbox.body.body) > index:
600604
message = self.chatbox.body.body[index]
601605

602606
# Only apply for message
@@ -628,11 +632,12 @@ def _go_to_channel(self, channel_id):
628632
messages = self.render_messages(self.store.state.messages, channel_id=channel_id)
629633

630634
header = self.render_chatbox_header()
631-
self.chatbox.body.body[:] = messages
632-
self.chatbox.header = header
633-
self.chatbox.message_box.is_read_only = self.store.state.channel.get('is_read_only', False)
634-
self.sidebar.select_channel(channel_id)
635-
self.urwid_loop.set_alarm_in(0, self.scroll_messages)
635+
if self.is_chatbox_rendered:
636+
self.chatbox.body.body[:] = messages
637+
self.chatbox.header = header
638+
self.chatbox.message_box.is_read_only = self.store.state.channel.get('is_read_only', False)
639+
self.sidebar.select_channel(channel_id)
640+
self.urwid_loop.set_alarm_in(0, self.scroll_messages)
636641

637642
if len(self.store.state.messages) == 0:
638643
self.go_to_sidebar()
@@ -706,7 +711,7 @@ def start_real_time(self):
706711

707712
def stop_typing(*args):
708713
# Prevent error while switching workspace
709-
if self.chatbox is not None:
714+
if self.is_chatbox_rendered:
710715
self.chatbox.message_box.typing = None
711716

712717
alarm = None
@@ -737,6 +742,9 @@ def stop_typing(*args):
737742
)
738743

739744
if event.get('channel') == self.store.state.channel['id']:
745+
if not self.is_chatbox_rendered:
746+
return
747+
740748
if event.get('subtype') == 'message_deleted':
741749
for widget in self.chatbox.body.body:
742750
if hasattr(widget, 'ts') and getattr(widget, 'ts') == event['deleted_ts']:
@@ -753,6 +761,9 @@ def stop_typing(*args):
753761
else:
754762
pass
755763
elif event['type'] == 'user_typing':
764+
if not self.is_chatbox_rendered:
765+
return
766+
756767
if event.get('channel') == self.store.state.channel['id']:
757768
user = self.store.find_user_by_id(event['user'])
758769
name = user.get('display_name') or user.get('real_name') or user['name']
@@ -767,6 +778,9 @@ def stop_typing(*args):
767778
self.store.is_snoozed = event['dnd_status']['snooze_enabled']
768779
self.sidebar.profile.set_snooze(self.store.is_snoozed)
769780
elif event.get('ok', False):
781+
if not self.is_chatbox_rendered:
782+
return
783+
770784
# Message was sent, Slack confirmed it.
771785
self.chatbox.body.body.extend(self.render_messages([{
772786
'text': event['text'],
@@ -853,11 +867,18 @@ def unhandled_input(self, key):
853867
elif key == keymap['open_quick_switcher']:
854868
return self.open_quick_switcher()
855869
elif key in ('1', '2', '3', '4', '5', '6', '7', '8', '9') and len(self.workspaces) >= int(key):
856-
if self.workspaces_line is not None:
857-
self.workspaces_line.select(int(key))
858-
# Stop rtm to switch workspace
859-
self.real_time_task.cancel()
860-
return self.switch_to_workspace(int(key))
870+
# Loading or only 1 workspace
871+
if self._loading or self.workspaces_line is None:
872+
return
873+
874+
# Workspace is selected
875+
if selected_workspace - 1 == self.workspaces_line.selected:
876+
return
877+
878+
self.workspaces_line.select(selected_workspace)
879+
# Stop rtm to switch workspace
880+
self.real_time_task.cancel()
881+
return self.switch_to_workspace(selected_workspace)
861882
elif key == keymap['set_snooze']:
862883
return self.open_set_snooze()
863884

sclack/components.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -943,17 +943,24 @@ def __init__(self, workspaces):
943943
workspace = Workspace(index + 1, name)
944944
urwid.connect_signal(workspace, 'select_workspace', self.switch_workspace)
945945
body.append(('pack', workspace))
946+
self.selected = 0
946947
self.body = body
947948
self.body[0][1].select()
948949
super(Workspaces, self).__init__(urwid.Columns(body), 'workspace_line')
949950

950951
def select(self, number):
951952
for workspace in self.body:
952953
workspace[1].deselect()
954+
953955
if number > 1:
954956
self.body[number - 2][1].select_as_previous()
957+
955958
self.body[number - 1][1].select()
959+
new_selected = number - 1
960+
961+
self.selected = new_selected
956962

957963
def switch_workspace(self, number):
958-
self.select(number)
959-
urwid.emit_signal(self, 'switch_workspace', number)
964+
if number - 1 != self.selected:
965+
self.select(number)
966+
urwid.emit_signal(self, 'switch_workspace', number)

sclack/loading.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def status_message(self):
6060
def status_message(self, value):
6161
self._status_message.set_text(value)
6262

63+
6364
class LoadingSideBar(urwid.Frame):
6465
def __init__(self):
6566
header = TextDivider(placeholder(size=12))
@@ -71,6 +72,19 @@ def __init__(self):
7172
for size in [5, 7, 19, 8, 0, 3, 22, 14, 11, 13]])
7273
super(LoadingSideBar, self).__init__(body, header=header, footer=divider)
7374

75+
def update_items(self, event):
76+
pass
77+
78+
def get_all_channels(self):
79+
return []
80+
81+
def get_all_groups(self):
82+
return []
83+
84+
def get_all_dms(self):
85+
return []
86+
87+
7488
class SlackBot(urwid.Pile):
7589
_matrix = [
7690
[(' \uE0BA', 'white', 'h69'), (' ', 'white', 'white'), ('\uE0B8 ', 'white', 'h200')],

0 commit comments

Comments
 (0)