Skip to content

Commit

Permalink
frontend stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
Brendonovich committed Sep 3, 2023
1 parent 36a5655 commit ae5a34f
Show file tree
Hide file tree
Showing 41 changed files with 2,265 additions and 1,198 deletions.
16 changes: 15 additions & 1 deletion examples/astro/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,21 @@ import { defineConfig } from "astro/config";

import react from "@astrojs/react";
import solid from "@astrojs/solid-js";
import svelte from "@astrojs/svelte";

export default defineConfig({
integrations: [react(), solid()],
integrations: [
react({
include: ["**/react*"],
}),
solid({
include: ["**/solid*"],
}),
svelte({
include: ["**/svelte/*"],
}),
],
server: {
port: 3000,
},
});
Empty file removed examples/astro/dist/.gitkeep
Empty file.
12 changes: 8 additions & 4 deletions examples/astro/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,21 @@
"@rspc/client": "workspace:*",
"@rspc/react-query": "workspace:*",
"@rspc/solid-query": "workspace:*",
"@rspc/svelte-query": "workspace:*",
"@rspc/tauri": "workspace:^",
"@tanstack/react-query": "^4.29.25",
"@tanstack/solid-query": "^4.29.25",
"astro": "2.8.3",
"@tanstack/svelte-query": "^4.29.25",
"astro": "3.0.7",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"solid-js": "^1.7.8"
"solid-js": "^1.7.8",
"svelte": "^4.2.0"
},
"devDependencies": {
"@astrojs/react": "^2.2.1",
"@astrojs/solid-js": "^2.2.0",
"@astrojs/react": "^3.0.0",
"@astrojs/solid-js": "^3.0.0",
"@astrojs/svelte": "^4.0.0",
"@types/react": "^18.2.15",
"typescript": "^5.1.6"
},
Expand Down
28 changes: 16 additions & 12 deletions examples/astro/src/components/react.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { createReactQueryHooks } from "@rspc/react-query";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import React, { useState } from "react";

import "react";

// Export from Rust. Run `cargo run -p example-axum` to start server and export it!
import type { Procedures } from "../../../bindings";

Expand Down Expand Up @@ -57,16 +59,16 @@ const tauriClient = initRspc<Procedures>({

// TODO: Allowing one of these to be used for multiple clients! -> Issue is with key mapper thing
// TODO: Right now we are abusing it not working so plz don't do use one of these with multiple clients in your own apps.
export const rspc = createReactQueryHooks<Procedures>(fetchClient);
export const rspc = createReactQueryHooks<Procedures>();
// export const rspc2 = createReactQueryHooks<Procedures>(wsClient);

function Example({ name }: { name: string }) {
const [rerenderProp, setRendererProp] = useState(Date.now().toString());
const { data: version } = rspc.useQuery(["version"]);
const { data: transformMe } = rspc.useQuery(["transformMe"]);
const { data: echo } = rspc.useQuery(["echo", "Hello From Frontend!"]);
const { mutate, isLoading } = rspc.useMutation("sendMsg");
const { error } = rspc.useQuery(["error"], {
const version = rspc.useQuery(["version"]);
const transformMe = rspc.useQuery(["transformMe"]);
const echo = rspc.useQuery(["echo", "Hello From Frontend!"]);
const sendMsg = rspc.useMutation("sendMsg");
const errorQuery = rspc.useQuery(["error"], {
retry: false,
});

Expand All @@ -87,15 +89,18 @@ function Example({ name }: { name: string }) {
}}
>
<h1>{name}</h1>
<p>Using rspc version: {version}</p>
<p>Echo response: {echo}</p>
<p>Error returned: {JSON.stringify(error)} </p>
<p>Transformed Query: {transformMe}</p>
<p>Using rspc version: {version.data}</p>
<p>Echo response: {echo.data}</p>
<p>Error returned: {JSON.stringify(errorQuery.error)} </p>
<p>Transformed Query: {transformMe.data}</p>
<ExampleSubscription key={rerenderProp} rerenderProp={rerenderProp} />
<button onClick={() => setRendererProp(Date.now().toString())}>
Rerender subscription
</button>
<button onClick={() => mutate("Hello!")} disabled={isLoading}>
<button
onClick={() => sendMsg.mutate("Hello!")}
disabled={sendMsg.isLoading}
>
Send Msg!
</button>
<br />
Expand Down Expand Up @@ -135,7 +140,6 @@ export default function App() {
>
<h1>React</h1>
<QueryClientProvider client={fetchQueryClient}>
{/* TODO: rspc.Provider implies fetchClient??? */}
<rspc.Provider client={fetchClient} queryClient={fetchQueryClient}>
<Example name="Fetch Transport" />
</rspc.Provider>
Expand Down
187 changes: 152 additions & 35 deletions examples/astro/src/components/solid.tsx
Original file line number Diff line number Diff line change
@@ -1,43 +1,160 @@
/** @jsxImportSource solid-js */

// import { createClient, FetchTransport } from "@rspc/client";
// import { createSolidQueryHooks } from "@rspc/solid";
import {
QueryClient,
QueryClientProvider,
createQuery,
} from "@tanstack/solid-query";
import { initRspc, httpLink, wsLink } from "@rspc/client";
import { tauriLink } from "@rspc/tauri";
import { createSolidQueryHooks } from "@rspc/solid-query";
import { QueryClient, QueryClientProvider } from "@tanstack/solid-query";
import { createSignal } from "solid-js";

// Export from Rust. Run `cargo run -p example-axum` to start server and export it!
// import { Procedures } from "../../../bindings";
import type { Procedures } from "../../../bindings";

const fetchQueryClient = new QueryClient();
// const fetchClient = createClient<Procedures>({
// transport: new FetchTransport("http://localhost:4000/rspc"),
// });

// const rspc = createSolidQueryHooks<Procedures>();

// function Example() {
// const echo = rspc.createQuery(() => ["echo", "somevalue"]);
// const sendMsg = rspc.createMutation("sendMsg");

// sendMsg.mutate("Sending");

// return (
// <div style="background-color: rgba(255, 105, 97, .5);">
// <h1>SolidJS</h1>
// <p>{echo.data}</p>
// {/* TODO: Finish SolidJS example */}
// </div>
// );
// }

function App() {
return null;
// {/* <rspc.Provider client={fetchClient} queryClient={fetchQueryClient}> */}
// {/* <Example /> */}
// {/* </rspc.Provider> */}
const fetchClient = initRspc<Procedures>({
links: [
// loggerLink(),

httpLink({
url: "http://localhost:4000/rspc",

// You can enable batching -> This is generally a good idea unless your doing HTTP caching
// batch: true,

// You can override the fetch function if required
// fetch: (input, init) => fetch(input, { ...init, credentials: "include" }), // Include Cookies for cross-origin requests

// Provide static custom headers
// headers: {
// "x-demo": "abc",
// },

// Provide dynamic custom headers
// headers: ({ op }) => ({
// "x-procedure-path": op.path,
// }),
}),
],
});

const wsQueryClient = new QueryClient();
const wsClient = initRspc<Procedures>({
links: [
// loggerLink(),

wsLink({
url: "ws://localhost:4000/rspc/ws",
}),
],
});

const tauriQueryClient = new QueryClient();
const tauriClient = initRspc<Procedures>({
links: [
// loggerLink(),

tauriLink(),
],
});

// TODO: Allowing one of these to be used for multiple clients! -> Issue is with key mapper thing
// TODO: Right now we are abusing it not working so plz don't do use one of these with multiple clients in your own apps.
export const rspc = createSolidQueryHooks<Procedures>();
// export const rspc2 = createReactQueryHooks<Procedures>(wsClient);

function Example({ name }: { name: string }) {
const [rerenderProp, setRendererProp] = createSignal(Date.now().toString());
const version = rspc.createQuery(() => ["version"]);
const transformMe = rspc.createQuery(() => ["transformMe"]);
const echo = rspc.createQuery(() => ["echo", "Hello From Frontend!"]);
const sendMsg = rspc.createMutation("sendMsg");
const error = rspc.createQuery(() => ["error"], {
retry: false,
});

const [subId, setSubId] = createSignal<number | null>(null);
const [enabled, setEnabled] = createSignal(true);

rspc.createSubscription(
() => ["testSubscriptionShutdown"],
() => ({
enabled: enabled(),
onData(msg) {
setSubId(msg);
},
})
);

return (
<div
style={{
border: "black 1px solid",
}}
>
<h1>{name}</h1>
<p>Using rspc version: {version.data}</p>
<p>Echo response: {echo.data}</p>
<p>Error returned: {JSON.stringify(error.error)} </p>
<p>Transformed Query: {transformMe.data}</p>
<ExampleSubscription rerenderProp={rerenderProp()} />
<button onClick={() => setRendererProp(Date.now().toString())}>
Rerender subscription
</button>
<button
onClick={() => sendMsg.mutate("Hello!")}
disabled={sendMsg.isLoading}
>
Send Msg!
</button>
<br />
<input
type="checkbox"
onClick={(e) => setEnabled((e.currentTarget as any).checked)}
value="false"
disabled={subId() === null}
/>
{`${enabled() ? "Enabled" : "Disabled"} ${subId()}`}
</div>
);
}

export default App;
function ExampleSubscription({ rerenderProp }: { rerenderProp: string }) {
const [i, setI] = createSignal(0);
rspc.createSubscription(
() => ["pings"],
() => ({
onData(_) {
setI((i) => i + 1);
},
})
);

return (
<p>
Pings received: {i()} {rerenderProp}
</p>
);
}

export default function App() {
return (
<div style="backgroundColor: 'rgba(50, 205, 50, .5)'">
<h1>Solid</h1>
{/* TODO: rspc.Provider implies fetchClient??? */}
<rspc.Provider client={fetchClient} queryClient={fetchQueryClient}>
<QueryClientProvider client={fetchQueryClient}>
<Example name="Fetch Transport" />
</QueryClientProvider>
</rspc.Provider>
<rspc.Provider client={wsClient} queryClient={wsQueryClient}>
<QueryClientProvider client={wsQueryClient}>
<Example name="Websocket Transport" />
</QueryClientProvider>
</rspc.Provider>
<rspc.Provider client={tauriClient} queryClient={tauriQueryClient}>
<QueryClientProvider client={tauriQueryClient}>
<Example name="Tauri Transport" />
</QueryClientProvider>
</rspc.Provider>
</div>
);
}
55 changes: 55 additions & 0 deletions examples/astro/src/components/svelte/Example.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<script lang="ts">
import { createSvelteQueryHooks } from "@rspc/svelte-query";
import type { Procedures } from "../../bindings.ts";
import ExampleSubscription from "./ExampleSubscription.svelte";
export let name: string;
const rspc = createSvelteQueryHooks<Procedures>();
let rerenderProp = Date.now().toString();
const version = rspc.createQuery(["version"]);
const transformMe = rspc.createQuery(["transformMe"]);
const echo = rspc.createQuery(["echo", "Hello From Frontend!"]);
const sendMsg = rspc.createMutation("sendMsg");
const error = rspc.createQuery(["error"], {
retry: false,
});
let subId: number | null = null;
let enabled = true;
rspc.createSubscription(["testSubscriptionShutdown"], {
enabled,
onData(msg) {
subId = msg;
},
});
</script>

<div style="border: 'black 1px solid'">
<h1>{name}</h1>
<p>Using rspc version: {$version.data}</p>
<p>Echo response: {$echo.data}</p>
<p>Error returned: {JSON.stringify($error.error)}</p>
<p>Transformed Query: {$transformMe.data}</p>
<ExampleSubscription {rerenderProp} />
<button on:click={() => (rerenderProp = Date.now().toString())}>
Rerender subscription
</button>
<button
on:click={() => $sendMsg.mutate("Hello!")}
disabled={$sendMsg.isLoading}
>
Send Msg!
</button>
<br />
<input
type="checkbox"
on:click={(e) => (enabled = e.currentTarget.checked)}
value="false"
disabled={subId === null}
/>
{`${enabled ? "Enabled" : "Disabled"} ${subId}`}
</div>
20 changes: 20 additions & 0 deletions examples/astro/src/components/svelte/ExampleSubscription.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<script lang="ts">
import { createSvelteQueryHooks } from "@rspc/svelte-query";
import type { Procedures } from "../../bindings.ts";
const rspc = createSvelteQueryHooks<Procedures>();
export let rerenderProp: string;
let i = 0;
rspc.createSubscription(["pings"], {
onData(_) {
i = i + 1;
},
});
</script>

<p>
Pings received: {i}
{rerenderProp}
</p>
Loading

0 comments on commit ae5a34f

Please sign in to comment.