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 (
+
+ );
+};
+
+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
+
+
);
}