Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
"editor.acceptSuggestionOnEnter": "on",
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
},
"cSpell.words": ["PHLASK", "supabase"]
}
79 changes: 70 additions & 9 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,76 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/src/assets/favicon.png" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<meta name="mobile-web-app-capable" content="yes" />
<meta name="theme-color" content="#000000" />

<meta
name="description"
content="An ecosystem for finding and sharing free water, food, bathrooms, and foraging resources in Philadelphia."
/>
<meta
name="keywords"
content="Free, free stuff, philadelphia, free stuff philadelphia, free resources, free resources philadelphia, free stuff philly, free resources philly, free water, free food, foraging, food foraging, free bathrooms, phlask, phlask philadelphia"
/>
<meta name="robots" content="index, follow" />

<meta
property="og:title"
content="PHLASK - Sharing Free Resources in Philadelphia"
/>
<meta
property="og:description"
content="PHLASK is an ecosystem for finding and sharing free resources (water, food, bathrooms, foraging) in Philadelphia."
/>
<meta property="og:url" content="https://phlask.me" />
<meta property="og:type" content="website" />
<meta
property="og:image"
content="https://phlask.me/assets/images/phlask-tessellation.png"
/>

<meta name="twitter:card" content="summary_large_image" />
<meta
name="twitter:title"
content="PHLASK - Sharing Free Resources in Philadelphia"
/>
<meta
name="twitter:description"
content="An ecosystem for finding and sharing free resources in Philadelphia."
/>
<meta
name="twitter:image"
content="https://phlask.me/assets/images/phlask-tessellation.png"
/>

<link rel="canonical" href="https://phlask.me" />

<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "PHLASK",
"url": "https://phlask.me",
"description": "An ecosystem for finding and sharing free resources in Philadelphia",
"applicationCategory": "MapApplication",
"operatingSystem": "Web",
"about": {
"@type": "Organization",
"name": "PHLASK",
"url": "https://phlask.me",
"location": {
"@type": "Place",
"name": "Philadelphia"
}
}
}
</script>

<link rel="icon" type="image/png" href="/assets/favicon.png" />
<link
rel="preload"
as="image"
Expand All @@ -15,20 +84,12 @@
href="https://fonts.googleapis.com/css2?family=Exo:wght@600;700&family=Inter:wght@500;600;700&family=Roboto:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>

<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
rel="stylesheet"
/>

<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<meta name="mobile-web-app-capable" content="yes" />
<meta name="theme-color" content="#000000" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
Expand Down
14 changes: 0 additions & 14 deletions manifest.json

This file was deleted.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-dropzone": "^14.4.1",
"react-helmet-async": "^3.0.0",
"react-hook-form": "7.69.0",
"react-router": "^7.13.0",
"react-toastify": "^11.0.5",
Expand Down
32 changes: 32 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

File renamed without changes
23 changes: 23 additions & 0 deletions public/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"short_name": "PHLASK",
"name": "PHLASK - Finding and sharing free resources in Philadelphia",
"description": "An ecosystem for finding and sharing free resources like water, food, bathrooms, and foraging in Philadelphia.",
"icons": [
{
"src": "/assets/favicon.png",
"type": "image/png",
"sizes": "800x808"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#26A9E0",
"background_color": "#FFFFFF",
"orientation": "portrait",
"categories": [
"utilities",
"social",
"maps"
],
"lang": "en-US"
}
4 changes: 4 additions & 0 deletions public/robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
User-agent: *
Allow: /

Sitemap: https://phlask.me/sitemap.xml
15 changes: 15 additions & 0 deletions public/sitemap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://phlask.me/</loc>
</url>
<url>
<loc>https://phlask.me/about</loc>
</url>
<url>
<loc>https://phlask.me/contact</loc>
</url>
<url>
<loc>https://phlask.me/join</loc>
</url>
</urlset>
6 changes: 6 additions & 0 deletions src/components/About/About.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Stack, Typography } from '@mui/material';
import Page from 'components/Page/Page';
import PhlaskNameVisualExplainer from 'components/PhlaskNameVisualExplainer/PhlaskNameVisualExplainer';
import SEO from 'components/SEO/SEO';
import type { ReactNode } from 'react';

type PageSectionProps = {
Expand Down Expand Up @@ -28,6 +29,11 @@ const PageSection = ({ title = null, children }: PageSectionProps) => {

const About = () => (
<Page title="About PHLASK" data-cy="about">
<SEO
title="About"
description="Learn about PHLASK, an ecosystem for finding and sharing free resources like water, food, bathrooms, and foraging in Philadelphia."
canonicalUrl="https://phlask.me/about"
/>
<PageSection title="What is PHLASK?">
PHLASK is an app that connects people in Philadelphia to free,
life-sustaining resources. The interactive map shows users where to find
Expand Down
6 changes: 6 additions & 0 deletions src/components/Contact/Contact.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import EmailConnect from 'components/EmailConnect/EmailConnect';
import useIsMobile from 'hooks/useIsMobile';
import FeedbackFormSuccess from 'components/forms/FeedbackFromSuccess/FeedbackFormSuccess';
import useAddFeedbackMutation from 'hooks/mutations/useAddFeedbackMutation';
import SEO from 'components/SEO/SEO';

const TITLE = 'Contact';

Expand All @@ -19,6 +20,11 @@ const Contact = () => {

return (
<Page title={TITLE} data-cy="contact">
<SEO
title="Contact"
description="Get in touch with the PHLASK team to provide feedback, report issues, or ask questions about our free resource ecosystem in Philadelphia."
canonicalUrl="https://phlask.me/contact"
/>
{isSuccess ? (
<FeedbackFormSuccess />
) : (
Expand Down
6 changes: 6 additions & 0 deletions src/components/JoinTheTeam/JoinTheTeam.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@ import { Box, Link, List, ListItem, Stack, Typography } from '@mui/material';
import Page from 'components/Page/Page';
import PhlaskCirclesExplainer from 'components/PhlaskCircleExplainer/PhlaskCirclesExplainer';
import AcknowledgementsSection from 'components/AcknowledgementsSection/AcknowledgementsSection';
import SEO from 'components/SEO/SEO';

const JoinTheTeam = () => {
return (
<Page title="Join the team" data-cy="join-team">
<SEO
title="Join the Team"
description="Become a volunteer with PHLASK. Join our community of developers, designers, and advocates working to make life-sustaining resources accessible to all in Philadelphia."
canonicalUrl="https://phlask.me/join"
/>
<Stack sx={{ color: '#2d3748', fontSize: 14, lineHeight: '24px' }}>
PHLASK volunteers come from a wide array of socioeconomic, educational
and technical backgrounds. The team is committed to non-hierarchical,
Expand Down
27 changes: 15 additions & 12 deletions src/components/Providers/Providers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,26 @@ import queryClient from 'services/queryClient';
import ThemeProvider from './ThemeProvider';
import { env } from 'config';
import AnalyticsProvider from './AnalyticsProvider';
import { HelmetProvider } from 'react-helmet-async';

const REACT_GOOGLE_MAPS_API_KEY = env.VITE_REACT_GOOGLE_MAPS_API_KEY;

const Providers = ({ children }: PropsWithChildren) => {
return (
<AnalyticsProvider>
<QueryClientProvider client={queryClient}>
<APIProvider apiKey={REACT_GOOGLE_MAPS_API_KEY} libraries={['places']}>
<ToolbarContextProvider>
<ThemeProvider>
<CssBaseline />
{children}
</ThemeProvider>
</ToolbarContextProvider>
</APIProvider>
</QueryClientProvider>
</AnalyticsProvider>
<HelmetProvider>
<AnalyticsProvider>
<QueryClientProvider client={queryClient}>
<APIProvider apiKey={REACT_GOOGLE_MAPS_API_KEY} libraries={['places']}>
<ToolbarContextProvider>
<ThemeProvider>
<CssBaseline />
{children}
</ThemeProvider>
</ToolbarContextProvider>
</APIProvider>
</QueryClientProvider>
</AnalyticsProvider>
</HelmetProvider>
);
};

Expand Down
46 changes: 46 additions & 0 deletions src/components/SEO/SEO.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { Helmet } from 'react-helmet-async';

interface SEOProps {
title?: string;
description?: string;
ogType?: string;
ogImage?: string;
canonicalUrl?: string;
}

const SEO = ({
title,
description,
ogType = 'website',
ogImage = 'https://phlask.me/assets/images/phlask-tessellation.png',
canonicalUrl
}: SEOProps) => {
const siteTitle = 'PHLASK';
const fullTitle = title ? `${title} | ${siteTitle}` : siteTitle;
const defaultDescription =
'An ecosystem for finding and sharing free resources like water, food, bathrooms, and foraging in Philadelphia.';
const metaDescription = description || defaultDescription;
const url = canonicalUrl || 'https://phlask.me';

return (
<Helmet>
<title>{fullTitle}</title>
<meta name="description" content={metaDescription} />

<meta property="og:title" content={fullTitle} />
<meta property="og:description" content={metaDescription} />
<meta property="og:type" content={ogType} />
<meta property="og:url" content={url} />
<meta property="og:image" content={ogImage} />

<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={fullTitle} />
<meta name="twitter:description" content={metaDescription} />
<meta name="twitter:image" content={ogImage} />

<link rel="canonical" href={url} />
</Helmet>
);
};

export default SEO;
Loading
Loading