{"version":3,"sources":["components/header/Header.tsx","logo-square-250x250.png","components/appsComponent/AppsComponent.tsx","components/tech/TechComponent.tsx","components/gallery/galleryApi.ts","components/gallery/BeartoonGallery.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["BearwaveHeader","className","src","alt","to","AppsComponent","href","target","rel","TechComponent","fetchSeries","a","axios","get","then","resp","data","fetchBeartoons","map","b","d","Date","created","initialState","loading","loaded","series","Map","currentToonIndex","currentSeries","visitedSeriesIds","visitedUnseriesedToons","previous","randomNumber","max","Math","floor","random","randomNextSeries","numSeries","rand","hasPreviousToon","state","hasNextToon","maxToons","beartoons","length","renderSeriesTitle","size","currentToon","dayjs","format","title","BeartoonComponent","current","image","caption","width","BeartoonGallery","useState","setState","useEffect","Promise","all","res","bs","seriesMap","allSeries","_","chain","s","keyBy","value","forEach","series_id","existingSeries","existingBeartoons","newBeartoons","concat","uniq","orderBy","set","mapSeriesState","first","firstSeries","firstToon","sortedByCreated","latest","head","latestSeries","latestBeartoon","unseriesed","findIndex","t","id","beartoon","getFirstSeriesAndToon","sequence","catch","err","console","error","classNames","disabled","onClick","prevToonState","nextSeries","includes","nextToon","updatedSeriesIds","updatedUnseriesedToons","visitedSeries","nextToonState","App","exact","path","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.c35fd48c.chunk.js","sourcesContent":["import React from 'react';\nimport { NavLink } from 'react-router-dom';\n\nimport logo from '../../logo-square-250x250.png';\n\nconst BearwaveHeader = () => (\n
\n
\n
\n \"Bearwave\"\n
\n
\n
\n
\n
    \n
  • tech.
  • \n
  • apps.
  • \n
  • toons.
  • \n
\n
\n
\n
 
\n
\n);\n\nexport default BearwaveHeader;","export default \"data:image/png;base64,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\"","import React from 'react';\n\nconst AppsComponent = () => {\n return (\n
\n

Apps

\n\n

Submitted for your approval... some random tinkering projects.

\n\n
\n

\n www.bearwavetech.com\n (you're lookin at it)\n

\n

\n The site is meant to be straightforward, and a culmination of techniques and tools I've been using\n over the past few years. It's not much, but I'm fairly proud of this site. The bulk of it was done\n in a single day with extensive use of popular frameworks.\n

\n

Day 1 started at 11am and ended at 5am the following morning.

\n \n

whew~

\n

Day 2 involved compiling a production version of the backend/frontend, setting up a new server, and deploying the initial version.

\n

Day 3 was a few rounds of tweaking the look and feel, adding navigation, additional pages like this one, and repeating.

\n

Et voila, a wild bearwavetech.com appears!!

\n
\n\n
\n

\n Background Tab Search\n Chrome Extension\n

\n

\n If you ever go down a wikipedia/Google rabbit hole, and find every page you come across causes you\n to\n search for another concept in another tab, this extension lets you do your search without switching\n to that new tab and interrupting your reading focus. Works even better if you activate it with a\n keyboard macro.\n

\n

\n Alternatively, you could use your regular URL bar to type your search and hit alt + shift +\n enter.\n

\n
\n
\n );\n};\n\nexport default AppsComponent;","import React from 'react';\n\nconst TechComponent = () => {\n return (\n
\n

Tech (consulting)

\n\n

\n Need some technology made? Let's chat! Whether you're a small start-up looking for guidance on\n building a website/app, an academic institution building out an in-house team, or a large enterprise\n looking\n for hands-on expertise, this is the right place to look.\n

\n\n \n\n
\n
\n

Technology consulting services

\n
    \n
  • system architecture & design
  • \n
  • cloud infrastructure architecture & implementation
  • \n
  • system monitoring
  • \n
  • full-stack development
  • \n
  • rapid prototyping
  • \n
  • data analytics collection & analysis
  • \n
\n
\n
\n

Bread and butter (mmm...) tech stacks:

\n
    \n
  • Linux - Ubuntu, Amazon, Debian
  • \n
  • Amazon AWS, Microsoft Azure
  • \n
  • SQL, MongoDB, various no-SQL
  • \n
  • RabbitMQ, MQTT, AWS Kinesis, Azure ServiceBus
  • \n
  • Elastic ELK stack
  • \n
  • NodeJS, React/Redux, Typescript, ExpressJS
  • \n
  • Python, Django, Flask
  • \n
\n
\n
\n
\n );\n};\n\nexport default TechComponent;\n","import axios from 'axios';\n\nexport interface Series {\n id: number;\n created: Date;\n title?: string;\n beartoons: Beartoon[];\n}\n\nexport interface Beartoon {\n id: number;\n created: Date;\n sequence: number;\n caption?: string;\n series?: number;\n image: string;\n}\n\nexport const fetchSeries = async (): Promise =>\n await axios.get('/api/series/').then(resp => resp.data);\n\nexport const fetchBeartoons = async (): Promise =>\n await axios.get('/api/beartoons/').then(resp => {\n return resp.data.map((b: Beartoon) => {\n const d = new Date(b.created);\n return {\n ...b,\n created: new Date(d),\n };\n });\n });\n\n","import React, {useEffect, useState} from 'react';\nimport dayjs from 'dayjs';\nimport _ from 'lodash';\nimport classNames from 'classnames';\n\nimport {Series, Beartoon, fetchBeartoons, fetchSeries} from \"./galleryApi\";\n\ninterface BeartoonGalleryState {\n loading: boolean;\n loaded: boolean;\n series: any;\n currentToonIndex: number,\n currentSeries: number,\n visitedSeriesIds: number[],\n visitedUnseriesedToons: number[],\n previous: any,\n}\n\nconst initialState: BeartoonGalleryState = {\n loading: false,\n loaded: false,\n series: new Map(),\n currentToonIndex: 0,\n currentSeries: 0,\n visitedSeriesIds: [],\n visitedUnseriesedToons: [],\n previous: {},\n}\n\n\nconst mapSeriesState = (series: Series[], beartoons: Beartoon[]) => {\n const allSeries = _.chain(series)\n .map(s => {\n return {\n ...s,\n beartoons: [],\n }\n })\n .keyBy('id')\n .value();\n const map = new Map();\n _.forEach(beartoons, b => {\n const series_id = (!b.series) ? 0 : b.series;\n const existingSeries = map.get(series_id) || allSeries[series_id] || {};\n const existingBeartoons = existingSeries.beartoons || [];\n const newBeartoons = _.chain(existingBeartoons.concat(b)).uniq().orderBy(['sequence'], ['asc']).value();\n map.set(series_id, {\n ...existingSeries,\n beartoons: newBeartoons,\n });\n });\n return map;\n};\n\n\nconst randomNumber = (max: number) =>\n Math.floor(Math.random() * Math.floor(max));\n\nconst randomNextSeries = (numSeries: number) => {\n const rand = randomNumber(numSeries * 6);\n return (rand >= numSeries) ? 0 : rand;\n};\n\n\nconst prevToonState = (state: BeartoonGalleryState) => {\n if (state.currentSeries > 0 && state.currentToonIndex - 1 >= 0) {\n return {\n ...state,\n currentToonIndex: state.currentToonIndex - 1,\n };\n } else {\n return {...state};\n }\n};\n\nconst nextToonState = (state: BeartoonGalleryState) => {\n const currentSeries = state.series.get(state.currentSeries);\n const maxToons = currentSeries.beartoons.length;\n const numSeries = state.series.size - 1; // subtract for \"no series\" at index 0\n\n // prevent infinite loops if all have been cycled\n if (state.visitedSeriesIds.length >= numSeries -1 && state.visitedUnseriesedToons >= state.series.get(0).size) {\n return {\n ...state,\n currentSeries: 0,\n currentToonIndex: 0,\n visitedSeriesIds: [],\n visitedUnseriesedToons: [],\n previous: {\n series: state.currentSeries,\n sequence: state.currentToonIndex,\n },\n }\n }\n\n if (state.currentSeries === 0 || (state.currentSeries > 0 && state.currentToonIndex + 1 >= maxToons)) {\n\n let nextSeries = randomNextSeries(numSeries);\n if (state.visitedSeriesIds.length >= numSeries -1) {\n nextSeries = 0;\n } else {\n while (state.visitedSeriesIds.length < numSeries && _.includes(state.visitedSeriesIds, nextSeries)) {\n nextSeries = randomNextSeries(numSeries);\n }\n }\n\n let nextToon = randomNumber(maxToons);\n if (nextSeries === 0) {\n while (state.visitedUnseriesedToons.length < maxToons && _.includes(state.visitedUnseriesedToons, nextToon)) {\n const unseriesed = state.series.get(0);\n nextToon = randomNumber(unseriesed.beartoons.length);\n }\n } else {\n nextToon = 0;\n }\n\n let updatedSeriesIds = state.visitedSeriesIds;\n let updatedUnseriesedToons = state.visitedUnseriesedToons;\n if (nextSeries === 0) {\n updatedUnseriesedToons = state.visitedUnseriesedToons.concat([state.currentToonIndex]);\n } else {\n updatedSeriesIds = state.visitedSeriesIds.concat([nextSeries]);\n }\n\n return {\n ...state,\n currentSeries: nextSeries,\n currentToonIndex: nextToon,\n visitedSeriesIds: updatedSeriesIds,\n visitedUnseriesedToons: updatedUnseriesedToons,\n previous: {\n series: state.currentSeries,\n sequence: state.currentToonIndex,\n },\n };\n } else if (state.currentToonIndex + 1 < maxToons) {\n return {\n ...state,\n currentToonIndex: state.currentToonIndex + 1,\n previous: {\n series: state.currentSeries,\n sequence: state.currentToonIndex,\n },\n };\n } else {\n const visitedSeries = (state.currentSeries > 0) ? [state.currentSeries] : [];\n\n const numSeries = state.series.size;\n\n let nextSeries = randomNextSeries(numSeries);\n while (state.visitedSeriesIds.length < numSeries && _.includes(state.visitedSeriesIds, nextSeries)) {\n nextSeries = randomNextSeries(numSeries);\n }\n return {\n ...state,\n currentSeries: nextSeries,\n currentToonIndex: 0,\n visitedSeriesIds: state.visitedSeriesIds.concat(visitedSeries),\n previous: {\n series: state.currentSeries,\n sequence: state.currentToonIndex,\n },\n };\n }\n};\n\nconst hasPreviousToon = (state: BeartoonGalleryState) => {\n return (state.currentSeries > 0 && state.currentToonIndex - 1 >= 0);\n};\n\nconst hasNextToon = (state: BeartoonGalleryState) => {\n if (state.currentSeries > 0) {\n const currentSeries = state.series.get(state.currentSeries);\n const maxToons = currentSeries.beartoons.length;\n return (state.currentToonIndex + 1 < maxToons);\n } else {\n return false;\n }\n};\n\nconst renderSeriesTitle = (state: BeartoonGalleryState) => {\n if (!state.series.size) return ();\n const series = state.series.get(state.currentSeries);\n const currentToon = state.series.get(state.currentSeries).beartoons[state.currentToonIndex];\n return state.currentSeries > 0 && series\n ? ({dayjs(series.created).format('MMM DD, \\'YY')} {series.title})\n : ({dayjs(currentToon.created).format('MMM DD, \\'YY')});\n};\n\n// @ts-ignore\nconst BeartoonComponent = ({series, current}) => {\n if (!series) return null;\n return (\n
\n
\n
\n {series.beartoons[current].caption}\n\n
\n
\n
\n {series.beartoons[current].caption}\n
\n
\n );\n}\n\nconst getFirstSeriesAndToon = (seriesMap: Map, beartoons: Beartoon[]): any => {\n if (!seriesMap.size || !beartoons.length) return { firstSeries: -1, firstToon: -1 };\n const sortedByCreated = _.orderBy(beartoons, ['created'], ['desc']);\n const latest = _.head(sortedByCreated);\n\n let latestSeries = 0, latestBeartoon = 0;\n if (latest && latest.series) {\n latestSeries = latest.series;\n } else {\n // @ts-ignore\n const unseriesed = seriesMap.get(0).beartoons;\n // @ts-ignore\n latestBeartoon = _.findIndex(unseriesed, t => t.id === latest.id);\n }\n\n return {\n series: latestSeries,\n beartoon: latestBeartoon,\n }\n}\n\nconst BeartoonGallery = () => {\n let [state, setState] = useState(initialState);\n\n useEffect(() => {\n if (!state.loading) {\n if (!state.loaded) {\n setState({\n ...state,\n loading: true,\n loaded: false,\n })\n\n Promise.all([\n fetchBeartoons(),\n fetchSeries()\n ]).then((res: any[]) => {\n const bs = res[0];\n const ss = res[1];\n\n const seriesMap = mapSeriesState(ss, bs);\n\n const first = getFirstSeriesAndToon(seriesMap, bs);\n\n setState({\n ...state,\n loading: false,\n loaded: true,\n series: seriesMap,\n currentToonIndex: first.beartoon,\n currentSeries: first.series,\n visitedSeriesIds: first.series > 0 ? [first.series] : [],\n visitedUnseriesedToons: [],\n previous: {\n series: first.series,\n sequence: first.beartoon,\n },\n })\n }).catch((err) => {\n console.error('ERROR', err);\n });\n }\n }\n }\n ,\n [state]\n );\n\n return (\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n\n
\n
\n {renderSeriesTitle(state)}\n
\n
 
\n
\n {state.currentSeries > 0 && state.series.get(state.currentSeries) && (\n \n {state.currentToonIndex + 1} /\n {state.series.get(state.currentSeries).beartoons.length}\n \n )}\n
\n\n
\n \n
\n\n
\n );\n}\n\nexport default BeartoonGallery;","import React from 'react';\nimport {\n HashRouter as Router,\n Switch,\n Redirect,\n Route,\n} from 'react-router-dom';\n\nimport BearwaveHeader from \"./components/header/Header\";\nimport AppsComponent from \"./components/appsComponent/AppsComponent\";\nimport TechComponent from \"./components/tech/TechComponent\";\nimport BeartoonGallery from \"./components/gallery/BeartoonGallery\";\n\nimport './App.css';\n\nfunction App() {\n return (\n \n
\n \n \n \n \n \n \n \n
\n
\n );\n}\n\nexport default App;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}