{"version":3,"sources":["api.js","contexts/auth.js","helpers.js","confirm.js","userform.js","tour.js","navbar.js","contexts/gift.js","views/gifts.js","contexts/friend.js","views/friendgifts.js","views/sharedgifts.js","views/signin.js","views/guestsignin.js","views/createuser.js","views/account.js","views/home.js","App.js","serviceWorker.js","index.js"],"names":["this","client","axios","create","timeouts","withCredentials","interceptors","response","use","error","Promise","reject","data","fn","defaults","validateStatus","status","id","headers","common","username","password","a","post","passwd","email","name","get","params","found","tokenInfo","search","q","user","delete","friendID","giftID","userID","gift","rating","parseInt","uri","method","put","resp","dib","dibID","Object","keys","forEach","attr","patch","info","userKey","useUserState","useState","userJson","localStorage","getItem","JSON","parse","getInitialUserState","setUser","isSignedIn","_","isEmpty","useEffect","setItem","stringify","signout","api","onUnauthorized","signin","saveUser","updatedUser","newUser","assign","addFriend","friend","requestFriend","removeFriend","approveRequest","reqUser","denyRequest","AuthContext","createContext","useStyles","makeStyles","theme","overlay","top","left","right","bottom","opacity","backgroundColor","palette","background","paper","buttonWrapper","display","position","buttonFullWidth","buttonProgress","marginTop","marginLeft","Overlay","props","children","otherProps","classes","Fragment","className","PromiseButton","onClick","loading","setLoading","enqueueSnackbar","useSnackbar","disabled","handleClick","e","preventDefault","variant","fullWidth","join","Button","CircularProgress","size","StarHeader","num","Rating","max","defaultValue","readOnly","Typography","UserAvatar","Avatar","alt","ConfirmContext","useConfirm","useContext","ConfirmProvider","open","setOpen","dialogOpts","setDialogOpts","title","body","onOK","onCancel","handleClose","Provider","value","confirm","resolve","Dialog","onClose","DialogTitle","DialogContent","DialogContentText","DialogActions","color","emailRegex","UserValidator","validators","val","length","usernameExists","test","validateAttrs","attrs","errs","all","map","validatorFn","err","validateLogin","validateBasicInfo","categories","maxHeight","overflow","categoryButtons","flexDirection","gap","spacing","maxWidth","section","marginBottom","newItemPaper","padding","ShareLinkForm","links","setLinks","newLinkNotes","setNewLinkNotes","anchorEl","setAnchorEl","getShareLinks","deleteShareLink","filter","link","createShareLink","notes","concat","toggleOpenNew","currentTarget","copyLink","str","navigator","clipboard","writeText","el","document","createElement","style","appendChild","selected","getSelection","rangeCount","getRangeAt","select","setSelectionRange","execCommand","removeChild","removeAllRanges","addRange","copyToClipboard","target","href","makeURL","Link","Box","List","ListItem","ListItemText","primary","secondary","ListItemSecondaryAction","IconButton","edge","class","startIcon","Popover","anchorOrigin","vertical","horizontal","transformOrigin","onSubmit","TextField","label","autoFocus","placeholder","helperText","onChange","endAdornment","InputAdornment","type","CategoryForm","sort","setCategories","checked","setChecked","newCategory","setNewCategory","toggleOpenNewCategory","toggleCheck","category","hasCheckedCategories","compact","values","addNewCategory","dense","button","ListItemIcon","Checkbox","tabIndex","disableRipple","PasswordForm","errors","newPassword","setNewPassword","newPassword2","setNewPassword2","matchError","setMatchError","required","margin","BasicInfoForm","giftIdeas","birthday","dayjs","setBirthday","sendUpdates","update","utils","DateUtils","inputVariant","format","autoOk","disableFuture","date","KeyboardButtonProps","multiline","elementIDs","newGiftLink","friendActionsLink","showFriendsLink","homeLink","giftIdeasLink","accountLink","shareLink","start","driver","Driver","defineSteps","element","popover","description","stageBackground","root","appBar","transition","transitions","easing","sharp","duration","leavingScreen","appBarShift","width","drawerWidth","easeOut","enteringScreen","grow","flexGrow","menuButton","marginRight","hide","drawer","flexShrink","drawerPaper","drawerHeader","alignItems","mixins","toolbar","justifyContent","content","contentShift","dialogContent","height","overflowY","addFriendIcon","getContrastText","light","requestsIcon","friendListSubheader","scrollY","approvePaper","AddFriendsDialog","users","setUsers","searchVal","setSearchVal","searchUsers","useCallback","debounce","add","InputProps","startAdornment","ListItemAvatar","RequestListItem","approve","deny","RequestDialog","sortBy","requests","ShareDialog","gutterBottom","FriendList","withRouter","openAddFriends","setOpenAddFriends","openRequests","setOpenRequests","component","ListSubheader","friends","RouterLink","to","Divider","primaryTypographyProps","Navbar","useTheme","handleDrawerClose","React","handleAccountMenuClose","openSharing","setOpenSharing","AppBar","clsx","Toolbar","Tooltip","enterDelay","tour","aria-label","Badge","badgeContent","invisible","nowrap","underline","stopPropagation","event","Menu","Boolean","MenuItem","Drawer","anchor","direction","GiftContext","GiftEditor","selectedGift","setSelectedGift","saveGift","deleteGift","setGift","undefined","url","onSave","onDelete","onChangeGiftAttr","setGiftAttr","g","cloneDeep","rows","my","GiftBlock","DibEditor","createDib","submitDib","gift_id","quantity","DibOverlay","dibs","deleteDib","ourDib","find","user_id","delDib","amazonSearchParams","isMyList","isSelected","isDibbed","dibRef","useRef","giftURL","includes","orgURL","URL","URLSearchParams","key","set","toString","withAmazonParams","Card","ref","raised","CardHeader","subheader","action","rel","CardContent","Collapse","in","timeout","onEntered","current","scrollIntoView","behavior","block","unmountOnExit","sectionHeader","zIndex","borderBottom","divider","lineHeight","stuck","boxShadow","shadows","giftLoader","disabledBackground","sectionBody","flexWrap","alignContent","avatarHeader","paddingLeft","floatingButton","GiftGroup","gifts","rootEl","ratingGifts","threshold","inView","entry","intersectionRatio","b","GiftOwnerDetails","ideas","toggleOpen","Paper","Gifts","history","useHistory","giftsRef","filteredGifts","setFilteredGifts","showDibbed","setShowDibbed","initialGifts","loadingMessage","giftInfo","setGiftInfo","fetchGifts","then","updateLocalGift","newGift","fetchGift","oldGift","push","remove","useGiftState","openDial","setOpenDial","handleCloseDrawer","unfriend","_gifts","groupBy","overflowX","Fab","SpeedDial","ariaLabel","icon","SpeedDialIcon","onOpen","SpeedDialAction","tooltipTitle","isGuest","useFriendState","setFriend","setFriendID","owner","console","FriendContext","FriendGiftsView","useParams","buttonForm","textAlign","buttonGroup","SharedLoginView","location","useLocation","redirect","searchParams","encodeURIComponent","pathname","Container","align","ButtonGroup","orientation","SharedGiftsView","getShareLink","setSharingLink","GoogleSignIn","onSignIn","initialized","setInitialized","googleButtonRef","createRef","handleGoogleResp","decodedToken","jwt_decode","credential","loginGoogleToken","alert","window","google","accounts","initialize","client_id","callback","renderButton","text","shape","logo_alignment","script","src","onload","async","querySelector","SignIn","setUsername","setPassword","setErrors","submit","loginUserPassword","endIcon","mt","GuestSignIn","setEmail","setName","guestLogin","navButtons","CreateUser","onCreate","setLocalUser","step","setStep","updateUser","updates","newErrs","forOwn","gotoPrevStep","gotoNextStep","createUser","renderNavButtons","nextFn","renderStep","User","basicInfo","setBasicInfo","basicInfoErrors","setBasicInfoErrors","passwordChanges","setPasswordChanges","handleBasicInfoSave","handlePasswordSave","changes","steps","breakpoints","md","textBox","flex","Zoom","Stepper","alternativeLabel","Step","active","StepLabel","flexColumn","flexColumnScroll","PrivateRoute","render","rest","renderChildren","state","from","NavHeader","App","userState","renderNext","next","maxSnack","CssBaseline","path","exact","routeInfo","hostname","match","ReactDOM","getElementById","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.42bc167c.chunk.js","sourcesContent":["import axios from \"axios\";\n\nclass API {\n constructor() {\n this.client = axios.create({\n //baseURL: window.location.origin,\n timeouts: 3000,\n withCredentials: true,\n })\n this.client.interceptors.response.use(function (response) {\n // Any status code that lie within the range of 2xx cause this function to trigger\n // Do something with response data\n return response;\n }, function (error) {\n if (error.response) {\n return Promise.reject(error.response.data)\n }\n return Promise.reject(error);\n });\n }\n\n onUnauthorized(fn) {\n // For future requests, check for 401 and set user to empty if that's the case\n this.client.defaults.validateStatus = function (status) {\n if (status === 401) { fn() }\n return 200 <= status && status < 300; // default\n }\n }\n\n setSharingLink(id) {\n // For people using a sharing link, we add a header so we can still auth them\n this.client.defaults.headers.common[\"x-share-link-id\"] = id\n }\n\n async loginUserPassword(username, password) {\n const response = await this.client.post(\"/login\", {\n username: username,\n passwd: password,\n })\n return response.data\n }\n\n async guestLogin(email, name) {\n const response = await this.client.post(\"/guestlogin\", {\n email: email,\n name: name,\n })\n return response.data\n }\n\n async usernameExists(username) {\n const response = await this.client.get(\"/check_username\", {\n params: {\n username: username,\n },\n })\n return response.data.found\n }\n\n async loginGoogleToken(tokenInfo) {\n const response = await this.client.post(\"/oauth/google/logintoken\", tokenInfo)\n return response.data\n }\n\n async searchUsers(search) {\n const response = await this.client.get(\"/friends/\", {\n params: {\n q: search,\n },\n })\n return response.data\n }\n\n async requestFriend(user) {\n const response = await this.client.post(\"/friends/request/\" + user.id)\n return response.data\n }\n\n async removeFriend(user) {\n const response = await this.client.delete(\"/friends/\" + user.id)\n return response.data\n }\n\n async approveRequest(user) {\n const response = await this.client.post(\"/friends/approve/\" + user.id)\n return response.data\n }\n\n async denyRequest(user) {\n const response = await this.client.post(\"/friends/deny/\" + user.id)\n return response.data\n }\n\n async fetchGifts(friendID) {\n let response = await this.client.get(`/user/${ friendID }/gifts/`)\n return response.data\n }\n\n async fetchGift(friendID, giftID) {\n let response = await this.client.get(`/user/${ friendID }/gifts/${ giftID }`)\n return response.data\n }\n\n async saveGift(userID, gift) {\n // Validation\n if (gift.rating) {\n gift.rating = parseInt(gift.rating)\n }\n let uri = `/user/${ userID }/gifts/`\n let method\n if (!gift.id) {\n method = this.client.post\n } else {\n uri += gift.id\n method = this.client.put\n }\n const resp = await method(uri, gift)\n return resp.data\n }\n\n async deleteGift(userID, giftID) {\n const resp = await this.client.delete(`/user/${ userID }/gifts/${ giftID }`)\n return resp.data\n }\n\n async createDib(friendID, dib) {\n const resp = await this.client.post(`/user/${ friendID }/dib/`, dib)\n return resp.data\n }\n\n async deleteDib(friendID, dibID) {\n const resp = await this.client.delete(`/user/${ friendID }/dib/${ dibID }`)\n return resp.data\n }\n\n async saveUser(user) {\n // Remove empty values\n Object.keys(user).forEach((attr) => {\n if (!user[attr]) delete user[attr]\n })\n let uri = \"/user/\"\n let method\n if (!user.id) {\n method = this.client.post\n } else {\n uri += user.id + \"/\"\n method = this.client.patch\n }\n const resp = await method(uri, user)\n return resp.data\n }\n\n async getShareLink(id) {\n const resp = await this.client.get(`/share/` + id)\n return resp.data\n }\n\n async getShareLinks(userID) {\n const resp = await this.client.get(`/user/${ userID }/share/`)\n return resp.data\n }\n\n async createShareLink(userID, info) {\n const resp = await this.client.post(`/user/${ userID }/share/`, info)\n return resp.data\n }\n\n async deleteShareLink(userID, id) {\n const resp = await this.client.delete(`/user/${ userID }/share/${ id }/`)\n return resp.data\n }\n}\n\nexport default new API()\n","import _ from 'lodash';\nimport { createContext, useState, useEffect } from 'react';\nimport api from \"api\";\n\nconst AuthContext = createContext();\nconst userKey = \"currentUser\";\n\nfunction getInitialUserState() {\n // TODO Check the token expiry\n let userJson = localStorage.getItem(userKey)\n if (userJson) {\n return JSON.parse(userJson)\n }\n return {}\n}\n\nfunction useUserState() {\n const [user, setUser] = useState(getInitialUserState());\n //const [isSignedIn, setIsSignedIn] = useState(!_.isEmpty(user));\n\n const isSignedIn = !_.isEmpty(user)\n\n // Save the user to local storage\n useEffect(() => {\n //setIsSignedIn(!_.isEmpty(user))\n localStorage.setItem(userKey, JSON.stringify(user))\n }, [user])\n\n const signin = function(user) {\n setUser(user)\n }\n\n const signout = function() {\n setUser({})\n }\n\n // For future requests, check for 401 and set user to empty if that's the case\n api.onUnauthorized(() => {\n if (isSignedIn) {\n signout()\n }\n })\n\n const saveUser = async function(updatedUser) {\n updatedUser.id = user.id\n const newUser = await api.saveUser(updatedUser)\n setUser(Object.assign({}, user, newUser))\n }\n\n const addFriend = async function(friend) {\n const newUser = await api.requestFriend(friend)\n setUser(Object.assign({}, user, newUser))\n }\n\n const removeFriend = async function(friend) {\n const newUser = await api.removeFriend(friend)\n setUser(Object.assign({}, user, newUser))\n }\n\n const approveRequest = async function(reqUser) {\n const newUser = await api.approveRequest(reqUser)\n setUser(Object.assign({}, user, newUser))\n }\n\n const denyRequest = async function(reqUser) {\n const newUser = await api.denyRequest(reqUser)\n setUser(Object.assign({}, user, newUser))\n }\n\n return {\n user,\n isSignedIn,\n signin,\n signout,\n saveUser,\n addFriend,\n removeFriend,\n approveRequest,\n denyRequest,\n }\n}\n\nexport default AuthContext;\nexport {\n useUserState,\n}\n","import React, {useState } from \"react\";\nimport {\n Avatar,\n Button,\n CircularProgress,\n Typography,\n} from '@material-ui/core';\nimport {\n Rating,\n} from '@material-ui/lab';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useSnackbar } from 'notistack';\n\nconst useStyles = makeStyles((theme) => ({\n overlay: {\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n opacity: 0.8,\n backgroundColor: theme.palette.background.paper,\n },\n buttonWrapper: {\n display: \"inline-block\",\n position: \"relative\",\n },\n buttonFullWidth: {\n display: \"block\",\n },\n buttonProgress: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n marginTop: -12,\n marginLeft: -12,\n },\n}));\n\nfunction Overlay(props) {\n let { children, ...otherProps} = props\n const classes = useStyles();\n return (\n \n \n { children }\n \n )\n}\n\nfunction PromiseButton({onClick, ...props}) {\n const classes = useStyles();\n const [loading, setLoading] = useState(false);\n const { enqueueSnackbar } = useSnackbar();\n\n if (!props.disabled && loading) {\n props.disabled = true;\n }\n\n const handleClick = async function(e) {\n e && e.preventDefault();\n if (loading) return\n\n setLoading(true);\n try {\n await onClick(e);\n } catch (err) {\n enqueueSnackbar(err, {variant: \"error\"});\n }\n setLoading(false);\n }\n\n return (\n
\n \n {loading && }\n
\n )\n}\n\nfunction StarHeader({num}) {\n num = parseInt(num)\n return (\n \n \n  Rating\n \n )\n}\n\nfunction UserAvatar({user}) {\n return (\n { (user.name || \"\")[0] }\n )\n}\n\nexport {\n Overlay,\n PromiseButton,\n StarHeader,\n UserAvatar,\n}\n","import React, {useState, createContext, useContext} from \"react\";\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from '@material-ui/core';\n\nconst ConfirmContext = createContext();\n\nconst useConfirm = function() {\n return useContext(ConfirmContext)\n}\n\nfunction ConfirmProvider({children}) {\n const [open, setOpen] = useState(false);\n const [dialogOpts, setDialogOpts] = useState({});\n const {title, body, onOK, onCancel} = dialogOpts;\n\n const confirm = function(title, body) {\n return new Promise((resolve, reject) => {\n setDialogOpts({\n title,\n body,\n onOK: resolve,\n onCancel: reject,\n })\n setOpen(true)\n });\n }\n\n const handleClose = function() {\n onCancel && onCancel()\n setOpen(false)\n }\n\n const handleOK = function() {\n onOK && onOK()\n setOpen(false)\n }\n\n\n return (\n \n \n {title}\n { body &&\n \n {body}\n \n }\n \n \n \n \n \n { children }\n \n )\n}\n\nexport default ConfirmProvider\nexport { useConfirm };\n","import React, { useState, useEffect } from 'react';\nimport _ from \"lodash\";\nimport dayjs from \"dayjs\";\nimport DateUtils from '@date-io/dayjs';\nimport {\n Box,\n Button,\n Checkbox,\n InputAdornment,\n IconButton,\n Link,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n ListItemSecondaryAction,\n Popover,\n TextField,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport AddIcon from '@material-ui/icons/Add';\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { KeyboardDatePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';\nimport { useSnackbar } from 'notistack';\nimport { useConfirm } from \"./confirm\";\nimport api from \"api\";\n\nconst emailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/\n\nconst copyToClipboard = function(str) {\n if (navigator.clipboard) {\n // New hotness\n navigator.clipboard.writeText(str)\n } else {\n // Fallback to the old way\n const el = document.createElement('input');\n el.value = str;\n el.style.position = 'absolute';\n el.style.left = '-9999px';\n document.body.appendChild(el);\n const selected =\n document.getSelection().rangeCount > 0\n ? document.getSelection().getRangeAt(0)\n : false;\n el.select();\n el.setSelectionRange(0, 99999); /* For mobile devices */\n document.execCommand(\"copy\");\n document.body.removeChild(el);\n if (selected) {\n document.getSelection().removeAllRanges();\n document.getSelection().addRange(selected);\n }\n };\n};\n\nconst UserValidator = {\n validators: {\n // Login stuff\n username: async (val) => {\n if (!val) return \"Required\"\n if (val.length <= 3) return \"Username must be longer than 3 characters\"\n if (await api.usernameExists(val)) {\n return \"Username already exists\"\n }\n },\n passwd: async (val) => {\n if (!val) return \"Required\"\n if (val.length <= 3) return \"Password must be longer than 3 characters\"\n },\n // Basic info\n name: async (val) => {\n if (!val) return \"Required\"\n },\n email: async (val) => {\n if (!val) return \"Required\"\n if (!emailRegex.test(val)) return \"Invalid email\"\n },\n },\n\n async validateAttrs(user, attrs=[]) {\n let errs = {}\n\n // Await each field validator\n await Promise.all(attrs.map(async (attr) => {\n const validatorFn = UserValidator.validators[attr]\n const err = await validatorFn(user[attr])\n if (err) {\n errs[attr] = err\n }\n }))\n return errs\n },\n\n async validateLogin(user) {\n return UserValidator.validateAttrs(user, [\"username\", \"passwd\"])\n },\n\n async validateBasicInfo(user) {\n return UserValidator.validateAttrs(user, [\"name\", \"email\"])\n },\n}\n\nconst useStyles = makeStyles((theme) => ({\n categories: {\n maxHeight: \"20em\",\n overflow: \"auto\",\n },\n categoryButtons: {\n display: \"flex\",\n flexDirection: \"row\",\n gap: theme.spacing(2),\n maxWidth: \"300px\",\n },\n section: {\n maxWidth: \"400px\",\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n newItemPaper: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.paper,\n },\n}));\n\nfunction ShareLinkForm({user}) {\n const classes = useStyles();\n const { enqueueSnackbar } = useSnackbar();\n const { confirm } = useConfirm();\n const [links, setLinks] = useState([]);\n const [newLinkNotes, setNewLinkNotes] = useState(\"\");\n const [anchorEl, setAnchorEl] = useState(null);\n\n // Load up the links first\n useEffect(() => {\n let fn = async function() {\n const links = await api.getShareLinks(user.id)\n setLinks(links)\n }\n fn()\n }, [user.id])\n\n const deleteShareLink = async function(id) {\n await confirm(\"Are you sure you want to delete this link?\")\n await api.deleteShareLink(user.id, id)\n setLinks(links.filter((link) => (link.id !== id)))\n }\n\n const createShareLink = async function(e) {\n e && e.preventDefault();\n const link = await api.createShareLink(user.id, {notes: newLinkNotes});\n setLinks(links.concat(link));\n toggleOpenNew();\n }\n\n const toggleOpenNew = function(e) {\n setAnchorEl(anchorEl ? null : e.currentTarget);\n }\n\n const copyLink = function(e) {\n e.preventDefault();\n copyToClipboard(e.target.href)\n enqueueSnackbar(\"Link copied to clipboard!\")\n }\n\n const makeURL = function(link) {\n return Copy sharing link\n }\n\n return (\n \n \n { links.map((link) => {\n const {id, notes} = link;\n return (\n \n \n \n { deleteShareLink(id) }}>\n \n \n \n \n )\n })}\n \n\n \n }\n onClick={toggleOpenNew}\n >\n Add\n \n \n\n \n
\n { setNewLinkNotes(e.target.value) }}\n endAdornment={\n \n \n \n \n \n }\n />\n \n \n
\n )\n}\n\n\nfunction CategoryForm({user, onChange}) {\n const classes = useStyles();\n const [categories, setCategories] = useState((user.categories || []).sort());\n const [checked, setChecked] = useState({});\n const [newCategory, setNewCategory] = useState(\"\");\n const [anchorEl, setAnchorEl] = useState(null);\n\n const toggleOpenNewCategory = function(e) {\n setAnchorEl(anchorEl ? null : e.currentTarget);\n }\n\n const toggleCheck = function(category) {\n return function() {\n setChecked(Object.assign({}, checked, {[category]: !checked[category]}))\n }\n }\n const hasCheckedCategories = _.compact(_.values(checked)).length > 0\n\n const addNewCategory = function(e) {\n e && e.preventDefault();\n setCategories(categories.concat(newCategory))\n setNewCategory(\"\")\n setAnchorEl(null)\n }\n\n const deleteCategories = function(e) {\n e && e.preventDefault();\n setCategories(categories.filter((category) => !checked[category]))\n setChecked({})\n }\n\n useEffect(() => {\n const updatedUser = {\n categories,\n }\n onChange && onChange(updatedUser)\n }, [categories])\n\n\n return (\n
\n \n \n { categories.map((category) => {\n return (\n \n \n \n \n \n \n )\n })}\n \n \n\n \n }\n disabled={!hasCheckedCategories}\n onClick={deleteCategories}\n >\n Delete\n \n\n }\n onClick={toggleOpenNewCategory}\n >\n Add\n \n\n \n \n { setNewCategory(e.target.value) }}\n endAdornment={\n \n \n \n \n \n }\n />\n \n \n
\n \n )\n}\n\nfunction PasswordForm({user, errors={}, onChange}) {\n const [newPassword, setNewPassword] = useState(user.passwd)\n const [newPassword2, setNewPassword2] = useState(user.passwd)\n const [matchError, setMatchError] = useState(\"\")\n\n useEffect(() => {\n setMatchError(newPassword && newPassword2 && newPassword !== newPassword2 ? \"Passwords don't match\" : \"\")\n }, [newPassword, newPassword2])\n\n // Send the new password up\n useEffect(() => {\n if (!matchError && newPassword && newPassword2) {\n onChange && onChange({passwd: newPassword})\n }\n }, [newPassword, newPassword2, matchError])\n\n return (\n \n \n { setNewPassword(e.target.value) } }\n />\n \n\n \n { setNewPassword2(e.target.value) } }\n error={ !!matchError || !!errors.passwd}\n helperText={ matchError || errors.passwd }\n />\n \n \n )\n}\n\n// Used when creating a user and updating info\nfunction BasicInfoForm({user, errors={}, onChange, onSubmit}) {\n const {name, email, giftIdeas} = user;\n // This is necessary because dayjs nulls when they try to type\n const [birthday, setBirthday] = useState(user.birthday ? dayjs(user.birthday) : null)\n\n const sendUpdates = function(attr, val) {\n onChange && onChange({[attr]: val})\n }\n\n const update = function(attr) {\n return (e) => {\n sendUpdates(attr, e.target.value)\n }\n }\n\n useEffect(() => {\n sendUpdates(\"birthday\", birthday)\n }, [birthday])\n\n return (\n
\n \n \n \n\n \n \n \n\n \n \n { setBirthday(date) }}\n KeyboardButtonProps={{\n 'aria-label': 'change date',\n }}\n />\n \n \n\n \n \n \n
\n )\n}\n\nexport {\n BasicInfoForm,\n CategoryForm,\n PasswordForm,\n ShareLinkForm,\n UserValidator,\n}\n","// Import the required JavaScript and CSS on top of the component\nimport * as Driver from 'driver.js';\nimport 'driver.js/dist/driver.min.css';\n\n\nconst elementIDs = {\n newGiftLink: \"id-new-gift-link\",\n friendActionsLink: \"id-friend-actions\",\n showFriendsLink: \"id-show-friends-link\",\n homeLink: \"id-home-link\",\n giftIdeasLink: \"id-gift-ideas-link\",\n accountLink: \"id-account-link\",\n shareLink: \"id-share-link\",\n}\n\nfunction start() {\n // then add a click handler or however you\n // might want to trigger it and initialize the Driver\n const driver = new Driver();\n // Define the steps for introduction\n driver.defineSteps([\n {\n element: '#' + elementIDs.newGiftLink,\n popover: {\n className: '',\n title: 'New gift',\n description: 'Click here to create a new gift',\n position: \"top-right\",\n }\n },\n {\n element: '#' + elementIDs.friendActionsLink,\n popover: {\n className: '',\n title: 'Friend actions',\n description: 'Hover or long-press here to see actions you can do, like showing dibbed gifts or removing this friend',\n position: \"top-right\",\n }\n },\n {\n element: '#' + elementIDs.giftIdeasLink,\n popover: {\n className: '',\n title: 'View gift ideas',\n description: 'In addition to specific gifts, people can add ideas for gifts',\n position: \"bottom-right\",\n }\n },\n {\n element: '#' + elementIDs.showFriendsLink,\n stageBackground: \"blue\",\n popover: {\n className: '',\n title: 'View friend list',\n description: 'Click here to view your friend list or add friends',\n }\n },\n {\n element: '#' + elementIDs.homeLink,\n stageBackground: \"blue\",\n popover: {\n className: '',\n title: 'Your list',\n description: 'Click here to be taken back to your list',\n }\n },\n {\n element: '#' + elementIDs.shareLink,\n stageBackground: \"blue\",\n popover: {\n className: '',\n title: 'Sharing',\n description: 'Click here to share your list',\n position: \"bottom-right\",\n }\n },\n ])\n driver.start()\n}\n\nexport default {\n start,\n elementIDs,\n}\n","import _ from 'lodash';\nimport clsx from 'clsx';\nimport React, { useEffect, useCallback, useState, useContext } from 'react';\n/*\nimport PropTypes from 'prop-types';\n*/\nimport {\n Link as RouterLink,\n withRouter,\n} from \"react-router-dom\";\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport {\n AppBar,\n Avatar,\n Badge,\n Box,\n Button,\n CircularProgress,\n Drawer,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n IconButton,\n InputAdornment,\n Link,\n List,\n ListSubheader,\n ListItem,\n ListItemAvatar,\n ListItemText,\n ListItemSecondaryAction,\n Menu,\n MenuItem,\n TextField,\n Toolbar,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport AccountCircle from '@material-ui/icons/AccountCircle';\nimport CheckIcon from '@material-ui/icons/Check';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport ClearIcon from '@material-ui/icons/Clear';\nimport HomeIcon from '@material-ui/icons/Home';\nimport PersonAddIcon from '@material-ui/icons/PersonAdd';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport SearchIcon from '@material-ui/icons/Search';\nimport ShareIcon from '@material-ui/icons/Share';\nimport HelpIcon from '@material-ui/icons/Help';\nimport { useSnackbar } from 'notistack';\nimport AuthContext from 'contexts/auth';\nimport { UserAvatar } from './helpers';\nimport { ShareLinkForm } from './userform';\nimport api from \"api\";\nimport tour from \"./tour\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n },\n appBar: {\n transition: theme.transitions.create(['margin', 'width'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n },\n appBarShift: {\n width: `calc(100% - ${drawerWidth}px)`,\n marginLeft: drawerWidth,\n transition: theme.transitions.create(['margin', 'width'], {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n },\n grow: {\n flexGrow: 1,\n },\n menuButton: {\n marginRight: theme.spacing(2),\n },\n hide: {\n display: 'none',\n },\n drawer: {\n width: drawerWidth,\n flexShrink: 0,\n },\n drawerPaper: {\n width: drawerWidth,\n },\n drawerHeader: {\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(0, 1),\n // necessary for content to be below app bar\n ...theme.mixins.toolbar,\n justifyContent: 'flex-end',\n },\n content: {\n flexGrow: 1,\n padding: theme.spacing(3),\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n marginLeft: -drawerWidth,\n },\n contentShift: {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.enteringScreen,\n }),\n marginLeft: 0,\n },\n dialogContent: {\n height: \"300px\",\n width: \"400px\",\n overflowY: \"auto\",\n },\n addFriendIcon: {\n color: theme.palette.getContrastText(theme.palette.primary.light),\n backgroundColor: theme.palette.primary.light,\n },\n requestsIcon: {\n color: theme.palette.getContrastText(theme.palette.secondary.light),\n backgroundColor: theme.palette.secondary.light,\n },\n friendListSubheader: {\n backgroundColor: theme.palette.background.paper,\n },\n scrollY: {\n height: \"100%\",\n overflowY: \"auto\",\n },\n approvePaper: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.paper,\n },\n}));\n\n\nconst AddFriendsDialog = function({open, onClose}) {\n const classes = useStyles();\n const { enqueueSnackbar } = useSnackbar();\n const { addFriend } = useContext(AuthContext)\n const [users, setUsers] = useState([]);\n const [loading, setLoading] = useState(false);\n const [searchVal, setSearchVal] = useState(\"\");\n\n const searchUsers = useCallback(\n _.debounce(async function (search) {\n if (search) {\n const users = await api.searchUsers(search)\n setUsers(users || [])\n }\n setLoading(false)\n }, 300),\n []\n )\n\n const add = async function(user) {\n await addFriend(user)\n enqueueSnackbar(\"Invite sent to \" + user.name)\n onClose()\n }\n\n useEffect(() => {\n setLoading(true)\n setUsers([])\n searchUsers(searchVal)\n }, [searchVal, searchUsers])\n\n\n return (\n \n Add friends\n \n { setSearchVal(e.target.value) }}\n InputProps={{\n startAdornment: (\n \n \n \n ),\n endAdornment: loading ? : null\n }}\n />\n \n \n { users.map((user) => (\n add(user)}>\n \n \n \n \n \n ))}\n \n \n \n \n )\n}\n\nconst RequestListItem = function({user}) {\n const { enqueueSnackbar } = useSnackbar();\n const [loading, setLoading] = useState(false);\n const { approveRequest, denyRequest } = useContext(AuthContext)\n\n const approve = async function(reqUser) {\n setLoading(true)\n try {\n await approveRequest(reqUser)\n enqueueSnackbar(reqUser.name + \" added to friend list\")\n } catch {\n }\n setLoading(false)\n }\n\n const deny = async function(reqUser) {\n setLoading(true)\n try {\n await denyRequest(reqUser)\n enqueueSnackbar(reqUser.name + \"'s invite declined\")\n } catch {\n }\n setLoading(false)\n }\n\n return (\n \n \n \n \n\n \n\n \n { loading ? : (\n \n approve(user)}>\n \n \n deny(user)}>\n \n \n \n )}\n \n \n )\n}\n\nconst RequestDialog = function({open, onClose}) {\n const classes = useStyles();\n const { user } = useContext(AuthContext)\n\n return (\n \n Friend requests\n\n \n \n \n { _.sortBy(user.requests, [\"name\"]).map((reqUser) => (\n \n ))}\n \n \n \n\n \n \n \n \n )\n}\n\nconst ShareDialog = function({open, onClose}) {\n const classes = useStyles();\n const { user } = useContext(AuthContext)\n\n return (\n \n Sharing your wishlist\n\n \n \n Public Links\n Anyone can use these links to dib your gifts\n \n \n \n \n )\n}\n\nconst FriendList = withRouter(function({onClick}) {\n const classes = useStyles();\n const { user } = useContext(AuthContext)\n const [openAddFriends, setOpenAddFriends] = useState(false);\n const [openRequests, setOpenRequests] = useState(false);\n\n return (\n \n \n Friends list\n { _.sortBy(user.friends || [], [\"name\"]).map((friend) => {\n return (\n \n \n \n \n \n \n )\n })}\n\n \n\n { setOpenAddFriends(true) }}>\n \n \n \n \n \n \n \n\n { (user.requests || []).length > 0 &&\n { setOpenRequests(true) }}>\n \n \n { (user.requests || []).length }\n \n \n \n \n }\n \n\n { setOpenRequests(false) }}\n />\n\n { setOpenAddFriends(false) }}\n />\n \n )\n})\n\nconst drawerWidth = 240;\n\nconst Navbar = withRouter(function(props) {\n const classes = useStyles();\n const theme = useTheme();\n const { user, signout } = useContext(AuthContext);\n\n const handleSignout = () => {\n signout();\n }\n\n const [open, setOpen] = useState(false);\n\n const handleDrawerOpen = () => {\n setOpen(true);\n };\n\n const handleDrawerClose = () => {\n setOpen(false);\n };\n\n const [anchorEl, setAnchorEl] = React.useState(null);\n\n const handleAccountMenuClick = (event) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleAccountMenuClose = () => {\n setAnchorEl(null);\n };\n\n const [openSharing, setOpenSharing] = useState(false);\n\n const handleSharingClick = () => {\n setOpenSharing(true);\n }\n\n const handleSharingClose = () => {\n setOpenSharing(false)\n }\n return (\n
\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \n WeGotDibs!\n \n\n \n { e.stopPropagation(); tour.start() }}\n >\n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n My account\n Logout\n\n \n \n \n\n \n\n \n
\n \n {theme.direction === 'ltr' ? : }\n \n
\n \n \n \n
\n )\n})\n\nexport default Navbar;\n","import _ from \"lodash\";\nimport { createContext, useState, useEffect, useContext } from \"react\";\nimport AuthContext from 'contexts/auth';\nimport api from \"api\";\n\nconst GiftContext = createContext();\n\nfunction useGiftState(initialGifts, friendID) {\n const { user } = useContext(AuthContext)\n const [giftInfo, setGiftInfo] = useState({gifts: initialGifts, loadingMessage: \"\"});\n\n useEffect(() => {\n setGiftInfo({gifts: [], loadingMessage: \"Loading gifts...\"})\n api.fetchGifts(friendID).then((gifts) => {\n setGiftInfo({\n gifts,\n loadingMessage: \"\",\n })\n })\n }, [friendID])\n\n // Allows for individual gift changes, for dibs and for creating new gifts\n const updateLocalGift = async (giftID, newGift) => {\n if (!newGift) {\n newGift = await api.fetchGift(friendID, giftID)\n }\n let gifts = _.cloneDeep(giftInfo.gifts)\n let oldGift = gifts.find((gift) => gift.id === newGift.id)\n // If we couldn't find it, assume it's new\n if (!oldGift) {\n gifts.push(newGift)\n } else {\n Object.assign(oldGift, newGift)\n }\n setGiftInfo({\n gifts,\n loadingMessage: \"\",\n })\n }\n\n const saveGift = async (gift) => {\n // Validation\n const newGift = await api.saveGift(user.id, gift)\n updateLocalGift(gift.id, newGift)\n }\n\n const deleteGift = async (gift) => {\n await api.deleteGift(user.id, gift.id)\n let gifts = _.cloneDeep(giftInfo.gifts)\n _.remove(gifts, (g) => g.id === gift.id)\n setGiftInfo({\n gifts,\n loadingMessage: \"\",\n })\n }\n\n const createDib = async (dib) => {\n await api.createDib(friendID, dib)\n updateLocalGift(dib.gift_id)\n }\n\n const deleteDib = async (dib) => {\n await api.deleteDib(friendID, dib.id)\n updateLocalGift(dib.gift_id)\n }\n\n return { giftInfo, createDib, deleteDib, saveGift, deleteGift }\n}\n\nexport default GiftContext\nexport {\n useGiftState,\n}\n","import _ from 'lodash';\nimport React, { useState, useEffect, useContext, useRef } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport {\n Box,\n Card,\n CardContent,\n CardHeader,\n CircularProgress,\n Collapse,\n Drawer,\n Divider,\n Fab,\n IconButton,\n MenuItem,\n Paper,\n Popover,\n TextField,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport {\n SpeedDial,\n SpeedDialAction,\n SpeedDialIcon,\n Rating,\n} from '@material-ui/lab';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport AddIcon from '@material-ui/icons/Add';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport SaveIcon from '@material-ui/icons/Save';\nimport LaunchIcon from '@material-ui/icons/Launch';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport VisibilityIcon from '@material-ui/icons/Visibility';\nimport VisibilityOffIcon from '@material-ui/icons/VisibilityOff';\nimport LightbulbIcon from '@material-ui/icons/WbIncandescentOutlined';\nimport { useSnackbar } from 'notistack';\nimport { useConfirm } from \"../confirm\";\nimport { InView } from 'react-intersection-observer';\nimport AuthContext from \"contexts/auth\";\nimport GiftContext, { useGiftState } from \"contexts/gift\";\nimport { Overlay, StarHeader, PromiseButton, UserAvatar } from '../helpers'\nimport tour from \"../tour\";\n\nfunction GiftEditor(props) {\n const { selectedGift, setSelectedGift, saveGift, deleteGift } = useContext(GiftContext);\n const { enqueueSnackbar } = useSnackbar();\n const { confirm } = useConfirm();\n\n const { user } = useContext(AuthContext)\n const [gift, setGift] = useState(selectedGift);\n\n useEffect(() => {\n setGift(Object.assign({\n // Need to have empty fields, since it appears if you don't supply\n // a field value it doesn't overwrite (might have something to do\n // with the s\n id: undefined,\n name: \"\",\n notes: \"\",\n url: \"\",\n category: \"\",\n rating: 1,\n }, selectedGift))\n }, [selectedGift])\n\n const onClose = function() {\n setSelectedGift({})\n }\n\n const onSave = async function(e) {\n e && e.preventDefault()\n await saveGift(gift)\n enqueueSnackbar(\"Gift saved\", {variant: \"success\"})\n onClose()\n }\n\n const onDelete = async function(e) {\n e && e.preventDefault()\n try {\n await confirm(\"Delete Gift\", \"Are you sure you want to delete this gift?\")\n } catch {\n return\n }\n await deleteGift(gift)\n enqueueSnackbar(\"Gift deleted\")\n onClose()\n }\n\n const onChangeGiftAttr = (attr) => {\n return (e) => {\n const val = e.target.value\n setGiftAttr(attr, val)\n }\n }\n\n const setGiftAttr = (attr, val) => {\n let g = _.cloneDeep(gift)\n g[attr] = val\n setGift(g)\n }\n\n return (\n
\n { !!selectedGift.id ? \"Change\" : \"Add\" } gift\n
\n \n \n \n\n \n \n { user.categories.map((category) => {\n return { category }\n })\n }\n \n \n\n \n \n \n\n \n \n \n\n \n Rating\n \n \n\n \n }\n onClick={onSave}\n >\n Save\n \n { gift.id &&\n }\n onClick={onDelete}\n >\n Delete\n \n }\n \n
\n\n Preview\n \n
\n )\n}\n\nfunction DibEditor(props) {\n const { selectedGift, setSelectedGift, createDib } = useContext(GiftContext);\n //const [occasionID, setOccasionID] = useState();\n const { enqueueSnackbar } = useSnackbar();\n\n const onClose = () => {\n setSelectedGift({})\n }\n\n const submitDib = async () => {\n let dib = {\n gift_id: selectedGift.id,\n //occasion_id: occasionID,\n quantity: 1,\n }\n await createDib(dib)\n enqueueSnackbar(\"Dibbed!\", {variant: \"success\"})\n onClose()\n }\n\n return (\n { e.preventDefault(); e.stopPropagation(); }} >\n { /*\n \n setOccasionID(parseInt(e.target.value))}\n >\n --\n Birthday\n Christmas\n \n \n */ }\n Dib it\n \n )\n}\n\nfunction DibOverlay(props) {\n const { dibs } = props;\n const { confirm } = useConfirm();\n const { user } = useContext(AuthContext)\n const { deleteDib } = useContext(GiftContext);\n const ourDib = dibs.find((dib) => dib.user_id === user.id);\n\n const delDib = async () => {\n await confirm(\"Remove this dib?\", \"\")\n deleteDib(ourDib)\n }\n\n return (\n \n

\n { /* If it's our dib, let it be clickable to un-dib */ }\n \n DIBBED { !!ourDib && \" BY YOU\" }\n \n\n

\n
\n )\n}\n\n\nconst amazonSearchParams = {\n \"tag\": \"wegotdibs-20\",\n \"linkCode\": \"ur2\",\n \"linkId\": \"3c97dcf6dfc206b17e2b0bacb0fb5baa\",\n \"camp\": \"1789\",\n \"creative\": \"9325\",\n}\n\nconst withAmazonParams = function(orgURL) {\n // For amazon we want to add our nice tracking links\n const url = new URL(orgURL);\n const params = new URLSearchParams(url.search);\n Object.keys(amazonSearchParams).forEach((key) => {\n params.set(key, amazonSearchParams[key])\n })\n url.search = params.toString()\n return url.toString()\n}\n\nfunction GiftBlock(props) {\n const { isMyList } = useContext(GiftContext);\n const { gift, onClick, isSelected } = props\n const isDibbed = !_.isEmpty(gift.dibs)\n const dibRef = useRef(null)\n\n let giftURL = gift.url\n if (giftURL && giftURL.includes(\"amazon.com\")) {\n giftURL = withAmazonParams(giftURL)\n }\n const scrollIntoView = function() {\n dibRef.current.scrollIntoView({behavior: \"smooth\", block: \"nearest\"})\n }\n\n return (\n \n { (!isMyList && isDibbed) && }\n \n { e.stopPropagation() }}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n \n \n \n )}\n />\n\n { gift.notes &&\n \n { gift.notes }\n \n }\n { !isMyList &&\n \n \n \n \n \n \n }\n \n )\n}\n\nconst useStyles = makeStyles((theme) => ({\n sectionHeader: {\n position: \"sticky\",\n top: -1,\n zIndex: 1020,\n\n backgroundColor: theme.palette.background.paper,\n borderBottom: \"1px solid \" + theme.palette.divider,\n padding: theme.spacing(2),\n lineHeight: \"3em\",\n display: \"flex\",\n flexDirection: \"row\",\n },\n stuck: {\n boxShadow: theme.shadows[3],\n },\n giftLoader: {\n position: \"absolute\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n backgroundColor: theme.palette.action.disabledBackground,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n },\n sectionBody: {\n display: \"flex\",\n flexWrap: \"wrap\",\n alignContent: \"stretch\",\n padding: theme.spacing(2),\n },\n avatarHeader: {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingLeft: theme.spacing(2),\n backgroundColor: theme.palette.background.paper,\n },\n floatingButton: {\n position: \"absolute\",\n bottom: theme.spacing(4),\n right: theme.spacing(4),\n zIndex: 1100,\n }\n}))\n\nfunction GiftGroup(props) {\n const { rating, gifts, rootEl } = props\n const classes = useStyles();\n const { selectedGift, setSelectedGift } = useContext(GiftContext)\n const ratingGifts = gifts[rating]\n if (_.isEmpty(ratingGifts)) return null\n\n return (\n
\n \n {({ inView, ref, entry }) => {\n return (\n
\n \n
\n )\n }}\n
\n
\n { ratingGifts.sort((a, b) => { return a.id - b.id }).map((gift) => {\n const isSelected = selectedGift.id === gift.id\n const onClick = () => {\n setSelectedGift(isSelected ? {} : gift)\n }\n\n return (\n
\n \n
\n )\n })\n }\n
\n
\n )\n}\n\nfunction GiftOwnerDetails({ideas}) {\n const theme = useTheme();\n const [anchorEl, setAnchorEl] = useState(null);\n const toggleOpen = (e) => {\n setAnchorEl(anchorEl ? null : e.currentTarget)\n }\n\n return (\n \n \n \n \n \n \n\n \n \n Gift ideas\n { ideas }\n \n \n \n )\n}\n\nfunction Gifts({friend}) {\n const classes = useStyles();\n const theme = useTheme();\n const history = useHistory();\n const { confirm } = useConfirm();\n\n const giftsRef = useRef(null);\n const { user, removeFriend } = useContext(AuthContext)\n const [selectedGift, setSelectedGift] = useState({})\n const [filteredGifts, setFilteredGifts] = useState([])\n const [showDibbed, setShowDibbed] = useState(false);\n const isMyList = friend.id === user.id\n\n const { giftInfo, createDib, deleteDib, saveGift, deleteGift } = useGiftState([], friend.id);\n\n // Speed dial controls\n const [openDial, setOpenDial] = useState(false);\n const handleCloseDial = () => {\n setOpenDial(false);\n };\n const handleOpenDial = () => {\n setOpenDial(true);\n };\n\n const handleCloseDrawer = () => {\n setSelectedGift({})\n };\n\n useEffect(() => {\n if (isMyList) {\n setShowDibbed(false)\n }\n }, [isMyList])\n\n const toggleShowDibbed = () => {\n setShowDibbed(!showDibbed)\n }\n\n const unfriend = async () => {\n await confirm(\"Remove Friend\", `Are you sure you want to remove ${ friend.name }?`)\n removeFriend(friend)\n history.push(\"/\")\n }\n\n // When the gifts change, un-select any gifts\n useEffect(() => {\n setSelectedGift({})\n }, [giftInfo.gifts])\n\n // Figure out what filtered gifts to show\n useEffect(() => {\n let _gifts = giftInfo.gifts || []\n if (!showDibbed) {\n // Show the gifts that don't have dibs or are dibbed by the current user\n _gifts = _gifts.filter((gift) => {\n return _.isEmpty(gift.dibs) || !!gift.dibs.find((dib) => dib.user_id === user.id);\n })\n }\n setFilteredGifts(_.groupBy(_gifts, \"rating\"))\n }, [user.id, showDibbed, giftInfo.gifts])\n\n return (\n \n
\n { giftInfo.loadingMessage &&\n \n
\n \n  { giftInfo.loadingMessage }\n
\n
\n }\n
\n \n \n \n { friend.name }\n \n { friend.giftIdeas && (\n \n )}\n \n\n
\n { [3, 2, 1].map((rating) => {\n return (\n \n )\n })\n }\n
\n
\n\n { isMyList ?\n \n \n
\n \n {theme.direction === 'ltr' ? : }\n \n
\n \n \n
\n\n {setSelectedGift({rating: 1})} }\n >\n \n \n
\n :\n \n }\n onClose={handleCloseDial}\n onOpen={handleOpenDial}\n open={openDial}\n direction=\"up\"\n >\n : }\n tooltipTitle={ (showDibbed ? \"Hide\" : \"Show\") + \" dibbed gifts\" }\n onClick={toggleShowDibbed}\n />\n { !user.isGuest &&\n }\n tooltipTitle=\"Remove friend\"\n onClick={unfriend}\n />\n }\n \n \n }\n
\n
\n )\n}\n\nexport default Gifts\n","import { createContext, useState, useContext } from \"react\";\nimport AuthContext from 'contexts/auth';\n\nconst FriendContext = createContext();\n\nfunction useFriendState() {\n const { user } = useContext(AuthContext)\n const [friend, setFriend] = useState(null);\n\n const setFriendID = function(friendID) {\n if (!friendID || friendID === user.id) {\n return setFriend(user)\n }\n // Find the friend in the list of user friends\n const owner = user.friends.find((friend) => (friend.id === friendID))\n if (!owner) {\n return console.error(\"NO OWNER FOUND WITH ID\", friendID)\n }\n setFriend(owner)\n }\n\n return {\n friend,\n setFriend,\n setFriendID,\n }\n}\n\nexport default FriendContext\nexport { useFriendState };\n","import React, { useEffect } from 'react';\nimport { useParams } from \"react-router-dom\";\nimport GiftsView from \"./gifts\";\nimport { useFriendState } from 'contexts/friend';\n\nconst FriendGiftsView = function() {\n let { id } = useParams();\n const { friend, setFriendID } = useFriendState();\n\n useEffect(() => {\n setFriendID(parseInt(id));\n }, [id])\n\n // If they aren't signed in, let's do that first\n if (!friend) {\n return null\n }\n return \n}\n\nexport default FriendGiftsView;\n","import React, { useEffect, useContext } from 'react';\nimport { useLocation, useHistory, useParams } from \"react-router-dom\";\nimport {\n Box,\n Button,\n ButtonGroup,\n Container,\n CircularProgress,\n Divider,\n Typography,\n} from \"@material-ui/core\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport AccountCircleIcon from '@material-ui/icons/AccountCircle';\nimport PersonAddIcon from '@material-ui/icons/PersonAdd';\nimport PersonOutlineIcon from '@material-ui/icons/PersonOutline';\nimport GiftsView from \"./gifts\";\nimport AuthContext from 'contexts/auth';\nimport { useFriendState } from 'contexts/friend';\nimport api from \"api\";\n\nconst useStyles = makeStyles((theme) => ({\n buttonForm: {\n marginTop: theme.spacing(4),\n textAlign: \"center\",\n },\n buttonGroup: {\n marginBottom: theme.spacing(4),\n },\n}))\n\nconst SharedLoginView = function() {\n const classes = useStyles();\n const location = useLocation();\n const history = useHistory();\n\n const redirect = function(uri) {\n const searchParams = \"?next=\" + encodeURIComponent(location.pathname)\n history.push(uri + searchParams)\n }\n\n return (\n \n Shared List\n \n Before you can dib a gift, you need to sign in.\n \n \n \n redirect(\"/p/guestsignin\")}\n variant=\"contained\"\n color=\"primary\"\n size=\"large\"\n startIcon={}\n >\n Guest Sign In\n \n \n\n \n redirect(\"/p/signin\")}\n startIcon={}\n >\n Existing Profile\n \n redirect(\"/p/createuser\")}\n startIcon={}\n >\n New Profile\n \n \n \n \n )\n}\n\nconst SharedGiftsView = function() {\n let { id } = useParams();\n const { friend, setFriend } = useFriendState();\n const { isSignedIn } = useContext(AuthContext);\n\n useEffect(() => {\n // Need to get that share info\n const fn = async function() {\n const data = await api.getShareLink(id);\n api.setSharingLink(id);\n setFriend(data.user);\n }\n fn()\n }, [id, setFriend])\n\n // If they aren't signed in, let's do that first\n if (!isSignedIn) {\n return \n }\n if (!friend) {\n return \n }\n return \n}\n\nexport default SharedGiftsView;\n","import React, { createRef, useState, useEffect, useContext } from 'react';\nimport jwt_decode from 'jwt-decode';\nimport {\n Box,\n Container,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport AuthContext from \"contexts/auth\";\nimport api from \"api\";\nimport { PromiseButton } from \"../helpers\";\n\nconst googleClientID = \"393862830732-ph79stt1ru7br4pi571rqfmk71dgcisf.apps.googleusercontent.com\"\n\nconst GoogleSignIn = function({onSignIn}) {\n const { signin } = useContext(AuthContext);\n const [initialized, setInitialized] = useState(false);\n const googleButtonRef = createRef(null);\n\n const handleGoogleResp = async function(resp) {\n const decodedToken = jwt_decode(resp.credential)\n try {\n let user = await api.loginGoogleToken(decodedToken)\n signin(user)\n onSignIn && onSignIn()\n } catch(err) {\n alert(err)\n }\n }\n\n useEffect(() => {\n if (!initialized) return\n window.google.accounts.id.initialize({\n client_id: googleClientID,\n callback: handleGoogleResp,\n });\n window.google.accounts.id.renderButton(googleButtonRef.current, {\n type: \"standard\",\n theme: \"outline\",\n size: \"large\",\n text: \"signin_with\",\n shape: \"rectangular\",\n logo_alignment: \"left\",\n });\n }, [initialized])\n\n // Just run once\n useEffect(() => {\n // Load the google api script\n const script = document.createElement('script')\n script.src = 'https://accounts.google.com/gsi/client'\n script.onload = () => { setInitialized(true) }\n script.async = true;\n document.querySelector('body').appendChild(script)\n }, [])\n\n return (\n
\n )\n}\n\nconst SignIn = function({onSignIn}) {\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [errors, setErrors] = useState({});\n const { signin } = useContext(AuthContext)\n\n let submit = async function(e) {\n e && e.preventDefault()\n\n // Validation\n const errs = {}\n if (!username) errs.username = \"Required\"\n if (!password) errs.password = \"Required\"\n if (Object.keys(errs).length > 0) {\n return setErrors(errs)\n }\n\n let user = await api.loginUserPassword(username, password)\n signin(user)\n onSignIn && onSignIn()\n }\n\n useEffect(() => {\n // Clear errors if they changed\n const errs = Object.assign({}, errors)\n if (username && errs.username) delete errs.username\n if (password && errs.password) delete errs.password\n setErrors(errs)\n }, [username, password])\n\n return (\n \n Sign In\n
\n \n { setUsername(e.target.value) }}\n />\n \n\n \n { setPassword(e.target.value) }}\n />\n \n\n 0}\n endIcon={}\n fullWidth={true}\n onClick={submit}\n >Sign In\n \n\n \n \n \n
\n )\n}\nexport default SignIn;\n","import React, { useContext, useEffect, useState } from 'react';\nimport {\n Box,\n Container,\n TextField,\n Typography,\n} from \"@material-ui/core\";\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport AuthContext from \"contexts/auth\";\nimport { PromiseButton } from \"../helpers\";\nimport api from \"api\";\n\nconst GuestSignIn = function({onSignIn}) {\n const [email, setEmail] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [errors, setErrors] = useState({});\n const { signin } = useContext(AuthContext)\n\n let submit = async function(e) {\n e && e.preventDefault()\n\n // Validation\n const errs = {}\n if (!email) errs.email = \"Required\"\n if (!name) errs.name = \"Required\"\n if (Object.keys(errs).length > 0) {\n return setErrors(errs)\n }\n\n let user = await api.guestLogin(email, name)\n signin(user)\n onSignIn && onSignIn()\n }\n\n useEffect(() => {\n // Clear errors if they changed\n const errs = Object.assign({}, errors)\n if (email && errs.email) delete errs.email\n if (name && errs.name) delete errs.name\n setErrors(errs)\n }, [email, name])\n\n return (\n \n Guest Profile\n
\n \n setEmail(e.target.value)}\n />\n \n \n setName(e.target.value)}\n />\n \n 0}\n endIcon={}\n fullWidth\n onClick={submit}\n >\n Sign In\n \n \n
\n )\n}\n\nexport default GuestSignIn;\n","import React, { useState, useContext } from 'react';\nimport _ from \"lodash\";\nimport {\n Box,\n Button,\n Container,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ArrowForwardIcon from '@material-ui/icons/ArrowForward';\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport api from \"api\";\nimport AuthContext from \"contexts/auth\";\nimport { BasicInfoForm, CategoryForm, PasswordForm, UserValidator } from \"../userform\";\nimport { PromiseButton } from \"../helpers\";\n\nconst useStyles = makeStyles((theme) => ({\n section: {\n maxWidth: \"400px\",\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n navButtons: {\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n marginTop: theme.spacing(2),\n },\n}));\n\nfunction CreateUser({onCreate}) {\n const classes = useStyles()\n const [user, setLocalUser] = useState({categories: [\"Books\", \"Clothing\", \"Games\", \"Movies / TV\", \"Music\"]})\n const [step, setStep] = useState(1)\n const [errors, setErrors] = useState({})\n const { signin } = useContext(AuthContext)\n\n const updateUser = function(updates) {\n // remove the errors of stuff that changed\n const newErrs = Object.assign({}, errors)\n _.forOwn(updates, (val, key) => {\n if (user[key] !== val && errors[key]) {\n delete newErrs[key]\n }\n })\n setErrors(newErrs)\n setLocalUser(Object.assign({}, user, updates))\n }\n\n const gotoPrevStep = function() {\n setStep(step - 1)\n setErrors({})\n }\n\n const gotoNextStep = function(validatorFn) {\n return async () => {\n const errs = await validatorFn(user)\n setErrors(errs)\n\n if (Object.keys(errs).length > 0) {\n return\n }\n setStep(step + 1)\n }\n }\n\n const createUser = async function() {\n const newUser = await api.saveUser(user)\n signin(newUser)\n onCreate && onCreate()\n }\n\n const renderStep = function() {\n switch (step) {\n case 1:\n return (\n
\n { updateUser({username: e.target.value}) }}\n />\n \n { renderNavButtons(gotoNextStep(UserValidator.validateLogin)) }\n \n )\n case 2:\n return (\n
\n \n { renderNavButtons(gotoNextStep(UserValidator.validateBasicInfo)) }\n \n )\n case 3:\n return (\n \n Gift Categories\n Used to help organize your gifts. Can be changed later.\n \n { renderNavButtons(createUser) }\n \n )\n default:\n return null\n }\n }\n\n const renderNavButtons = function(nextFn) {\n return (\n \n { step !== 1 &&\n }\n onClick={ gotoPrevStep }\n >Back\n }\n \n 0}\n endIcon={step !== 3 ? : }\n onClick={nextFn}\n >{ step !== 3 ? \"Next\" : \"Finish\" }\n \n )\n }\n\n return (\n \n Create Profile\n \n { renderStep() }\n \n\n \n )\n}\n\nexport default CreateUser\n","import React, { useContext, useState } from 'react';\nimport {\n Box,\n Container,\n Divider,\n Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport SaveIcon from '@material-ui/icons/Save';\nimport { useSnackbar } from 'notistack';\nimport AuthContext from 'contexts/auth';\nimport { BasicInfoForm, CategoryForm, PasswordForm, UserValidator } from \"../userform\";\nimport { PromiseButton } from \"../helpers\";\n\nconst useStyles = makeStyles((theme) => ({\n section: {\n maxWidth: \"400px\",\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n}));\n\nfunction User() {\n const classes = useStyles()\n const { enqueueSnackbar } = useSnackbar();\n const { user, saveUser } = useContext(AuthContext)\n const [basicInfo, setBasicInfo] = useState(user || {})\n const [basicInfoErrors, setBasicInfoErrors] = useState({})\n const [passwordChanges, setPasswordChanges] = useState({})\n\n const handleBasicInfoChange = function(changes) {\n setBasicInfo(Object.assign({}, basicInfo, changes))\n }\n\n const handleBasicInfoSave = async function() {\n // Check for errors\n const errors = UserValidator.validateBasicInfo(basicInfo)\n setBasicInfoErrors(errors)\n if (Object.keys(errors).length > 0) return\n\n await saveUser(basicInfo)\n enqueueSnackbar(\"User info updated\")\n }\n\n const handlePasswordSave = async function() {\n await saveUser(passwordChanges)\n enqueueSnackbar(\"Password changed\")\n }\n\n return (\n \n \n Basic Info\n \n }\n onClick={handleBasicInfoSave}\n >Save\n \n\n \n\n \n Categories\n \n \n\n \n\n \n Change Password\n \n }\n onClick={handlePasswordSave}\n >Change\n \n\n \n )\n}\n\nexport default User\n","import React from 'react';\nimport {\n AppBar,\n Box,\n Button,\n Stepper,\n Step,\n StepLabel,\n Toolbar,\n Typography,\n Zoom,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n Link as RouterLink,\n withRouter,\n} from \"react-router-dom\";\n\nconst steps = [\n \"Create a profile\",\n \"Add gifts to your wishlist\",\n \"Share with friends\",\n]\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n },\n content: {\n height: \"100%\",\n padding: theme.spacing(4),\n overflowY:\"auto\",\n maxWidth: theme.breakpoints.md,\n backgroundColor: theme.palette.background.paper,\n },\n textBox: {\n marginTop: 0,\n marginBottom: theme.spacing(10),\n marginLeft: \"auto\",\n marginRight: \"auto\",\n maxWidth: \"700px\",\n },\n}))\n\n\nconst HomePage = function(props) {\n const classes = useStyles();\n\n return (\n \n \n \n \n \n\n \n \n \n\n \n We Got Dibs\n \n Wishlists for people who like suprises!\n \n
\n \n \n Other wishlists alert you when people get things off your list, but my favorite part of gift-giving is seeing the surprise and joy on people's faces, so I built this!\n \n \n\n \n How's it work?\n\n \n {steps.map((label) => (\n \n {label}\n \n ))}\n \n\n \n You and your friends can call dibs on people's gifts without alerting them.\n
\n Voila! Simple gift management without ruining the surprise.\n
\n
\n
\n
\n )\n}\nexport default withRouter(HomePage);\n","import React, { useContext } from 'react';\nimport {\n BrowserRouter as Router,\n Switch,\n Route,\n Redirect,\n} from \"react-router-dom\";\nimport {\n CssBaseline,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { SnackbarProvider } from 'notistack';\nimport AuthContext, { useUserState } from './contexts/auth';\nimport Navbar from \"./navbar\";\nimport ConfirmProvider from \"./confirm\";\nimport FriendGiftsView from \"./views/friendgifts\";\nimport SharedGiftsView from \"./views/sharedgifts\";\nimport SignInView from \"./views/signin\";\nimport GuestSignInView from \"./views/guestsignin\";\nimport CreateUserView from \"./views/createuser\";\nimport AccountView from \"./views/account\";\nimport HomeView from \"./views/home\";\n\nconst useStyles = makeStyles((theme) => ({\n flexColumn: {\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n },\n flexColumnScroll: {\n flexGrow: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n },\n}))\n\nfunction PrivateRoute({ children, render, ...rest }) {\n const { isSignedIn, user } = useContext(AuthContext);\n\n const renderChildren = function(props) {\n if (children) return children\n if (render) return render(props)\n return null\n }\n return (\n {\n const { location } = props;\n return isSignedIn && !user.isGuest ? renderChildren(props) : (\n \n )\n }}\n />\n );\n}\n\nfunction NavHeader({children}) {\n const classes = useStyles();\n const { isSignedIn, user } = useContext(AuthContext);\n\n return (\n
\n { isSignedIn && !user.isGuest ? : null }\n
\n { children }\n
\n
\n )\n}\n\n\nfunction App() {\n const userState = useUserState();\n const { user, isSignedIn } = userState;\n\n const renderRedirect = function() {\n return \n }\n\n const renderNext = function({history, location}) {\n let params = new URLSearchParams(location.search)\n let next = params.get(\"next\") || \"/p/gifts\" + user.id\n return () => history.push(next)\n }\n\n return (\n \n \n \n \n \n
\n \n \n \n \n\n (\n \n )}>\n \n\n (\n \n )}>\n \n\n (\n \n )}>\n \n\n { /* Paths that should show the navbar, if the user is signed in */ }\n \n \n \n { /* this is relevant to both public and private users */ }\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n\n \n
\n
\n \n
\n
\n )\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}