feat: share post to other apps
This commit is contained in:
@@ -62,6 +62,11 @@ export type Post = {
|
||||
author_name?: string;
|
||||
author_handle?: string;
|
||||
author_avatar_url?: string | null;
|
||||
/** True when the calling viewer has reshared this post. Populated by
|
||||
* endpoints that go through OptionalAuth (single post, profile feed,
|
||||
* collection contents). Always false / absent for anonymous viewers.
|
||||
* Drives the post-card "Reshare ↔ Send" swap. */
|
||||
viewer_has_reshared?: boolean;
|
||||
};
|
||||
|
||||
export type Bookmark = {
|
||||
@@ -130,6 +135,17 @@ export const posts = {
|
||||
mine() {
|
||||
return call<Post[]>("/posts/mine");
|
||||
},
|
||||
/** Record a reshare. Idempotent — calling twice is a no-op server
|
||||
* side. Resharing your own post is rejected with 400 (not currently
|
||||
* surfaced as a distinct error type because the UI only ever offers
|
||||
* Reshare on non-owned posts). */
|
||||
reshare(id: string) {
|
||||
return call<void>(`/posts/${id}/reshare`, { method: "POST" });
|
||||
},
|
||||
/** Remove a previously recorded reshare. Idempotent. */
|
||||
unreshare(id: string) {
|
||||
return call<void>(`/posts/${id}/reshare`, { method: "DELETE" });
|
||||
},
|
||||
/** R2 presigned PUT for a single post image. Returns the public URL the post should persist. */
|
||||
async uploadImage(file: File): Promise<string> {
|
||||
const { upload_url, public_url } = await call<{
|
||||
|
||||
Reference in New Issue
Block a user