diff --git a/src/Feed/EventPublisher.ts b/src/Feed/EventPublisher.ts index f621cf7c..5d2a4f66 100644 --- a/src/Feed/EventPublisher.ts +++ b/src/Feed/EventPublisher.ts @@ -304,4 +304,4 @@ const barierNip07 = async (then: () => Promise) => { } finally { isNip07Busy = false; } -}; \ No newline at end of file +}; diff --git a/src/Feed/LoginFeed.ts b/src/Feed/LoginFeed.ts index 71ff6c2b..c5b99963 100644 --- a/src/Feed/LoginFeed.ts +++ b/src/Feed/LoginFeed.ts @@ -30,6 +30,7 @@ export default function useLoginFeed() { sub.Id = `login:meta`; sub.Authors = new Set([pubKey]); sub.Kinds = new Set([EventKind.ContactList, EventKind.SetMetadata]); + sub.Limit = 2 return sub; }, [pubKey]); @@ -92,7 +93,7 @@ export default function useLoginFeed() { dispatch(setRelays({ relays, createdAt: cl.created_at })); } let pTags = cl.tags.filter(a => a[0] === "p").map(a => a[1]); - dispatch(setFollows(pTags)); + dispatch(setFollows({ keys: pTags, createdAt: cl.created_at })); } (async () => { diff --git a/src/Feed/MuteList.ts b/src/Feed/MuteList.ts index 40134593..f5fd2d7c 100644 --- a/src/Feed/MuteList.ts +++ b/src/Feed/MuteList.ts @@ -27,7 +27,7 @@ export default function useMutedFeed(pubkey: HexKey) { return useSubscription(sub); } -export function getMutedKeys(rawNotes: TaggedRawEvent[]): { at: number, keys: HexKey[] } { +export function getMutedKeys(rawNotes: TaggedRawEvent[]): { createdAt: number, keys: HexKey[] } { const notes = [...rawNotes] notes.sort((a, b) => a.created_at - b.created_at) const newest = notes && notes[0] @@ -36,12 +36,12 @@ export function getMutedKeys(rawNotes: TaggedRawEvent[]): { at: number, keys: He const mutedIndex = tags.findIndex(t => t[0] === "d" && t[1] === MUTE_LIST_TAG) if (mutedIndex !== -1) { return { - at: newest.created_at, + createdAt: newest.created_at, keys: tags.slice(mutedIndex).filter(t => t[0] === "p").map(t => t[1]) } } } - return { at: 0, keys: [] } + return { createdAt: 0, keys: [] } } export function getMuted(feed: NoteStore, pubkey: HexKey): HexKey[] { diff --git a/src/Hooks/useModeration.tsx b/src/Hooks/useModeration.tsx index b8aebb12..ab529491 100644 --- a/src/Hooks/useModeration.tsx +++ b/src/Hooks/useModeration.tsx @@ -28,7 +28,7 @@ export default function useModeration() { function unmute(id: HexKey) { const newMuted = muted.filter(p => p !== id) dispatch(setMuted({ - at: new Date().getTime(), + createdAt: new Date().getTime(), keys: newMuted })) setMutedList(newMuted) @@ -38,7 +38,7 @@ export default function useModeration() { const newMuted = muted.concat([id]) setMutedList(newMuted) dispatch(setMuted({ - at: new Date().getTime(), + createdAt: new Date().getTime(), keys: newMuted })) } @@ -47,7 +47,7 @@ export default function useModeration() { const newMuted = Array.from(new Set(muted.concat(ids))) setMutedList(newMuted) dispatch(setMuted({ - at: new Date().getTime(), + createdAt: new Date().getTime(), keys: newMuted })) } diff --git a/src/State/Login.ts b/src/State/Login.ts index e3fdb8f7..cc6dec7f 100644 --- a/src/State/Login.ts +++ b/src/State/Login.ts @@ -72,6 +72,11 @@ export interface LoginStore { */ follows: HexKey[], + /** + * Newest relay list timestamp + */ + latestFollows: number, + /** * A list of pubkeys this user has muted */ @@ -80,7 +85,7 @@ export interface LoginStore { /** * Last seen mute list event timestamp */ - lastMutedSeenAt: number, + latestMuted: number, /** * Notifications for this login session @@ -115,8 +120,9 @@ const InitState = { relays: {}, latestRelays: 0, follows: [], - lastMutedSeenAt: 0, + latestFollows: 0, muted: [], + latestMuted: 0, notifications: [], readNotifications: new Date().getTime(), dms: [], @@ -136,6 +142,11 @@ export interface SetRelaysPayload { createdAt: number }; +export interface SetFollowsPayload { + keys: HexKey[] + createdAt: number +}; + const LoginSlice = createSlice({ name: "Login", initialState: InitState, @@ -204,9 +215,14 @@ const LoginSlice = createSlice({ delete state.relays[action.payload]; state.relays = { ...state.relays }; }, - setFollows: (state, action: PayloadAction) => { + setFollows: (state, action: PayloadAction) => { + const { keys, createdAt } = action.payload + if (state.latestFollows > createdAt) { + return; + } + let existing = new Set(state.follows); - let update = Array.isArray(action.payload) ? action.payload : [action.payload]; + let update = Array.isArray(keys) ? keys : [keys]; let changes = false; for (let pk of update) { @@ -217,14 +233,15 @@ const LoginSlice = createSlice({ } if (changes) { state.follows = Array.from(existing); + state.latestFollows = createdAt; } }, - setMuted(state, action: PayloadAction<{at: number, keys: HexKey[]}>) { - const { at, keys } = action.payload - if (at > state.lastMutedSeenAt) { + setMuted(state, action: PayloadAction<{createdAt: number, keys: HexKey[]}>) { + const { createdAt, keys } = action.payload + if (createdAt > state.latestMuted) { const muted = new Set([...keys]) state.muted = Array.from(muted) - state.lastMutedSeenAt = at + state.latestMuted = createdAt } }, addNotifications: (state, action: PayloadAction) => {