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;
3* It uses React for the UI, leverages emoji and Unicode symbols for a visually rich experience, and
4* incorporates Tailwind CSS for elegant, grayscale styling.
5* The wizard allows users to select tools, libraries, and APIs, then displays them in a shareable format.
6*/
7143{ name: "Discord", icon: "🗣️" },
144{ name: "Mattermost", icon: "📡" },
145{ name: "Zapier", icon: "🔗" },
146{ name: "IFTTT", icon: "🔄" },
147{ name: "Home Assistant", icon: "🏠" },
techstackinventorymain.tsx2 matches
29{Object.entries(techCategories).map(([category, technologies]) => (
30<div key={category} className="mb-6">
31<h2 className="text-xl font-semibold mb-2 text-gray-700 capitalize">{category}</h2>
32<div className="flex flex-wrap gap-2">
33{technologies.map(tech => (
52{Object.entries(selectedTech).map(([category, tech]) => (
53<li key={category} className="text-gray-700">
54<span className="font-medium capitalize">{category}:</span> {tech}
55</li>
56))}
sqliteExplorerAppmain.tsx2 matches
27<head>
28<title>SQLite Explorer</title>
29<link rel="preconnect" href="https://fonts.googleapis.com" />
3031<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
32<link
33href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@300..700&family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap"
34rel="stylesheet"
35/>
sqliteExplorerAppREADME.md1 match
13## Authentication
1415Login to your SQLite Explorer with [password authentication](https://www.val.town/v/pomdtr/password_auth) with your [Val Town API Token](https://www.val.town/settings/api) as the password.
1617## Todos / Plans
AlgoliaDocumentaionmain.tsx1 match
12--template 'InstantSearch.js' \
13--app-id 'L3YFVOR7YL' \
14--api-key '7fb55c7d480ef8b1ad09b55bf3d57afd' \
15--index-name 'Test_index' \
16--attributes-to-display 'chapterTitle' \
valTownUsermain.tsx15 matches
1import { api } from "https://esm.town/v/iamseeley/api";
23let cachedUser = null;
7if (!cachedUser) {
8try {
9cachedUser = await api('/v1/me', { authenticated: true });
10} catch (error) {
11console.error('Error fetching user info:', error);
49async getLikedVals(options = {}) {
50const { offset = 0, limit = 20 } = options;
51return api(`/v1/me/likes?offset=${offset}&limit=${limit}`, { authenticated: true });
52},
53async getComments(options = {}) {
56if (since) url += `&since=${since}`;
57if (until) url += `&until=${until}`;
58return api(url, { authenticated: true });
59},
60async getReferences(options = {}) {
63if (since) url += `&since=${since}`;
64if (until) url += `&until=${until}`;
65return api(url, { authenticated: true });
66},
67async listBlobs(prefix) {
68let url = '/v1/blob';
69if (prefix) url += `?prefix=${encodeURIComponent(prefix)}`;
70return api(url, { authenticated: true });
71},
72async getBlob(key) {
73return api(`/v1/blob/${encodeURIComponent(key)}`, {
74authenticated: true,
75headers: {
80},
81async storeBlob(key, data) {
82return api(`/v1/blob/${encodeURIComponent(key)}`, {
83method: 'POST',
84body: data,
87},
88async deleteBlob(key) {
89return api(`/v1/blob/${encodeURIComponent(key)}`, {
90method: 'DELETE',
91authenticated: true
95const { offset = 0, limit = 20 } = options;
96const userInfo = await this.getUserInfo();
97return api(`/v1/users/${userInfo.id}/vals?offset=${offset}&limit=${limit}`, { authenticated: true });
98},
99async createVal(valInfo) {
100return api('/v1/vals', {
101method: 'POST',
102body: JSON.stringify(valInfo),
105},
106async aliasVal(valName: string) {
107return api(`/v1/alias/${encodeURIComponent(this.username)}/${encodeURIComponent(valName)}`, { authenticated: true });
108},
109async updateVal(valId, updates) {
110return api(`/v1/vals/${valId}`, {
111method: 'PUT',
112body: JSON.stringify(updates),
115},
116async deleteVal(valId) {
117return api(`/v1/vals/${valId}`, {
118method: 'DELETE',
119authenticated: true
121},
122async executeSqlite(statement) {
123return api('/v1/sqlite/execute', {
124method: 'POST',
125body: JSON.stringify({ statement }),
geminiBboxREADME.md1 match
9This app is an adaptation of Simon Willison's idea, which you can read more about here: [https://simonwillison.net/2024/Aug/26/gemini-bounding-box-visualization/](https://simonwillison.net/2024/Aug/26/gemini-bounding-box-visualization/)
1011- API keys are only stored in your browser's local storage.
12- Source code: [https://www.val.town/v/yawnxyz/geminiBbox/](https://www.val.town/v/yawnxyz/geminiBbox/)
13- Original Source: https://github.com/simonw/tools/blob/main/gemini-bbox.html
1import { API_URL } from "https://esm.town/v/std/API_URL";
23export async function api<T = any>(
4path: string,
5options?: RequestInit & {
12if (options?.paginate) {
13const data = [];
14let url = new URL(`${API_URL}${path}`);
15url.searchParams.set("limit", "100");
1633return { data } as T;
34}
35const resp = await fetch(`${API_URL}${path}`, {
36...options,
37headers: {