TootBottomSheet: boost, favourite and bookmark (#6)
This commit is contained in:
		
							parent
							
								
									7f9a16ff5d
								
							
						
					
					
						commit
						9bd4e3acf6
					
				
					 1 changed files with 50 additions and 3 deletions
				
			
		| 
						 | 
					@ -25,6 +25,7 @@ import RegularToot from "./RegularToot";
 | 
				
			||||||
import type { mastodon } from "masto";
 | 
					import type { mastodon } from "masto";
 | 
				
			||||||
import cards from "../material/cards.module.css";
 | 
					import cards from "../material/cards.module.css";
 | 
				
			||||||
import { css } from "solid-styled";
 | 
					import { css } from "solid-styled";
 | 
				
			||||||
 | 
					import { vibrate } from "../platform/hardware";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let cachedEntry: [string, mastodon.v1.Status] | undefined;
 | 
					let cachedEntry: [string, mastodon.v1.Status] | undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,7 +62,7 @@ const TootBottomSheet: Component = (props) => {
 | 
				
			||||||
    return session().account;
 | 
					    return session().account;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [remoteToot] = createResource(
 | 
					  const [remoteToot, { mutate: setRemoteToot }] = createResource(
 | 
				
			||||||
    () => [session().client, params.id] as const,
 | 
					    () => [session().client, params.id] as const,
 | 
				
			||||||
    async ([client, id]) => {
 | 
					    async ([client, id]) => {
 | 
				
			||||||
      return await client.v1.statuses.$select(id).fetch();
 | 
					      return await client.v1.statuses.$select(id).fetch();
 | 
				
			||||||
| 
						 | 
					@ -95,6 +96,45 @@ const TootBottomSheet: Component = (props) => {
 | 
				
			||||||
    return "A toot";
 | 
					    return "A toot";
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const actSession = () => {
 | 
				
			||||||
 | 
					    const s = session();
 | 
				
			||||||
 | 
					    return s.account ? s : undefined;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const onBookmark = async () => {
 | 
				
			||||||
 | 
					    const status = remoteToot()!;
 | 
				
			||||||
 | 
					    const client = actSession()!.client;
 | 
				
			||||||
 | 
					    const result = await (status.bookmarked
 | 
				
			||||||
 | 
					      ? client.v1.statuses.$select(status.id).unbookmark()
 | 
				
			||||||
 | 
					      : client.v1.statuses.$select(status.id).bookmark());
 | 
				
			||||||
 | 
					    setRemoteToot(result);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const onBoost = async () => {
 | 
				
			||||||
 | 
					    const status = remoteToot()!;
 | 
				
			||||||
 | 
					    const client = actSession()!.client;
 | 
				
			||||||
 | 
					    vibrate(50);
 | 
				
			||||||
 | 
					    setRemoteToot(
 | 
				
			||||||
 | 
					      Object.assign({}, status, {
 | 
				
			||||||
 | 
					        reblogged: !status.reblogged,
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    const result = await (status.reblogged
 | 
				
			||||||
 | 
					      ? client.v1.statuses.$select(status.id).unreblog()
 | 
				
			||||||
 | 
					      : client.v1.statuses.$select(status.id).reblog());
 | 
				
			||||||
 | 
					    vibrate([20, 30]);
 | 
				
			||||||
 | 
					    setRemoteToot(result);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const onFav = async () => {
 | 
				
			||||||
 | 
					    const status = remoteToot()!;
 | 
				
			||||||
 | 
					    const client = actSession()!.client;
 | 
				
			||||||
 | 
					    const result = await (status.favourited
 | 
				
			||||||
 | 
					      ? client.v1.statuses.$select(status.id).favourite()
 | 
				
			||||||
 | 
					      : client.v1.statuses.$select(status.id).unfavourite());
 | 
				
			||||||
 | 
					    setRemoteToot(result);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  css`
 | 
					  css`
 | 
				
			||||||
    .bottom-dock {
 | 
					    .bottom-dock {
 | 
				
			||||||
      position: sticky;
 | 
					      position: sticky;
 | 
				
			||||||
| 
						 | 
					@ -140,6 +180,7 @@ const TootBottomSheet: Component = (props) => {
 | 
				
			||||||
            id={`toot-${item.id}`}
 | 
					            id={`toot-${item.id}`}
 | 
				
			||||||
            class={cards.card}
 | 
					            class={cards.card}
 | 
				
			||||||
            status={item}
 | 
					            status={item}
 | 
				
			||||||
 | 
					            actionable={false}
 | 
				
			||||||
          ></RegularToot>
 | 
					          ></RegularToot>
 | 
				
			||||||
        )}
 | 
					        )}
 | 
				
			||||||
      </For>
 | 
					      </For>
 | 
				
			||||||
| 
						 | 
					@ -149,10 +190,15 @@ const TootBottomSheet: Component = (props) => {
 | 
				
			||||||
          <RegularToot
 | 
					          <RegularToot
 | 
				
			||||||
            id={`toot-${toot()!.id}`}
 | 
					            id={`toot-${toot()!.id}`}
 | 
				
			||||||
            class={cards.card}
 | 
					            class={cards.card}
 | 
				
			||||||
            style={{ "scroll-margin-top": "calc(var(--scaffold-topbar-height) + 20px)" }}
 | 
					            style={{
 | 
				
			||||||
 | 
					              "scroll-margin-top": "calc(var(--scaffold-topbar-height) + 20px)",
 | 
				
			||||||
 | 
					            }}
 | 
				
			||||||
            status={toot()!}
 | 
					            status={toot()!}
 | 
				
			||||||
            actionable={true}
 | 
					            actionable={!!actSession()}
 | 
				
			||||||
            evaluated={true}
 | 
					            evaluated={true}
 | 
				
			||||||
 | 
					            onBookmark={onBookmark}
 | 
				
			||||||
 | 
					            onRetoot={onBoost}
 | 
				
			||||||
 | 
					            onFavourite={onFav}
 | 
				
			||||||
          ></RegularToot>
 | 
					          ></RegularToot>
 | 
				
			||||||
        </Show>
 | 
					        </Show>
 | 
				
			||||||
      </article>
 | 
					      </article>
 | 
				
			||||||
| 
						 | 
					@ -175,6 +221,7 @@ const TootBottomSheet: Component = (props) => {
 | 
				
			||||||
            id={`toot-${item.id}`}
 | 
					            id={`toot-${item.id}`}
 | 
				
			||||||
            class={cards.card}
 | 
					            class={cards.card}
 | 
				
			||||||
            status={item}
 | 
					            status={item}
 | 
				
			||||||
 | 
					            actionable={false}
 | 
				
			||||||
          ></RegularToot>
 | 
					          ></RegularToot>
 | 
				
			||||||
        )}
 | 
					        )}
 | 
				
			||||||
      </For>
 | 
					      </For>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue