added frontend for social + feed partiali working

This commit is contained in:
2026-05-18 02:25:47 +02:00
parent e1df55df0e
commit 202ce22102
88 changed files with 4236 additions and 737 deletions

View File

@@ -20,10 +20,13 @@ import type {
} from "@tanstack/react-query";
import type {
ApiSocialPostsFeedListParams,
ApiSocialPostsListParams,
ApiSocialPostsMediaCreateBody,
PaginatedPostList,
PatchedPost,
Post,
PostContent,
PostVote,
TagAttach,
} from "../models";
@@ -712,6 +715,97 @@ export const useApiSocialPostsDestroy = <TError = unknown, TContext = unknown>(
queryClient,
);
};
/**
* Attach an image or video file to a post. Only the post author can upload.
* @summary Upload media to a post
*/
export const apiSocialPostsMediaCreate = (
id: number,
apiSocialPostsMediaCreateBody: ApiSocialPostsMediaCreateBody,
signal?: AbortSignal,
) => {
const formData = new FormData();
formData.append(`file`, apiSocialPostsMediaCreateBody.file);
return privateMutator<PostContent>({
url: `/api/social/posts/${id}/media/`,
method: "POST",
data: formData,
signal,
});
};
export const getApiSocialPostsMediaCreateMutationOptions = <
TError = unknown,
TContext = unknown,
>(options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof apiSocialPostsMediaCreate>>,
TError,
{ id: number; data: ApiSocialPostsMediaCreateBody },
TContext
>;
}): UseMutationOptions<
Awaited<ReturnType<typeof apiSocialPostsMediaCreate>>,
TError,
{ id: number; data: ApiSocialPostsMediaCreateBody },
TContext
> => {
const mutationKey = ["apiSocialPostsMediaCreate"];
const { mutation: mutationOptions } = options
? options.mutation &&
"mutationKey" in options.mutation &&
options.mutation.mutationKey
? options
: { ...options, mutation: { ...options.mutation, mutationKey } }
: { mutation: { mutationKey } };
const mutationFn: MutationFunction<
Awaited<ReturnType<typeof apiSocialPostsMediaCreate>>,
{ id: number; data: ApiSocialPostsMediaCreateBody }
> = (props) => {
const { id, data } = props ?? {};
return apiSocialPostsMediaCreate(id, data);
};
return { mutationFn, ...mutationOptions };
};
export type ApiSocialPostsMediaCreateMutationResult = NonNullable<
Awaited<ReturnType<typeof apiSocialPostsMediaCreate>>
>;
export type ApiSocialPostsMediaCreateMutationBody =
ApiSocialPostsMediaCreateBody;
export type ApiSocialPostsMediaCreateMutationError = unknown;
/**
* @summary Upload media to a post
*/
export const useApiSocialPostsMediaCreate = <
TError = unknown,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof apiSocialPostsMediaCreate>>,
TError,
{ id: number; data: ApiSocialPostsMediaCreateBody },
TContext
>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof apiSocialPostsMediaCreate>>,
TError,
{ id: number; data: ApiSocialPostsMediaCreateBody },
TContext
> => {
return useMutation(
getApiSocialPostsMediaCreateMutationOptions(options),
queryClient,
);
};
/**
* Attaches an existing hub tag to the post. The tag must belong to the same hub as the post. Any authenticated hub member can attach tags.
* @summary Attach a tag to a post
@@ -976,3 +1070,162 @@ export const useApiSocialPostsVoteCreate = <
queryClient,
);
};
/**
* Returns a cursor-paginated stream of top-level posts (excluding replies) aggregated from the user's joined hubs, public hubs, and hub-less posts. Pass `feed_strategy` to switch between ranking algorithms (currently only `recent` is implemented; reserved for future custom algorithms).
* @summary Get the user's post feed
*/
export const apiSocialPostsFeedList = (
params?: ApiSocialPostsFeedListParams,
signal?: AbortSignal,
) => {
return privateMutator<PaginatedPostList>({
url: `/api/social/posts/feed/`,
method: "GET",
params,
signal,
});
};
export const getApiSocialPostsFeedListQueryKey = (
params?: ApiSocialPostsFeedListParams,
) => {
return [`/api/social/posts/feed/`, ...(params ? [params] : [])] as const;
};
export const getApiSocialPostsFeedListQueryOptions = <
TData = Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError = unknown,
>(
params?: ApiSocialPostsFeedListParams,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
TData
>
>;
},
) => {
const { query: queryOptions } = options ?? {};
const queryKey =
queryOptions?.queryKey ?? getApiSocialPostsFeedListQueryKey(params);
const queryFn: QueryFunction<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>
> = ({ signal }) => apiSocialPostsFeedList(params, signal);
return { queryKey, queryFn, ...queryOptions } as UseQueryOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
TData
> & { queryKey: DataTag<QueryKey, TData, TError> };
};
export type ApiSocialPostsFeedListQueryResult = NonNullable<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>
>;
export type ApiSocialPostsFeedListQueryError = unknown;
export function useApiSocialPostsFeedList<
TData = Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError = unknown,
>(
params: undefined | ApiSocialPostsFeedListParams,
options: {
query: Partial<
UseQueryOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
TData
>
> &
Pick<
DefinedInitialDataOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
Awaited<ReturnType<typeof apiSocialPostsFeedList>>
>,
"initialData"
>;
},
queryClient?: QueryClient,
): DefinedUseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
export function useApiSocialPostsFeedList<
TData = Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError = unknown,
>(
params?: ApiSocialPostsFeedListParams,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
TData
>
> &
Pick<
UndefinedInitialDataOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
Awaited<ReturnType<typeof apiSocialPostsFeedList>>
>,
"initialData"
>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
export function useApiSocialPostsFeedList<
TData = Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError = unknown,
>(
params?: ApiSocialPostsFeedListParams,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
TData
>
>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
};
/**
* @summary Get the user's post feed
*/
export function useApiSocialPostsFeedList<
TData = Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError = unknown,
>(
params?: ApiSocialPostsFeedListParams,
options?: {
query?: Partial<
UseQueryOptions<
Awaited<ReturnType<typeof apiSocialPostsFeedList>>,
TError,
TData
>
>;
},
queryClient?: QueryClient,
): UseQueryResult<TData, TError> & {
queryKey: DataTag<QueryKey, TData, TError>;
} {
const queryOptions = getApiSocialPostsFeedListQueryOptions(params, options);
const query = useQuery(queryOptions, queryClient) as UseQueryResult<
TData,
TError
> & { queryKey: DataTag<QueryKey, TData, TError> };
return { ...query, queryKey: queryOptions.queryKey };
}