Skip to content

Commit

Permalink
Merge pull request #163 from h3poteto/iss-105
Browse files Browse the repository at this point in the history
refs #105 Handle status removed events
  • Loading branch information
h3poteto authored Dec 12, 2022
2 parents b4e67e6 + 129c395 commit f23565c
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 26 deletions.
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
rust 1.61.0
rust 1.65.0
nodejs 18.9.1
36 changes: 36 additions & 0 deletions src-tauri/src/streaming.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ pub struct ReceiveHomeStatusPayload {
status: megalodon::entities::Status,
}

#[derive(Clone, Serialize)]
pub struct DeleteHomeStatusPayload {
server_id: i64,
status_id: String,
}

#[derive(Clone, Serialize)]
pub struct ReceiveNotificationPayload {
server_id: i64,
Expand All @@ -24,6 +30,12 @@ pub struct ReceiveTimelineStatusPayload {
status: megalodon::entities::Status,
}

#[derive(Clone, Serialize)]
pub struct DeleteTimelineStatusPayload {
timeline_id: i64,
status_id: String,
}

pub async fn start_user(
app_handle: Arc<AppHandle>,
server: &entities::Server,
Expand Down Expand Up @@ -77,6 +89,18 @@ pub async fn start_user(
)
.unwrap();
}
Message::Delete(status_id) => {
log::debug!("receive delete");
app_handle
.emit_all(
"delete-home-status",
DeleteHomeStatusPayload {
server_id,
status_id,
},
)
.unwrap();
}
_ => {}
}));

Expand Down Expand Up @@ -149,6 +173,18 @@ pub async fn start(
)
.unwrap();
}
Message::Delete(status_id) => {
log::debug!("receive delete");
app_handle
.emit_all(
"delete-timeline-status",
DeleteTimelineStatusPayload {
timeline_id,
status_id,
},
)
.unwrap();
}
_ => {}
}));

Expand Down
70 changes: 45 additions & 25 deletions src/components/timelines/Timeline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { Server } from 'src/entities/server'
import { Timeline } from 'src/entities/timeline'
import Status from './status/Status'
import FailoverImg from 'src/utils/failoverImg'
import { ReceiveHomeStatusPayload, ReceiveTimelineStatusPayload } from 'src/payload'
import { DeleteHomeStatusPayload, DeleteTimelineStatusPayload, ReceiveHomeStatusPayload, ReceiveTimelineStatusPayload } from 'src/payload'
import { TIMELINE_STATUSES_COUNT, TIMELINE_MAX_STATUSES } from 'src/defaults'

type Props = {
Expand Down Expand Up @@ -67,21 +67,19 @@ const Timeline: React.FC<Props> = props => {
}

if (scrollerRef.current && scrollerRef.current.scrollTop > 10) {
setUnreadStatuses(last => {
if (last.find(s => s.id === ev.payload.status.id && s.uri === ev.payload.status.uri)) {
return last
}
return [ev.payload.status].concat(last)
})
setUnreadStatuses(last => prependStatus(last, ev.payload.status))
return
}

setStatuses(last => {
if (last.find(s => s.id === ev.payload.status.id && s.uri === ev.payload.status.uri)) {
return last
}
return [ev.payload.status].concat(last).slice(0, TIMELINE_STATUSES_COUNT)
})
setStatuses(last => appendStatus(last, ev.payload.status))
})

listen<DeleteHomeStatusPayload>('delete-home-status', ev => {
if (ev.payload.server_id !== props.server.id) {
return
}
setUnreadStatuses(last => deleteStatus(last, ev.payload.status_id))
setStatuses(last => deleteStatus(last, ev.payload.status_id))
})
} else {
listen<ReceiveTimelineStatusPayload>('receive-timeline-status', ev => {
Expand All @@ -90,21 +88,19 @@ const Timeline: React.FC<Props> = props => {
}

if (scrollerRef.current && scrollerRef.current.scrollTop > 10) {
setUnreadStatuses(last => {
if (last.find(s => s.id === ev.payload.status.id && s.uri === ev.payload.status.uri)) {
return last
}
return [ev.payload.status].concat(last)
})
setUnreadStatuses(last => prependStatus(last, ev.payload.status))
return
}

setStatuses(last => {
if (last.find(s => s.id === ev.payload.status.id && s.uri === ev.payload.status.uri)) {
return last
}
return [ev.payload.status].concat(last).slice(0, TIMELINE_STATUSES_COUNT)
})
setStatuses(last => appendStatus(last, ev.payload.status))
})

listen<DeleteTimelineStatusPayload>('delete-timeline-status', ev => {
if (ev.payload.timeline_id !== props.timeline.id) {
return
}
setUnreadStatuses(last => deleteStatus(last, ev.payload.status_id))
setStatuses(last => deleteStatus(last, ev.payload.status_id))
})
}
}, [])
Expand Down Expand Up @@ -321,4 +317,28 @@ const alert = (type: 'info' | 'success' | 'warning' | 'error', message: string)
</Message>
)

const prependStatus = (statuses: Array<Entity.Status>, status: Entity.Status): Array<Entity.Status> => {
if (statuses.find(s => s.id === status.id && s.uri === status.uri)) {
return statuses
}
return [status].concat(statuses)
}

const appendStatus = (statuses: Array<Entity.Status>, status: Entity.Status): Array<Entity.Status> => {
if (statuses.find(s => s.id === status.id && s.uri === status.uri)) {
return statuses
}
return [status].concat(statuses).slice(0, TIMELINE_STATUSES_COUNT)
}

const deleteStatus = (statuses: Array<Entity.Status>, deleted_id: string): Array<Entity.Status> => {
return statuses.filter(status => {
if (status.reblog !== null && status.reblog.id === deleted_id) {
return false
} else {
return status.id !== deleted_id
}
})
}

export default Timeline
10 changes: 10 additions & 0 deletions src/payload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,17 @@ export type ReceiveHomeStatusPayload = {
status: Entity.Status
}

export type DeleteHomeStatusPayload = {
server_id: number
status_id: string
}

export type ReceiveTimelineStatusPayload = {
timeline_id: number
status: Entity.Status
}

export type DeleteTimelineStatusPayload = {
timeline_id: number
status_id: string
}

0 comments on commit f23565c

Please sign in to comment.