diff --git a/src/components/shortener/createRedirectionForm.tsx b/src/components/shortener/createRedirectionForm.tsx new file mode 100644 index 0000000..9a64627 --- /dev/null +++ b/src/components/shortener/createRedirectionForm.tsx @@ -0,0 +1,67 @@ +import { useConnectMutation } from "~/integrations/connect-query/solid"; +import { createURLRedirection } from "~/gen/proto/shorten/v1/shorten-ShortenService_connectquery"; +import useAppForm from "../form/appform"; +import { Button } from "../ui/button"; + +const CreateRedirectionForm = () => { + const mutation = useConnectMutation(createURLRedirection); + + const form = useAppForm(() => ({ + defaultValues: { + url: "", + slug: "", + }, + onSubmit: async (values) => { + await mutation.mutateAsync({ + url: values.value.url, + shortCode: values.value.slug, + }); + }, + })); + return ( +
{ + e.preventDefault(); + e.stopPropagation(); + form.handleSubmit(); + }} + > +
+

Create New Redirection

+
+
+ ( + + )} + /> +
+
+ ( + + )} + /> +
+ +
+
+
+ ); +}; + +export default CreateRedirectionForm; diff --git a/src/components/shortener/listRedirections.tsx b/src/components/shortener/listRedirections.tsx new file mode 100644 index 0000000..3a3e1d4 --- /dev/null +++ b/src/components/shortener/listRedirections.tsx @@ -0,0 +1,27 @@ +import { For, Match, Switch } from "solid-js"; +import { listURLRedirections } from "~/gen/proto/shorten/v1/shorten-ShortenService_connectquery"; +import { useConnectQuery } from "~/integrations/connect-query/solid"; + +const ListRedirections = () => { + const query = useConnectQuery(listURLRedirections); + + return ( +
+ Loading...
}> + +
Error: {query.error?.message}
+
+ +
Loading...
+
+ + + {(item) =>
{item.url}
} +
+
+ + + ); +}; + +export default ListRedirections; diff --git a/src/integrations/connect-query/solid.tsx b/src/integrations/connect-query/solid.tsx index f4bcb7c..b62580f 100644 --- a/src/integrations/connect-query/solid.tsx +++ b/src/integrations/connect-query/solid.tsx @@ -1,10 +1,20 @@ import { createContext, useContext } from "solid-js"; import type { JSX } from "solid-js"; import type { Transport, ConnectError } from "@connectrpc/connect"; -import { createQuery } from "@tanstack/solid-query"; -import type { CreateQueryResult, CreateQueryOptions } from "@tanstack/solid-query"; -import { createQueryOptions } from "@connectrpc/connect-query"; -import type { DescMethodUnary, DescMessage, MessageInitShape, MessageShape } from "@bufbuild/protobuf"; +import { createQuery, createMutation } from "@tanstack/solid-query"; +import type { + CreateQueryResult, + CreateQueryOptions, + CreateMutationResult, + CreateMutationOptions, +} from "@tanstack/solid-query"; +import { createQueryOptions, callUnaryMethod } from "@connectrpc/connect-query"; +import type { + DescMethodUnary, + DescMessage, + MessageInitShape, + MessageShape, +} from "@bufbuild/protobuf"; const TransportContext = createContext(); @@ -31,15 +41,15 @@ export function useTransport() { return transport; } -export function useConnectQuery< - I extends DescMessage, - O extends DescMessage ->( +export function useConnectQuery( schema: DescMethodUnary, input?: MessageInitShape, - options?: Omit, ConnectError>, "queryKey" | "queryFn"> & { + options?: Omit< + CreateQueryOptions, ConnectError>, + "queryKey" | "queryFn" + > & { transport?: Transport; - } + }, ): CreateQueryResult, ConnectError> { const contextTransport = useTransport(); @@ -52,3 +62,29 @@ export function useConnectQuery< } as any; }); } + +export function useConnectMutation< + I extends DescMessage, + O extends DescMessage, + Ctx = unknown +>( + schema: DescMethodUnary, + options?: Omit< + CreateMutationOptions, ConnectError, MessageInitShape, Ctx>, + "mutationFn" + > & { + transport?: Transport; + }, +): CreateMutationResult, ConnectError, MessageInitShape, Ctx> { + const contextTransport = useTransport(); + + return createMutation(() => { + const transport = options?.transport ?? contextTransport; + return { + ...options, + mutationFn: async (input: MessageInitShape) => { + return callUnaryMethod(transport, schema, input); + }, + }; + }); +} diff --git a/src/routes/shorten.tsx b/src/routes/shorten.tsx index b2d7e53..207c3f9 100644 --- a/src/routes/shorten.tsx +++ b/src/routes/shorten.tsx @@ -2,29 +2,19 @@ import { useConnectQuery } from "~/integrations/connect-query/solid"; import { createFileRoute } from "@tanstack/solid-router"; import { listURLRedirections } from "~/gen/proto/shorten/v1/shorten-ShortenService_connectquery"; import { For, Match, Switch } from "solid-js"; +import ListRedirections from "~/components/shortener/listRedirections"; +import CreateRedirectionForm from "~/components/shortener/createRedirectionForm"; export const Route = createFileRoute("/shorten")({ component: RouteComponent, }); function RouteComponent() { - const query = useConnectQuery(listURLRedirections, {}); - return ( -
- Loading...
}> - -
Error: {query.error?.message}
-
- -
Loading...
-
- - - {(item) =>
{item.url}
} -
-
- +
+

URL Redirections

+ +
); }