-
+
No breweries found matching "{getSearchQuery()}". Try a different search
term.
diff --git a/src/routes/breweries/+page.ts b/src/routes/breweries/+page.ts
index 735ffc8..ee0d0b9 100644
--- a/src/routes/breweries/+page.ts
+++ b/src/routes/breweries/+page.ts
@@ -5,6 +5,8 @@ import type { Brewery, Metadata } from '$lib/types';
export async function load({ url }) {
const rawQuery = url.searchParams.get('query');
const query = (rawQuery ?? '').trim();
+ const byState = url.searchParams.get('by_state');
+ const byType = url.searchParams.get('by_type');
if (rawQuery !== null && query === '') {
throw redirect(302, '/breweries');
@@ -13,7 +15,7 @@ export async function load({ url }) {
const page = parseInt(url.searchParams.get('page') || '1');
const per_page = parseInt(url.searchParams.get('per_page') || '20');
- if (!query) {
+ if (!query && !byState && !byType) {
return {
breweries: [],
meta: {
@@ -26,35 +28,93 @@ export async function load({ url }) {
}
try {
- const searchUrl = `${API_URL}/breweries/search?query=${encodeURIComponent(query)}&page=${page}&per_page=${per_page}`;
- const response = await fetch(searchUrl);
-
- if (!response.ok) {
- return {
- breweries: [],
- meta: {
- total: '0',
- page: page.toString(),
- per_page: per_page.toString(),
- query,
- },
- error: `Search failed with status ${response.status}`,
+ let breweries: Brewery[] = [];
+ let meta: Metadata;
+
+ if (query) {
+ // Calculate start index and map it to API batch page number of size 200
+ const svelteStart = (page - 1) * per_page;
+ const apiPage = Math.floor(svelteStart / 200) + 1;
+ const localOffset = svelteStart % 200;
+
+ const apiUrl = `${API_URL}/breweries/search?query=${encodeURIComponent(query)}&page=${apiPage}&per_page=200`;
+ const response = await fetch(apiUrl);
+
+ if (!response.ok) {
+ return {
+ breweries: [],
+ meta: {
+ total: '0',
+ page: page.toString(),
+ per_page: per_page.toString(),
+ query: query,
+ },
+ error: `Request failed with status ${response.status}`,
+ };
+ }
+
+ const apiBreweries: Brewery[] = await response.json();
+ breweries = apiBreweries.slice(localOffset, localOffset + per_page);
+
+ let total: number;
+ if (apiBreweries.length < 200) {
+ // We reached the actual end of results
+ total = (apiPage - 1) * 200 + apiBreweries.length;
+ } else {
+ // We got exactly 200 results, so there might be more beyond this batch.
+ // We do progressive discovery beyond the currently fetched batch size.
+ total = (apiPage - 1) * 200 + apiBreweries.length;
+ if (localOffset + per_page >= apiBreweries.length) {
+ total += per_page;
+ }
+ }
+
+ meta = {
+ total: total.toString(),
+ page: page.toString(),
+ per_page: per_page.toString(),
+ query: query,
};
- }
+ } else {
+ let apiUrl = `${API_URL}/breweries/?page=${page}&per_page=${per_page}`;
+ let metaUrl = `${API_URL}/breweries/meta?page=${page}&per_page=${per_page}`;
- const breweries: Brewery[] = await response.json();
+ if (byState) {
+ apiUrl += `&by_state=${encodeURIComponent(byState)}`;
+ metaUrl += `&by_state=${encodeURIComponent(byState)}`;
+ }
- const total =
- breweries.length >= per_page
- ? page * per_page + per_page
- : (page - 1) * per_page + breweries.length;
+ if (byType) {
+ apiUrl += `&by_type=${encodeURIComponent(byType)}`;
+ metaUrl += `&by_type=${encodeURIComponent(byType)}`;
+ }
- const meta: Metadata = {
- total: total.toString(),
- page: page.toString(),
- per_page: per_page.toString(),
- query: query,
- };
+ const response = await fetch(apiUrl);
+ const metaResponse = await fetch(metaUrl);
+
+ if (!response.ok) {
+ return {
+ breweries: [],
+ meta: {
+ total: '0',
+ page: page.toString(),
+ per_page: per_page.toString(),
+ query: '',
+ },
+ error: `Request failed with status ${response.status}`,
+ };
+ }
+
+ breweries = await response.json();
+ const metaResult = await metaResponse.json();
+
+ meta = {
+ total: metaResult.total,
+ page: page.toString(),
+ per_page: per_page.toString(),
+ query: '',
+ };
+ }
return {
breweries,
diff --git a/src/routes/breweries/browse/+page.svelte b/src/routes/breweries/browse/+page.svelte
index 6fa44af..e63e4fa 100644
--- a/src/routes/breweries/browse/+page.svelte
+++ b/src/routes/breweries/browse/+page.svelte
@@ -1,68 +1,165 @@
-
-
Browse Breweries
+
+
+
+
+
+ Explore Breweries
+
+
+ Discover breweries around the world through our curated browsing
+ experience
+
+
- {#if error}
-
- {:else}
-
-
-
- By State/Province
-
- {#if byState.length > 0}
-
- {#each byState as item (item.name)}
-
- {item.name}
- {item.count} breweries
-
- {/each}
+ {#if error}
+
+ {:else}
+
+
+
+
+
+ By Country
+
- {:else}
- No states available to browse.
- {/if}
-
+ {#if byCountry.length > 0}
+
+ {:else}
+
+ No countries available to browse.
+
+ {/if}
+
-
-
- By Type
- {#if byType.length > 0}
-
- {#each byType as item (item.name)}
-
- {item.name}
- {item.count} breweries
-
- {/each}
+
+
+
+
+
+ By State/Province
+
- {:else}
- No types available to browse.
- {/if}
-
- {/if}
+ {#if byState.length > 0}
+
+ {:else}
+
No states available to browse.
+ {/if}
+
+
+
+
+
+
+
+ By Type
+
+
+ {#if byType.length > 0}
+
+ {:else}
+ No types available to browse.
+ {/if}
+
+ {/if}
+
diff --git a/src/routes/breweries/browse/+page.ts b/src/routes/breweries/browse/+page.ts
index d624aac..3e36994 100644
--- a/src/routes/breweries/browse/+page.ts
+++ b/src/routes/breweries/browse/+page.ts
@@ -1,7 +1,9 @@
import { API_URL } from '$lib/utils';
+import stateCountryMapping from '$lib/data/state-country-mapping.json';
interface BreweryMetaResponse {
total: string;
+ by_country: Record;
by_state: Record;
by_type: Record;
}
@@ -13,6 +15,7 @@ export async function load() {
if (!response.ok) {
console.error(`❌ API request failed with status ${response.status}`);
return {
+ byCountry: [],
byState: [],
byType: [],
error: `Failed to fetch metadata with status ${response.status}`,
@@ -21,21 +24,33 @@ export async function load() {
const data: BreweryMetaResponse = await response.json();
- const byState = Object.entries(data.by_state)
+ const byCountry = Object.entries(data.by_country)
.map(([name, count]) => ({ name, count }))
.sort((a, b) => a.name.localeCompare(b.name));
+ const byState = Object.entries(data.by_state)
+ .map(([name, count]) => ({
+ name,
+ count,
+ country:
+ stateCountryMapping[name as keyof typeof stateCountryMapping] ||
+ 'United States',
+ }))
+ .sort((a, b) => a.name.localeCompare(b.name));
+
const byType = Object.entries(data.by_type)
.map(([name, count]) => ({ name, count }))
.sort((a, b) => a.name.localeCompare(b.name));
return {
+ byCountry,
byState,
byType,
};
} catch (error) {
console.error('❌ Error fetching brewery metadata:', error);
return {
+ byCountry: [],
byState: [],
byType: [],
error: 'Failed to fetch brewery metadata',