{"version":3,"sources":["store/hooks.ts","assets/images/logo.png","components/layout/layout-slice.ts","components/layout/layout.tsx","integrations/apollo-client/create-apollo-client.ts","integrations/apollo-client/create-apollo-link.ts","pages/character/pages/character-list/character-list-slice.ts","store/store.tsx","components/common/back-button/back-button.tsx","components/common/pagination/pagination.tsx","graphql/generated/graphql.tsx","components/common/pagination/pagination.utils.ts","components/common/scroll-top-button/scroll-top-button.tsx","utils/array.ts","pages/character/pages/character-details/character-details-episode.tsx","components/common/character-badge/character-badge.tsx","config/constants.ts","pages/character/pages/character-details/character-details-info.tsx","pages/character/pages/character-details/character-details.tsx","pages/character/pages/character-list/character-list-item.tsx","pages/character/pages/character-list/character-list-items.tsx","pages/character/pages/character-list/character-list-main.tsx","hooks/use-debounced-value.ts","pages/character/pages/character-list/character-list-const.ts","pages/character/pages/character-list/character-list-sidebar.tsx","pages/character/pages/character-list/character-list.tsx","pages/character/character.tsx","app.tsx","report-web-vitals.ts","index.tsx"],"names":["useAppDispatch","useDispatch","useAppSelector","useSelector","layoutSlice","createSlice","name","initialState","isSidebarOpened","reducers","toggleSidebar","state","actions","selectSidebarState","layout","Layout","children","LayoutTopBar","isPageWithSidebar","useLocation","pathname","position","justify","align","h","p","bg","boxShadow","as","Link","aria-label","to","alt","src","logoSrc","LayoutTopBarBurger","dispatch","label","onClick","icon","display","colorScheme","variant","left","top","transform","link","errorLink","onError","networkError","graphQLErrors","operation","operationName","includes","forEach","httpLink","HttpLink","uri","credentials","ApolloLink","from","createApolloLink","inMemoryCache","InMemoryCache","client","ApolloClient","connectToDevTools","cache","currentPage","nameValue","undefined","status","gender","characterListSlice","changeCurrentPage","action","payload","changeStatus","changeGender","changeNameValue","selectCharacterListData","characterList","store","configureStore","reducer","layoutReducer","characterListReducer","BackButton","forwardRef","props","ref","history","useHistory","goBack","leftIcon","CacheControlScope","Pagination","info","isLoading","onChange","Boolean","next","prev","_pages","pages","useMediaQuery","isMobile","isTablet","isDesktop","currentPageNumber","Math","round","isPrevButtonDisabled","isNextButtonDisabled","pageNumbers","useMemo","numberOfElementsPerDevice","pagesLeft","arr","reduce","acc","_","index","prevItem","nextItem","fillPaginationArray","Array","fill","isDisabled","isAttached","map","pageNumber","ScrollTopButton","target","current","scrollTo","behavior","defaultOptions","CharacterSmallFragmentDoc","gql","EpisodeFragmentDoc","CharacterLargeFragmentDoc","InfoFragmentDoc","CharacterDocument","CharactersDocument","deNullish","filter","item","CharacterDetailsEpisode","episodes","maxTabs","episodesSliced","slice","my","size","overflowX","id","episode","w","textOverflow","whiteSpace","air_date","Stack","fontSize","color","CharacterBadge","IMAGE_FALLBACK_URL","CharacterDetailsInfo","character","_id","species","type","origin","created","image","creationDate","Date","creationString","getDay","getMonth","getFullYear","spacing","direction","alignItems","textAlign","fallbackSrc","borderRadius","CharacterDetails","data","baseOptions","options","Apollo","useCharacterQuery","variables","useParams","maxW","py","CharacterListItem","objectFit","isTruncated","isFullWidth","CharacterListItems","characters","boxProps","listRef","useRef","floatingButtonDisclosure","useDisclosure","isCharacters","length","columns","maxH","onScroll","e","currentTarget","scrollTop","onOpen","onClose","overflow","isOpen","bottom","right","zIndex","CharacterListMain","useCharactersQuery","page","value","delay","useState","debouncedValue","setDebouncedValue","useEffect","handler","setTimeout","clearTimeout","useDebouncedValue","loading","refetch","results","main","VStack","characterStatuses","characterGenders","CharacterListSidebar","mobileSidebarLeft","aside","transition","placement","mt","CharacterListSidebarContent","event","placeholder","CharacterList","CharacterRoutes","path","exact","App","ApolloProvider","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.da18f99c.chunk.js","sourcesContent":["import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { AppDispatch, RootState } from './store';\n\nexport const useAppDispatch = () => useDispatch();\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\n","export default __webpack_public_path__ + \"static/media/logo.cad16ec0.png\";","import { createSlice } from '@reduxjs/toolkit';\nimport { RootState } from 'store';\n\ninterface LayoutSlice {\n isSidebarOpened: boolean;\n}\n\n// Define the initial state using that type\nconst initialState: LayoutSlice = {\n isSidebarOpened: false,\n};\n\nexport const layoutSlice = createSlice({\n name: 'layout-slice',\n initialState,\n reducers: {\n toggleSidebar: (state) => {\n state.isSidebarOpened = !state.isSidebarOpened;\n },\n },\n});\n\nexport const { toggleSidebar } = layoutSlice.actions;\n\nexport const selectSidebarState = (state: RootState) => state.layout.isSidebarOpened;\n\nexport default layoutSlice.reducer;\n","import { Box, Flex, IconButton, Image, Tooltip } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { FaHamburger } from 'react-icons/fa';\nimport { Link, useLocation } from 'react-router-dom';\nimport { useAppDispatch, useAppSelector } from 'store/hooks';\n\nimport logoSrc from '../../assets/images/logo.png';\nimport { selectSidebarState, toggleSidebar } from './layout-slice';\n\nexport const Layout: FC = ({ children }) => {\n return (\n <>\n \n {children}\n \n );\n};\n\nexport const LayoutTopBar = () => {\n const location = useLocation();\n\n const isCharacterListPage = location.pathname === '/characters';\n const isPageWithSidebar = isCharacterListPage;\n\n return (\n \n {isPageWithSidebar && }\n \n \"Rick\n \n \n );\n};\n\nexport const LayoutTopBarBurger = () => {\n const isSidebarOpened = useAppSelector(selectSidebarState);\n const dispatch = useAppDispatch();\n\n const _toggleSidebar = () => dispatch(toggleSidebar());\n\n return (\n \n }\n display={['flex', 'flex', 'none']}\n colorScheme=\"teal\"\n variant=\"ghost\"\n position=\"absolute\"\n left={['2', '4']}\n top=\"50%\"\n transform=\"translateY(-50%)\"\n />\n \n );\n};\n","import { ApolloClient, InMemoryCache } from '@apollo/client';\n\nimport createApolloLink from './create-apollo-link';\n\nconst link = createApolloLink();\n\nexport const inMemoryCache = new InMemoryCache();\n\nexport const client = new ApolloClient({\n connectToDevTools: true,\n link,\n cache: inMemoryCache,\n});\n","import { ApolloLink, HttpLink } from '@apollo/client';\nimport { onError } from '@apollo/client/link/error';\n\nexport default function createApolloLink(): ApolloLink {\n const errorLink = onError(({ networkError, graphQLErrors, operation }) => {\n if (operation.operationName.includes('NoError')) {\n return;\n }\n\n if (graphQLErrors) {\n graphQLErrors.forEach(() => {\n // showError(graphQLError.message);\n // Sentry.captureMessage(graphQLError.message);\n });\n }\n\n if (networkError) {\n // showError(networkError.message);\n // Sentry.captureException(networkError);\n }\n });\n\n const httpLink = new HttpLink({\n uri: 'https://rickandmortyapi.com/graphql',\n credentials: 'same-origin',\n });\n\n return ApolloLink.from([errorLink, httpLink]);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from 'store';\n\ninterface CharacterListSlice {\n currentPage: number;\n nameValue?: string;\n status?: string;\n gender?: string;\n}\n\n// Define the initial state using that type\nconst initialState: CharacterListSlice = {\n currentPage: 1,\n nameValue: undefined,\n status: undefined,\n gender: undefined,\n};\n\nexport const characterListSlice = createSlice({\n name: 'layout-slice',\n initialState,\n reducers: {\n changeCurrentPage: (state, action: PayloadAction) => {\n state.currentPage = action.payload;\n },\n changeStatus: (state, action: PayloadAction) => {\n state.status = action.payload;\n },\n changeGender: (state, action: PayloadAction) => {\n state.gender = action.payload;\n },\n changeNameValue: (state, action: PayloadAction) => {\n state.nameValue = action.payload;\n },\n },\n});\n\nexport const { changeCurrentPage, changeGender, changeNameValue, changeStatus } = characterListSlice.actions;\n\nexport const selectCharacterListData = (state: RootState) => state.characterList;\n\nexport default characterListSlice.reducer;\n","import { configureStore } from '@reduxjs/toolkit';\nimport layoutReducer from 'components/layout/layout-slice';\nimport characterListReducer from 'pages/character/pages/character-list/character-list-slice';\n\nexport const store = configureStore({\n reducer: {\n layout: layoutReducer,\n characterList: characterListReducer,\n },\n});\n\nexport type RootState = ReturnType;\nexport type AppDispatch = typeof store.dispatch;\n","import { Button, ButtonProps, forwardRef } from '@chakra-ui/react';\nimport { FaChevronLeft } from 'react-icons/fa';\nimport { useHistory } from 'react-router-dom';\n\nexport const BackButton = forwardRef(function BackButton(props, ref) {\n const history = useHistory();\n\n return (\n }\n variant=\"link\"\n colorScheme=\"teal\"\n >\n Back\n \n );\n});\n","import { Button, ButtonGroup, IconButton, useMediaQuery } from '@chakra-ui/react';\nimport { InfoFragment } from 'graphql/generated/graphql';\nimport { useMemo, VFC } from 'react';\nimport {\n HiOutlineChevronDoubleLeft,\n HiOutlineChevronDoubleRight,\n HiOutlineChevronLeft,\n HiOutlineChevronRight,\n} from 'react-icons/hi';\n\nimport { fillPaginationArray } from './pagination.utils';\n\ntype PaginationProps = {\n info: InfoFragment;\n isLoading?: boolean;\n onChange?: (pageNumber: number) => void;\n};\n\nexport const Pagination: VFC = ({ info, isLoading, onChange = Boolean }) => {\n const { next, prev, pages: _pages } = info;\n\n const [isMobile, isTablet, isDesktop] = useMediaQuery([\n '(max-width: 30em)',\n '(min-width: 30em) and (max-width: 48em)',\n '(min-width: 48em)',\n ]);\n\n const pages = _pages ?? 0;\n const currentPageNumber = Math.round(((next ?? pages + 1) + (prev ?? 0)) / 2);\n const isPrevButtonDisabled = currentPageNumber === 1;\n const isNextButtonDisabled = currentPageNumber === pages;\n\n const pageNumbers = useMemo(() => {\n const numberOfElementsPerDevice = isMobile ? 3 : isTablet ? 5 : 9;\n\n const pagesLeft = pages - currentPageNumber + (currentPageNumber === 1 ? 1 : 2);\n const numberOfElements = pagesLeft < numberOfElementsPerDevice ? pagesLeft : numberOfElementsPerDevice;\n\n const emptyArray = new Array(numberOfElements).fill(undefined);\n const result = fillPaginationArray(emptyArray, currentPageNumber, pages ?? 0);\n\n return result;\n }, [isMobile, isTablet, isDesktop, next, currentPageNumber, prev]);\n\n const handleShowFirstPageButtonClick = () => onChange(1);\n const handleShowPrevPageButtonClick = () => onChange(currentPageNumber - 1);\n const handleShowNextPageButtonClick = () => onChange(currentPageNumber + 1);\n const handleShowLastPageButtonClick = () => onChange(pages);\n\n return (\n \n }\n onClick={handleShowFirstPageButtonClick}\n />\n }\n onClick={handleShowPrevPageButtonClick}\n />\n {pageNumbers.map((pageNumber, index) => (\n onChange(pageNumber)}\n colorScheme={currentPageNumber === pageNumber ? 'teal' : 'gray'}\n >\n {pageNumber}\n \n ))}\n }\n onClick={handleShowNextPageButtonClick}\n />\n }\n onClick={handleShowLastPageButtonClick}\n />\n \n );\n};\n","import { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nexport type Maybe = T | null;\nexport type Exact = { [K in keyof T]: T[K] };\nexport type MakeOptional = Omit & { [SubKey in K]?: Maybe };\nexport type MakeMaybe = Omit & { [SubKey in K]: Maybe };\nconst defaultOptions = {};\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n ID: string;\n String: string;\n Boolean: boolean;\n Int: number;\n Float: number;\n /** The `Upload` scalar type represents a file upload. */\n Upload: string;\n};\n\nexport enum CacheControlScope {\n Public = 'PUBLIC',\n Private = 'PRIVATE',\n}\n\nexport type Character = {\n __typename?: 'Character';\n /** The id of the character. */\n id?: Maybe;\n /** The name of the character. */\n name?: Maybe;\n /** The status of the character ('Alive', 'Dead' or 'unknown'). */\n status?: Maybe;\n /** The species of the character. */\n species?: Maybe;\n /** The type or subspecies of the character. */\n type?: Maybe;\n /** The gender of the character ('Female', 'Male', 'Genderless' or 'unknown'). */\n gender?: Maybe;\n /** The character's origin location */\n origin?: Maybe;\n /** The character's last known location */\n location?: Maybe;\n /**\n * Link to the character's image.\n * All images are 300x300px and most are medium shots or portraits since they are intended to be used as avatars.\n */\n image?: Maybe;\n /** Episodes in which this character appeared. */\n episode: Array>;\n /** Time at which the character was created in the database. */\n created?: Maybe;\n};\n\nexport type Characters = {\n __typename?: 'Characters';\n info?: Maybe;\n results?: Maybe>>;\n};\n\nexport type Episode = {\n __typename?: 'Episode';\n /** The id of the episode. */\n id?: Maybe;\n /** The name of the episode. */\n name?: Maybe;\n /** The air date of the episode. */\n air_date?: Maybe;\n /** The code of the episode. */\n episode?: Maybe;\n /** List of characters who have been seen in the episode. */\n characters: Array>;\n /** Time at which the episode was created in the database. */\n created?: Maybe;\n};\n\nexport type Episodes = {\n __typename?: 'Episodes';\n info?: Maybe;\n results?: Maybe>>;\n};\n\nexport type FilterCharacter = {\n name?: Maybe;\n status?: Maybe;\n species?: Maybe;\n type?: Maybe;\n gender?: Maybe;\n};\n\nexport type FilterEpisode = {\n name?: Maybe;\n episode?: Maybe;\n};\n\nexport type FilterLocation = {\n name?: Maybe;\n type?: Maybe;\n dimension?: Maybe;\n};\n\nexport type Info = {\n __typename?: 'Info';\n /** The length of the response. */\n count?: Maybe;\n /** The amount of pages. */\n pages?: Maybe;\n /** Number of the next page (if it exists) */\n next?: Maybe;\n /** Number of the previous page (if it exists) */\n prev?: Maybe;\n};\n\nexport type Location = {\n __typename?: 'Location';\n /** The id of the location. */\n id?: Maybe;\n /** The name of the location. */\n name?: Maybe;\n /** The type of the location. */\n type?: Maybe;\n /** The dimension in which the location is located. */\n dimension?: Maybe;\n /** List of characters who have been last seen in the location. */\n residents: Array>;\n /** Time at which the location was created in the database. */\n created?: Maybe;\n};\n\nexport type Locations = {\n __typename?: 'Locations';\n info?: Maybe;\n results?: Maybe>>;\n};\n\nexport type Query = {\n __typename?: 'Query';\n /** Get a specific character by ID */\n character?: Maybe;\n /** Get the list of all characters */\n characters?: Maybe;\n /** Get a list of characters selected by ids */\n charactersByIds?: Maybe>>;\n /** Get a specific locations by ID */\n location?: Maybe;\n /** Get the list of all locations */\n locations?: Maybe;\n /** Get a list of locations selected by ids */\n locationsByIds?: Maybe>>;\n /** Get a specific episode by ID */\n episode?: Maybe;\n /** Get the list of all episodes */\n episodes?: Maybe;\n /** Get a list of episodes selected by ids */\n episodesByIds?: Maybe>>;\n};\n\nexport type QueryCharacterArgs = {\n id: Scalars['ID'];\n};\n\nexport type QueryCharactersArgs = {\n page?: Maybe;\n filter?: Maybe;\n};\n\nexport type QueryCharactersByIdsArgs = {\n ids: Array;\n};\n\nexport type QueryLocationArgs = {\n id: Scalars['ID'];\n};\n\nexport type QueryLocationsArgs = {\n page?: Maybe;\n filter?: Maybe;\n};\n\nexport type QueryLocationsByIdsArgs = {\n ids: Array;\n};\n\nexport type QueryEpisodeArgs = {\n id: Scalars['ID'];\n};\n\nexport type QueryEpisodesArgs = {\n page?: Maybe;\n filter?: Maybe;\n};\n\nexport type QueryEpisodesByIdsArgs = {\n ids: Array;\n};\n\nexport type CharacterLargeFragment = {\n __typename?: 'Character';\n type?: Maybe;\n gender?: Maybe;\n created?: Maybe;\n id?: Maybe;\n name?: Maybe;\n status?: Maybe;\n species?: Maybe;\n image?: Maybe;\n origin?: Maybe<{\n __typename?: 'Location';\n id?: Maybe;\n name?: Maybe;\n dimension?: Maybe;\n type?: Maybe;\n }>;\n episode: Array<\n Maybe<{\n __typename?: 'Episode';\n id?: Maybe;\n name?: Maybe;\n air_date?: Maybe;\n episode?: Maybe;\n }>\n >;\n};\n\nexport type CharacterSmallFragment = {\n __typename?: 'Character';\n id?: Maybe;\n name?: Maybe;\n status?: Maybe;\n species?: Maybe;\n image?: Maybe;\n};\n\nexport type EpisodeFragment = {\n __typename?: 'Episode';\n id?: Maybe;\n name?: Maybe;\n air_date?: Maybe;\n episode?: Maybe;\n};\n\nexport type InfoFragment = {\n __typename?: 'Info';\n next?: Maybe;\n prev?: Maybe;\n count?: Maybe;\n pages?: Maybe;\n};\n\nexport type CharacterQueryVariables = Exact<{\n id: Scalars['ID'];\n}>;\n\nexport type CharacterQuery = {\n __typename?: 'Query';\n character?: Maybe<{\n __typename?: 'Character';\n type?: Maybe;\n gender?: Maybe;\n created?: Maybe;\n id?: Maybe;\n name?: Maybe;\n status?: Maybe;\n species?: Maybe;\n image?: Maybe;\n origin?: Maybe<{\n __typename?: 'Location';\n id?: Maybe;\n name?: Maybe;\n dimension?: Maybe;\n type?: Maybe;\n }>;\n episode: Array<\n Maybe<{\n __typename?: 'Episode';\n id?: Maybe;\n name?: Maybe;\n air_date?: Maybe;\n episode?: Maybe;\n }>\n >;\n }>;\n};\n\nexport type CharactersQueryVariables = Exact<{\n page?: Maybe;\n name?: Maybe;\n status?: Maybe;\n gender?: Maybe;\n}>;\n\nexport type CharactersQuery = {\n __typename?: 'Query';\n characters?: Maybe<{\n __typename?: 'Characters';\n results?: Maybe<\n Array<\n Maybe<{\n __typename?: 'Character';\n id?: Maybe;\n name?: Maybe;\n status?: Maybe;\n species?: Maybe;\n image?: Maybe;\n }>\n >\n >;\n info?: Maybe<{\n __typename?: 'Info';\n next?: Maybe;\n prev?: Maybe;\n count?: Maybe;\n pages?: Maybe;\n }>;\n }>;\n};\n\nexport const CharacterSmallFragmentDoc = gql`\n fragment characterSmall on Character {\n id\n name\n status\n species\n image\n }\n`;\nexport const EpisodeFragmentDoc = gql`\n fragment episode on Episode {\n id\n name\n air_date\n episode\n }\n`;\nexport const CharacterLargeFragmentDoc = gql`\n fragment characterLarge on Character {\n ...characterSmall\n type\n gender\n origin {\n id\n name\n dimension\n type\n }\n episode {\n ...episode\n }\n created\n }\n ${CharacterSmallFragmentDoc}\n ${EpisodeFragmentDoc}\n`;\nexport const InfoFragmentDoc = gql`\n fragment info on Info {\n next\n prev\n count\n pages\n }\n`;\nexport const CharacterDocument = gql`\n query character($id: ID!) {\n character(id: $id) {\n ...characterLarge\n }\n }\n ${CharacterLargeFragmentDoc}\n`;\n\n/**\n * __useCharacterQuery__\n *\n * To run a query within a React component, call `useCharacterQuery` and pass it any options that fit your needs.\n * When your component renders, `useCharacterQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useCharacterQuery({\n * variables: {\n * id: // value for 'id'\n * },\n * });\n */\nexport function useCharacterQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = { ...defaultOptions, ...baseOptions };\n return Apollo.useQuery(CharacterDocument, options);\n}\nexport function useCharacterLazyQuery(\n baseOptions?: Apollo.LazyQueryHookOptions\n) {\n const options = { ...defaultOptions, ...baseOptions };\n return Apollo.useLazyQuery(CharacterDocument, options);\n}\nexport type CharacterQueryHookResult = ReturnType;\nexport type CharacterLazyQueryHookResult = ReturnType;\nexport type CharacterQueryResult = Apollo.QueryResult;\nexport const CharactersDocument = gql`\n query characters($page: Int, $name: String, $status: String, $gender: String) {\n characters(page: $page, filter: { name: $name, status: $status, gender: $gender }) {\n results {\n ...characterSmall\n }\n info {\n ...info\n }\n }\n }\n ${CharacterSmallFragmentDoc}\n ${InfoFragmentDoc}\n`;\n\n/**\n * __useCharactersQuery__\n *\n * To run a query within a React component, call `useCharactersQuery` and pass it any options that fit your needs.\n * When your component renders, `useCharactersQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useCharactersQuery({\n * variables: {\n * page: // value for 'page'\n * name: // value for 'name'\n * status: // value for 'status'\n * gender: // value for 'gender'\n * },\n * });\n */\nexport function useCharactersQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = { ...defaultOptions, ...baseOptions };\n return Apollo.useQuery(CharactersDocument, options);\n}\nexport function useCharactersLazyQuery(\n baseOptions?: Apollo.LazyQueryHookOptions\n) {\n const options = { ...defaultOptions, ...baseOptions };\n return Apollo.useLazyQuery(CharactersDocument, options);\n}\nexport type CharactersQueryHookResult = ReturnType;\nexport type CharactersLazyQueryHookResult = ReturnType;\nexport type CharactersQueryResult = Apollo.QueryResult;\n","export function fillPaginationArray(arr: number[], currentPage: number, pages: number) {\n return arr.reduce((acc, _, index) => {\n const prevItemIndex = index - 1;\n const prevItem = acc[prevItemIndex];\n const nextItem = prevItem + 1;\n\n if (typeof prevItem === 'undefined') {\n return [...acc, currentPage === 1 ? 1 : currentPage - 1];\n }\n\n if (nextItem > pages) {\n return [...acc, 1];\n }\n\n return [...acc, prevItem + 1];\n }, [] as number[]);\n}\n","import { Button, forwardRef } from '@chakra-ui/react';\nimport { FaArrowUp } from 'react-icons/fa';\n\nexport type ScrollTopButtonProps = {\n target: React.RefObject;\n};\n\nexport const ScrollTopButton = forwardRef((props, ref) => {\n const { children = 'Go top' } = props;\n\n const handleFloatingButtonClick = () => {\n props.target.current?.scrollTo({ top: 0, behavior: 'smooth' });\n };\n\n return (\n \n );\n});\n","/**\n * Removes nullish values (null and undefined) from array\n */\nexport function deNullish(arr: (T | null)[]): T[] {\n return arr.filter((item) => item !== null) as T[];\n}\n","import { Heading, Stack, Tab, TabList, TabPanel, TabPanels, Tabs, Text } from '@chakra-ui/react';\nimport { EpisodeFragment } from 'graphql/generated/graphql';\nimport { useMemo, VFC } from 'react';\n\nexport type CharacterDetailsEpisodeProps = {\n maxTabs?: number;\n episodes?: EpisodeFragment[] | null;\n};\n\nexport const CharacterDetailsEpisode: VFC = ({ episodes, maxTabs = 5 }) => {\n const episodesSliced = useMemo(() => {\n return episodes?.slice(0, maxTabs) ?? [];\n }, [episodes]);\n\n return (\n \n \n Episodes info\n \n\n \n \n {episodesSliced.map(({ id, episode }) => (\n \n Episode: {episode}\n \n ))}\n \n\n \n {episodesSliced.map(({ id, name, air_date, episode }) => (\n \n \n ID: {id}\n \n \n {name}\n \n \n Air date: {air_date}\n \n \n Episode: {episode}\n \n \n ))}\n \n \n \n );\n};\n","import { Badge, BadgeProps, forwardRef } from '@chakra-ui/react';\nimport { useMemo } from 'react';\n\nexport type CharacterBadgeProps = BadgeProps & {\n status: 'Dead' | 'Alive' | 'unknown';\n};\n\nexport const CharacterBadge = forwardRef(function CharacterBadge(\n { status, ...props },\n ref\n) {\n const { colorScheme, label } = useMemo(() => {\n if (status === 'Alive') {\n return {\n label: 'alive',\n colorScheme: 'green',\n };\n } else if (status === 'Dead') {\n return {\n label: 'dead',\n colorScheme: 'red',\n };\n } else {\n return {\n label: 'unknown',\n colorScheme: 'gray',\n };\n }\n }, [status]);\n\n return (\n \n {label}\n \n );\n});\n","export const IMAGE_FALLBACK_URL = 'https://rickandmortyapi.com/api/character/avatar/189.jpeg';\n","import { Heading, Image, Stack, Text } from '@chakra-ui/react';\nimport { CharacterBadge } from 'components/common/character-badge/character-badge';\nimport { IMAGE_FALLBACK_URL } from 'config';\nimport { CharacterLargeFragment } from 'graphql/generated/graphql';\nimport { VFC } from 'react';\n\nexport type CharacterDetailsInfoProps = {\n character?: CharacterLargeFragment | null;\n};\n\nexport const CharacterDetailsInfo: VFC = ({ character }) => {\n const { id: _id, name, status, species, gender, type, origin, created, image } = character || {};\n\n const creationDate = created ? new Date(created) : undefined;\n const creationString =\n creationDate && `${creationDate?.getDay()}/${creationDate.getMonth()}/${creationDate.getFullYear()}`;\n\n return (\n \n \n \n \n ID: {_id}\n \n {name ?? 'Unknown'}\n \n {species && (\n \n Species: {species}\n \n )}\n {gender && (\n \n Gender: {gender}\n \n )}\n\n {type && (\n \n Type: {type}\n \n )}\n {origin?.name && (\n \n Origin: {origin?.name}\n \n )}\n {creationString && (\n \n Created: {creationString}\n \n )}\n \n \n );\n};\n","import { Container } from '@chakra-ui/react';\nimport { BackButton } from 'components/common';\nimport { useCharacterQuery } from 'graphql/generated/graphql';\nimport { useParams } from 'react-router-dom';\nimport { deNullish } from 'utils/array';\n\nimport { CharacterDetailsEpisode } from './character-details-episode';\nimport { CharacterDetailsInfo } from './character-details-info';\n\ntype CharacterDetailsParams = {\n id: string;\n};\n\nconst CharacterDetails = () => {\n const { id } = useParams();\n\n const { data } = useCharacterQuery({\n variables: {\n id,\n },\n });\n\n const episodes = data?.character?.episode ? deNullish(data.character.episode) : undefined;\n\n return (\n \n \n \n \n \n );\n};\n\nexport default CharacterDetails;\n","import { Button, Heading, HStack, Image, Text, VStack } from '@chakra-ui/react';\nimport { CharacterBadge } from 'components/common/character-badge/character-badge';\nimport { IMAGE_FALLBACK_URL } from 'config';\nimport { CharacterSmallFragment } from 'graphql/generated/graphql';\nimport { VFC } from 'react';\nimport { FaRegListAlt } from 'react-icons/fa';\nimport { Link } from 'react-router-dom';\n\nexport type CharacterListItemProps = {\n character: CharacterSmallFragment;\n};\n\nexport const CharacterListItem: VFC = ({ character }) => {\n return (\n \n \n \n {character.name}\n \n \n {character.species}\n {character.status}\n \n }\n colorScheme=\"teal\"\n isFullWidth\n >\n Details\n \n \n );\n};\n","import { Heading, SimpleGrid, SimpleGridProps, Spinner, useDisclosure } from '@chakra-ui/react';\nimport { ScrollTopButton } from 'components/common';\nimport { CharacterSmallFragment } from 'graphql/generated/graphql';\nimport { useRef, VFC } from 'react';\n\nimport { CharacterListItem } from './character-list-item';\n\ntype CharacterListItemsProps = SimpleGridProps & {\n isLoading?: boolean;\n characters?: CharacterSmallFragment[] | null;\n};\n\nconst FLOATING_BUTTON_TRIGGER_HEIGHT = 100;\n\nexport const CharacterListItems: VFC = ({ isLoading, characters, ...boxProps }) => {\n const listRef = useRef(null);\n const floatingButtonDisclosure = useDisclosure();\n const isCharacters = characters?.length && characters.length > 0;\n\n const handleListScroll = (e: React.UIEvent) => {\n if (e.currentTarget.scrollTop > FLOATING_BUTTON_TRIGGER_HEIGHT) {\n floatingButtonDisclosure.onOpen();\n } else {\n floatingButtonDisclosure.onClose();\n }\n };\n\n return (\n \n {isLoading ? (\n \n ) : isCharacters ? (\n <>\n {floatingButtonDisclosure.isOpen && (\n \n )}\n {characters?.map((character) => (\n \n ))}\n \n ) : (\n \n No characters found\n \n )}\n \n );\n};\n","import { chakra, VStack } from '@chakra-ui/react';\nimport { Pagination } from 'components/common';\nimport { useCharactersQuery } from 'graphql/generated/graphql';\nimport { useDebouncedValue } from 'hooks';\nimport { useAppSelector } from 'store/hooks';\nimport { deNullish } from 'utils/array';\n\nimport { CharacterListItems } from './character-list-items';\nimport { selectCharacterListData } from './character-list-slice';\n\nexport const CharacterListMain = () => {\n const { currentPage, nameValue, status, gender } = useAppSelector(selectCharacterListData);\n\n const debouncedNameValue = useDebouncedValue(nameValue, 250);\n\n const { loading, data, refetch } = useCharactersQuery({\n variables: {\n page: currentPage,\n name: debouncedNameValue,\n status,\n gender,\n },\n });\n\n const handlePaginationChange = (pageNumber: number) => refetch({ page: pageNumber });\n\n const characters = data?.characters?.results && deNullish(data?.characters?.results);\n const info = data?.characters?.info;\n\n return (\n \n \n {info && }\n \n );\n};\n","import { useEffect, useState } from 'react';\n\n/**\n * Hook provides `debouncedValue` which will be set after delay when `value` is not changed during this time\n * @param value value to be debounced\n * @param delay time in ms\n * @returns `debouncedValue` that will be set after delay\n */\nexport function useDebouncedValue(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const handler = setTimeout(function setValueForDebounce() {\n setDebouncedValue(value);\n }, delay);\n\n return function cleanup() {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","export const characterStatuses = [\n {\n value: 'Dead',\n label: 'Dead',\n },\n {\n value: 'Alive',\n label: 'Alive',\n },\n {\n value: 'unknown',\n label: 'Unknown?',\n },\n];\n\nexport const characterGenders = [\n {\n value: 'Male',\n label: 'Male',\n },\n {\n value: 'Female',\n label: 'Female',\n },\n {\n value: 'unknown',\n label: 'Unknown?',\n },\n];\n","import {\n chakra,\n Drawer,\n DrawerBody,\n DrawerCloseButton,\n DrawerContent,\n DrawerHeader,\n DrawerOverlay,\n FormControl,\n FormLabel,\n Input,\n InputGroup,\n InputLeftElement,\n Select,\n useMediaQuery,\n VStack,\n} from '@chakra-ui/react';\nimport { selectSidebarState, toggleSidebar } from 'components/layout/layout-slice';\nimport { FaSearch } from 'react-icons/fa';\nimport { useAppDispatch, useAppSelector } from 'store/hooks';\n\nimport { characterGenders, characterStatuses } from './character-list-const';\nimport { changeGender, changeNameValue, changeStatus, selectCharacterListData } from './character-list-slice';\n\nexport const CharacterListSidebar = () => {\n const isSidebarOpened = useAppSelector(selectSidebarState);\n const dispatch = useAppDispatch();\n const [isDesktopOrLarger] = useMediaQuery('(min-width: 48em)');\n\n const _toggleSidebar = () => dispatch(toggleSidebar());\n\n const mobileSidebarLeft = isSidebarOpened ? '0' : '-80';\n\n if (isDesktopOrLarger) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n \n \n Find your character\n\n \n \n \n \n \n );\n};\n\nconst CharacterListSidebarContent = () => {\n const { nameValue, status, gender } = useAppSelector(selectCharacterListData);\n const dispatch = useAppDispatch();\n\n const handleNameValueChange = (event: React.ChangeEvent) =>\n dispatch(changeNameValue(event.target.value));\n\n const handleStatusChange = (event: React.ChangeEvent) =>\n dispatch(changeStatus(event.target.value));\n\n const handleGenderChange = (event: React.ChangeEvent) =>\n dispatch(changeGender(event.target.value));\n\n return (\n <>\n \n Name\n \n \n \n \n \n \n \n\n \n Status\n \n \n\n \n Gender\n \n \n \n );\n};\n","import { Flex } from '@chakra-ui/react';\n\nimport { CharacterListMain } from './character-list-main';\nimport { CharacterListSidebar } from './character-list-sidebar';\n\nconst CharacterList = () => {\n return (\n \n \n \n \n );\n};\n\nexport default CharacterList;\n","import { Redirect, Route, Switch } from 'react-router-dom';\n\nimport CharacterDetails from './pages/character-details/character-details';\nimport CharacterList from './pages/character-list/character-list';\n\nconst CharacterRoutes = () => {\n return (\n \n \n \n \n\n \n \n \n\n \n \n );\n};\n\nexport default CharacterRoutes;\n","import { ApolloProvider } from '@apollo/client';\nimport { ChakraProvider } from '@chakra-ui/react';\nimport { Layout } from 'components/layout';\nimport { client } from 'integrations/apollo-client';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { HashRouter as Router } from 'react-router-dom';\nimport { store } from 'store';\n\nimport CharacterRoutes from './pages/character/character';\n\nfunction App() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default App;\n","const reportWebVitals = (onPerfEntry?: (...values: unknown[]) => unknown): void => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n void 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';\n\nimport App from './app';\nimport reportWebVitals from './report-web-vitals';\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":""}