mirror of
				https://github.com/r-freeman/portfolio.git
				synced 2025-10-31 21:11:11 +00:00 
			
		
		
		
	Drop uses page add not found
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build And Publish / BuildAndPublish (push) Successful in 3m23s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build And Publish / BuildAndPublish (push) Successful in 3m23s
				
			This commit is contained in:
		
							parent
							
								
									2663b82789
								
							
						
					
					
						commit
						473ceb8f09
					
				
							
								
								
									
										57
									
								
								app/not-found.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/not-found.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | ||||
| import React from 'react' | ||||
| import sitemap from '@/app/sitemap' | ||||
| import {SimpleLayout} from '@/components/layouts/SimpleLayout' | ||||
| import {Card} from '@/components/ui/Card' | ||||
| 
 | ||||
| const meta = { | ||||
|     title: 'Ryan Freeman - Software engineer based in Dublin, Ireland.', | ||||
|     heading: 'Sorry, the page you were looking for could not be found.', | ||||
|     description: 'The page you requested may have been removed, renamed, or never existed. Verify the URL is correct or check the sitemap below.', | ||||
|     type: 'website', | ||||
|     alternates: { | ||||
|         canonical: '/' | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export let metadata: { | ||||
|     [p: string]: string | Object | ||||
|     heading: string | ||||
|     description: string | ||||
|     title: string | ||||
|     type: string | ||||
|     openGraph: { | ||||
|         images: string | Object | ||||
|         description: string | ||||
|         title: string | ||||
|         type: string | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export default async function NotFound() { | ||||
|     const pages = await sitemap() | ||||
| 
 | ||||
|     return ( | ||||
|         <SimpleLayout heading={meta.heading} | ||||
|                       description={meta.description} | ||||
|                       gradient="bg-gradient-to-r from-pink-500 to-violet-500" | ||||
|                       displaySocials={false}> | ||||
|             <div className="mx-auto grid max-w-xl grid-cols-1 gap-y-20 lg:max-w-none"> | ||||
|                 <div className="max-w-3xl space-y-16 mt-6"> | ||||
|                     { | ||||
|                         pages.map(({url: url}, i) => { | ||||
|                             return ( | ||||
|                                 <article key={i}> | ||||
|                                     <Card variant="inline"> | ||||
|                                         <Card.Title href={url}> | ||||
|                                             {url} | ||||
|                                         </Card.Title> | ||||
|                                     </Card> | ||||
|                                 </article> | ||||
|                             ) | ||||
|                         }) | ||||
|                     } | ||||
|                 </div> | ||||
|             </div> | ||||
|         </SimpleLayout> | ||||
|     ) | ||||
| } | ||||
| @ -8,8 +8,7 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> { | ||||
|         'https://ryanfreeman.dev/services', | ||||
|         'https://ryanfreeman.dev/reading', | ||||
|         'https://ryanfreeman.dev/writing', | ||||
|         'https://ryanfreeman.dev/projects', | ||||
|         'https://ryanfreeman.dev/uses' | ||||
|         'https://ryanfreeman.dev/projects' | ||||
|     ] | ||||
| 
 | ||||
|     const pages = urls.map(url => ({ | ||||
|  | ||||
| @ -1,143 +0,0 @@ | ||||
| import React, {ReactNode} from 'react' | ||||
| import {SimpleLayout} from '@/components/layouts/SimpleLayout' | ||||
| import {Card} from '@/components/ui/Card' | ||||
| import {Section} from '@/components/ui/Section' | ||||
| import {metadata as _metadata} from '@/lib/generateMetadata' | ||||
| 
 | ||||
| const meta = { | ||||
|     title: 'Uses', | ||||
|     heading: 'Software I use, equipment that makes my job easier, and other things I recommend.', | ||||
|     description: 'I get asked a lot about the things I use to build software and stay productive. Here’s a big list of all of my favourite gear.', | ||||
|     type: 'website', | ||||
|     alternates: { | ||||
|         canonical: '/uses' | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export let metadata: { | ||||
|     [p: string]: string | Object | ||||
|     heading: string | ||||
|     description: string | ||||
|     title: string | ||||
|     type: string | ||||
|     openGraph: { | ||||
|         images: string | Object | ||||
|         description: string | ||||
|         title: string | ||||
|         type: string | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| metadata = _metadata({...meta, heading: meta.heading}) | ||||
| 
 | ||||
| function ToolsSection({children, title}: { children: ReactNode, title: string }) { | ||||
|     return ( | ||||
|         <Section title={title}> | ||||
|             <ul role="list" className="space-y-16"> | ||||
|                 {children} | ||||
|             </ul> | ||||
|         </Section> | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| function Tool({title, href, children}: { title: string, href: string, children: ReactNode }) { | ||||
|     return ( | ||||
|         <Card as="li"> | ||||
|             <Card.Title as="h3" href={href}> | ||||
|                 {title} | ||||
|             </Card.Title> | ||||
|             <Card.Description>{children}</Card.Description> | ||||
|         </Card> | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| export default function Uses() { | ||||
|     return ( | ||||
|         <SimpleLayout | ||||
|             heading={meta.heading} | ||||
|             description={meta.description} | ||||
|             gradient="bg-gradient-to-r from-orange-400 to-rose-400"> | ||||
|             <div className="space-y-20"> | ||||
|                 <ToolsSection title="Workstation"> | ||||
|                     <Tool title="PC Build 2022" href="https://pcpartpicker.com/b/KXfPxr"> | ||||
|                         This is my main Intel-based computer which I built in 2022. I've recently added more storage and | ||||
|                         a new monitor. Click here to see a comprehensive listing of all the parts used in this build on | ||||
|                         PCPartPicker. | ||||
|                     </Tool> | ||||
|                     <Tool title="Herman Miller Aeron Chair" | ||||
|                           href="https://hermanmiller.com/en_eur/products/seating/office-chairs/aeron-chairs/"> | ||||
|                         I bought this chair second-hand when I started working for Apple, it's extremely comfortable and | ||||
|                         ergonomic for those long hours spent at the desk. | ||||
|                     </Tool> | ||||
|                     <Tool title="Maidesite T2 Pro Standing Desk Frame" | ||||
|                           href="https://amzn.to/3xAdgoJ"> | ||||
|                         I was on the fence about standing desks for a while but after some research I decided to give the | ||||
|                         Maidesite T2 Pro Standing Desk Frame a try. This allows me to easily transition between sitting and | ||||
|                         standing. | ||||
|                     </Tool> | ||||
|                 </ToolsSection> | ||||
|                 <ToolsSection title="Development tools"> | ||||
|                     <Tool title="JetBrains" href="https://jetbrains.com/"> | ||||
|                         I use a mix of JetBrain apps for my IDEs depending on what I'm working on. For JavaScript | ||||
|                         projects, I use WebStorm. PyCharm for python and IntelliJ IDEA Ultimate for Java. I use the same | ||||
|                         keyboard shortcuts across these apps which is great for productivity. | ||||
|                     </Tool> | ||||
|                     <Tool title="Insomnia" href="https://insomnia.rest/"> | ||||
|                         Good tool for designing and testing REST APIs. I used to use Postman but I found the interface too | ||||
|                         cluttered and prefer the simplicity of Insomnia. | ||||
|                     </Tool> | ||||
|                 </ToolsSection> | ||||
|                 <ToolsSection title="Productivity"> | ||||
|                     <Tool title="RegionToShare" href="https://github.com/tom-englert/RegionToShare"> | ||||
|                         Great app for Windows which allows you share a region of the screen, handy for single monitor | ||||
|                         set ups such as ultrawides when you don't want to share the entire screen. | ||||
|                     </Tool> | ||||
|                 </ToolsSection> | ||||
|                 <ToolsSection title="Design"> | ||||
|                     <Tool title="Balsamiq Wireframes" href="https://balsamiq.com/"> | ||||
|                         I use this software for creating low-fidelity wireframes and interfaces. It's great for | ||||
|                         experimenting with ideas. | ||||
|                     </Tool> | ||||
|                     <Tool title="Color Picker" href="https://learn.microsoft.com/en-us/windows/powertoys/color-picker"> | ||||
|                         Color Picker is included in the PowerToys set of enhancements for Windows. Using the eye dropper you | ||||
|                         can easily identify colours on the screen and copy the colour's code to your clipboard for use | ||||
|                         in other applications. | ||||
|                     </Tool> | ||||
|                 </ToolsSection> | ||||
|                 <ToolsSection title="Automation"> | ||||
|                     <Tool title="AutoHotKey" href="https://autohotkey.com/"> | ||||
|                         AutoHotKey features it's own scripting language and allows you to create keyboard macros for | ||||
|                         automating common tasks. For example, I use AutoHotKey to toggle between dark and light themes in | ||||
|                         Windows on the fly. | ||||
|                     </Tool> | ||||
|                 </ToolsSection> | ||||
|                 <ToolsSection title="Browser Extensions"> | ||||
|                     <Tool title="Bitwarden" | ||||
|                           href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb"> | ||||
|                         Bitwarden is a free, open-source password manager, this Chrome Extension connects to a self-hosted | ||||
|                         instance of Bitwarden which lives on my Raspberry Pi. It is really useful for syncing passwords across | ||||
|                         devices. | ||||
|                     </Tool> | ||||
|                     <Tool title="uBlock Origin" | ||||
|                           href="https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm"> | ||||
|                         Great extension for blocking those annoying YouTube ads and nasty tracking scripts. | ||||
|                     </Tool> | ||||
|                     <Tool title="Floccus" | ||||
|                           href="https://chrome.google.com/webstore/detail/floccus-bookmarks-sync/fnaicdffflnofjppbagibeoednhnbjhg"> | ||||
|                         Floccus syncs your bookmarks across browsers and devices. It connects to my Nextcloud server via | ||||
|                         WebDAV and keeps my bookmarks in sync, so no matter which device I'm using, I always have the | ||||
|                         same set of bookmarks. | ||||
|                     </Tool> | ||||
|                     <Tool title="I still don't care about cookies" | ||||
|                           href="https://chromewebstore.google.com/detail/edibdbjcniadpccecjdfdjjppcpchdlm"> | ||||
|                         This extension removes unwanted/annoying cookie warnings/pop-ups from almost all websites! | ||||
|                     </Tool> | ||||
|                     <Tool title="YouTube No Context" | ||||
|                           href="https://chromewebstore.google.com/detail/youtube-no-context/dnlffelklagnbdjpcbhfdbangccjmhhh?pli=1"> | ||||
|                         Removes intrusive context boxes on YouTube. | ||||
|                     </Tool> | ||||
|                 </ToolsSection> | ||||
|             </div> | ||||
|         </SimpleLayout> | ||||
|     ) | ||||
| } | ||||
| @ -20,7 +20,6 @@ export function Footer() { | ||||
|                                 <NavLink href="/reading">Reading</NavLink> | ||||
|                                 <NavLink href="/writing">Writing</NavLink> | ||||
|                                 <NavLink href="/projects">Projects</NavLink> | ||||
|                                 <NavLink href="/uses">Uses</NavLink> | ||||
|                             </div> | ||||
|                             <div className="flex flex-col"> | ||||
|                                 <p className="text-sm text-zinc-600 dark:text-zinc-400"> | ||||
|  | ||||
| @ -69,7 +69,6 @@ export function MobileNavigation(props: Props) { | ||||
|                                 <MobileNavItem href="/reading">Reading</MobileNavItem> | ||||
|                                 <MobileNavItem href="/writing">Writing</MobileNavItem> | ||||
|                                 <MobileNavItem href="/projects">Projects</MobileNavItem> | ||||
|                                 <MobileNavItem href="/uses">Uses</MobileNavItem> | ||||
|                             </ul> | ||||
|                         </nav> | ||||
|                     </Popover.Panel> | ||||
| @ -114,7 +113,6 @@ export function DesktopNavigation(props: Props) { | ||||
|                 <NavItem href="/reading">Reading</NavItem> | ||||
|                 <NavItem href="/writing">Writing</NavItem> | ||||
|                 <NavItem href="/projects">Projects</NavItem> | ||||
|                 <NavItem href="/uses">Uses</NavItem> | ||||
|             </ul> | ||||
|         </nav> | ||||
|     ) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user