added createTimelineSnapshot
This commit is contained in:
		
							parent
							
								
									efc894793e
								
							
						
					
					
						commit
						ab29e5fd70
					
				
					 1 changed files with 54 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -109,3 +109,57 @@ export function useTimeline(
 | 
			
		|||
    },
 | 
			
		||||
  ] as const;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createTimelineSnapshot(
 | 
			
		||||
  timeline: Accessor<Timeline>,
 | 
			
		||||
  limit: Accessor<number>,
 | 
			
		||||
) {
 | 
			
		||||
  const [shot, {refetch}] = createResource(
 | 
			
		||||
    () => [timeline(), limit()] as const,
 | 
			
		||||
    async ([tl, limit]) => {
 | 
			
		||||
      const ls = await tl.list({ limit }).next();
 | 
			
		||||
      return ls.value?.map((x) => [x]) ?? [];
 | 
			
		||||
    },
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  const [snapshot, setSnapshot] = createStore([] as mastodon.v1.Status[][]);
 | 
			
		||||
 | 
			
		||||
  createEffect(() => {
 | 
			
		||||
    const nls = shot();
 | 
			
		||||
    if (!nls) return;
 | 
			
		||||
    const ols = Array.from(snapshot);
 | 
			
		||||
    // The algorithm below assumes the snapshot is not changing
 | 
			
		||||
    for (let i = 0; i < nls.length; i++) {
 | 
			
		||||
      if (i >= ols.length) {
 | 
			
		||||
        setSnapshot(i, nls[i]);
 | 
			
		||||
      } else {
 | 
			
		||||
        if (nls[i].length !== ols[i].length) {
 | 
			
		||||
          setSnapshot(i, nls[i]);
 | 
			
		||||
        } else {
 | 
			
		||||
          const oth = ols[i],
 | 
			
		||||
            nth = nls[i];
 | 
			
		||||
          for (let j = 0; j < oth.length; j++) {
 | 
			
		||||
            const ost = oth[j],
 | 
			
		||||
              nst = nth[j];
 | 
			
		||||
            for (const key of Object.keys(
 | 
			
		||||
              nst,
 | 
			
		||||
            ) as unknown as (keyof mastodon.v1.Status)[]) {
 | 
			
		||||
              if (ost[key] !== nst[key]) {
 | 
			
		||||
                setSnapshot(i, j, key, nst[key]);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return [snapshot, shot, {
 | 
			
		||||
    refetch,
 | 
			
		||||
    mutate: setSnapshot
 | 
			
		||||
  }] as const;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createTimeline(timeline: Accessor<Timeline>) {
 | 
			
		||||
  // TODO
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue