googleCalendarWeekEndpointmain.tsx3 matches
8const REDIRECT_URI = Deno.env.get("REDIRECT_URI"); // Should be set to your Val Town endpoint URL + "/callback"
910const SCOPES = ["https://www.googleapis.com/auth/calendar.readonly"];
1112export default async function server(request: Request): Promise<Response> {
4647// Exchange code for tokens
48const tokenResponse = await fetch("https://oauth2.googleapis.com/token", {
49method: "POST",
50headers: {
6869const calendarResponse = await fetch(
70`https://www.googleapis.com/calendar/v3/calendars/primary/events?` +
71`timeMin=${now.toISOString()}` +
72`&timeMax=${oneWeekLater.toISOString()}` +
6* Fork this val to your own profile.
7* Make a folder for the temporary vals that get generated, take the ID from the URL, and put it in `tempValsParentFolderId`.
8* If you want to use OpenAI models you need to set the `OPENAI_API_KEY` [env var](https://www.val.town/settings/environment-variables).
9* If you want to use Anthropic models you need to set the `ANTHROPIC_API_KEY` [env var](https://www.val.town/settings/environment-variables).
10* Create a [Val Town API token](https://www.val.town/settings/api), open the browser preview of this val, and use the API token as the password to log in.
1112<img width=500 src="https://imagedelivery.net/iHX6Ovru0O7AjmyT5yZRoA/7077d1b5-1fa7-4a9b-4b93-f8d01d3e4f00/public"/>
valleBlogV0README.md1 match
1* Fork this val to your own profile.
2* Create a [Val Town API token](https://www.val.town/settings/api), open the browser preview of this val, and use the API token as the password to log in.
3
valleBlogV0main.tsx1 match
38model: openai("gpt-4o", {
39baseURL: "https://std-openaiproxy.web.val.run/v1",
40apiKey: Deno.env.get("valtown"),
41} as any),
42messages: [
ReactStreamREADME.md4 matches
3637Custom middleware can be added in an array as the third argument.
38Middleware can add data to the `req.data` object or return a response for things like API endpoints.
3940```tsx
62```tsx
63// example middleware
64async function api (req: Request, res: Response, next): Promise<Response> {
65if (req.pathname !== "/api") return next();
66if (req.method === "POST") {
67return Repsonse.json({ message: "Hello POST request" });
70}
7172export default render(App, import.meta.url, [ api ]);
73```
74
ReactStreammain.tsx7 matches
34const useMiddleware = Array.isArray(opts); // for backwards compat
35const options: ReactStreamOptions = !Array.isArray(opts) ? opts : {};
36const { api, getInitialProps } = options;
3738if (typeof document !== "undefined" && module) {
48// DEPRECATED (for backwards compat)
49options.robots && robots(options.robots),
50options.api && deprecatedCustomAPI(options.api),
51options.getInitialProps && deprecatedGetInitiaProps(options.getInitialProps),
52// New custom middleware
127// DEPRECATED
128// DEPRECATE (for backwards compat)
129const deprecatedCustomAPI = (api?: RequestHandler): Middleware => async (req, res, next) => {
130if (!api) return next();
131if (req.method === "GET") return next();
132return api(req);
133};
134const deprecatedGetInitiaProps = (getProps: DataFetcher<any>): Middleware => async (req, res, next) => {
142/** DEPRECATED: Optional text response for robots.txt */
143robots?: string;
144/** DEPRECATED: Optional API request handler for all non-GET methods */
145api?: RequestHandler;
146/** DEPRECATED: data fetcher to set initial props based on request */
147getInitialProps?: DataFetcher<any>;
endpointCalculatormain.tsx1 match
1/**
2* This program creates a basic calculator endpoint that accepts and returns data in the specified format.
3* It uses a RESTful API approach where the operation is specified in the URL path.
4* The numbers to operate on are passed as query parameters.
5* The result is returned as JSON.
4async function fetchRandomJoke() {
5const response = await fetch(
6"https://official-joke-api.appspot.com/random_joke",
7);
8return response.json();
hungryWhiteLeoponmain.tsx10 matches
1/**
2* This application helps users write detailed reviews of coffee shops. It fetches coffee shop data
3* from the OpenStreetMap Nominatim API, allows users to add custom details, and stores the augmented
4* information in a SQLite database. The app provides a user interface to view, add, and edit coffee shop reviews.
5*
6* It uses React for the frontend, the Nominatim API for initial coffee shop data,
7* and Val Town's SQLite for data persistence.
8*/
30const fetchCoffeeShops = async () => {
31try {
32const response = await fetch(`/api/coffee-shops?search=${encodeURIComponent(searchTerm)}`);
33if (!response.ok) throw new Error("Failed to fetch coffee shops");
34const data = await response.json();
41const fetchReviews = async () => {
42try {
43const response = await fetch("/api/reviews");
44if (!response.ok) throw new Error("Failed to fetch reviews");
45const data = await response.json();
6061try {
62const response = await fetch("/api/reviews", {
63method: "POST",
64headers: { "Content-Type": "application/json" },
192console.log("Table checked/created successfully");
193194if (url.pathname === "/api/coffee-shops") {
195const searchTerm = url.searchParams.get("search") || "";
196// Fetch coffee shops from OpenStreetMap Nominatim API
197const nominatimUrl = `https://nominatim.openstreetmap.org/search?q=coffee+${
198encodeURIComponent(searchTerm)
204});
205if (!nominatimResponse.ok) {
206throw new Error(`Nominatim API error! status: ${nominatimResponse.status}`);
207}
208const nominatimData = await nominatimResponse.json();
209if (!Array.isArray(nominatimData)) {
210throw new Error("Invalid data received from Nominatim API");
211}
212const coffeeShops = nominatimData.map((shop: any) => ({
221}
222223if (url.pathname === "/api/reviews") {
224if (request.method === "GET") {
225const reviews = await sqlite.execute(`SELECT * FROM ${KEY}_coffee_reviews_${SCHEMA_VERSION}`);
63</div>
64<a href={import.meta.url.replace("esm.town", "val.town")} target="_blank" rel="noopener noreferrer" className="view-source">View Source</a>
65<pre className="api-examples">
66{`// Axios example
67const axios = require('axios');
214text-decoration: underline;
215}
216.api-examples {
217margin-top: 20px;
218background-color: #f0f0f0;