matthew
2 years ago
48 changed files with 700 additions and 599 deletions
Binary file not shown.
@ -0,0 +1,33 @@ |
|||||||
|
import { |
||||||
|
ServerSidePropsContext, |
||||||
|
ContextParamsServer, |
||||||
|
} from "app/core/contextProviders/serverSidePropsProvider" |
||||||
|
import { ReactNode, useState } from "react" |
||||||
|
import jsCookies from "js-cookie" |
||||||
|
|
||||||
|
interface Props { |
||||||
|
children: ReactNode |
||||||
|
contextParamsServer: ContextParamsServer |
||||||
|
} |
||||||
|
|
||||||
|
type Theme = "light" | "dark" |
||||||
|
const THEME_COOKIE_NAME = "theme" |
||||||
|
|
||||||
|
const ContextProviders = ({ children, contextParamsServer: { cookies } }: Props) => { |
||||||
|
const [theme, setThemeState] = useState<Theme>((cookies[THEME_COOKIE_NAME] as Theme) || 'dark') |
||||||
|
const setTheme = (theme: Theme) => { |
||||||
|
jsCookies.set(THEME_COOKIE_NAME, theme) |
||||||
|
setThemeState(theme) |
||||||
|
} |
||||||
|
|
||||||
|
const context = { |
||||||
|
theme, |
||||||
|
setTheme, |
||||||
|
} |
||||||
|
|
||||||
|
return ( |
||||||
|
<ServerSidePropsContext.Provider value={context}>{children}</ServerSidePropsContext.Provider> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
export default ContextProviders |
@ -0,0 +1 @@ |
|||||||
|
export {default} from './ContextProviders' |
@ -0,0 +1,38 @@ |
|||||||
|
import { cn } from "app/core/helpers/common" |
||||||
|
import { ReactNode } from "react" |
||||||
|
import { AnimatePresence, HTMLMotionProps, motion } from "framer-motion" |
||||||
|
import s from "./styles.module.css" |
||||||
|
|
||||||
|
import NextLink from "next/link" |
||||||
|
import { Routes } from "@blitzjs/next" |
||||||
|
|
||||||
|
interface Props { |
||||||
|
children: ReactNode |
||||||
|
theme: "primary" | "clear" |
||||||
|
className?: string |
||||||
|
onClick?: () => void |
||||||
|
href: string | ReturnType<typeof Routes.Home> |
||||||
|
wide?: boolean |
||||||
|
} |
||||||
|
|
||||||
|
const Link = ({ |
||||||
|
children, |
||||||
|
theme, |
||||||
|
className, |
||||||
|
onClick, |
||||||
|
href, |
||||||
|
wide, |
||||||
|
...linkProps |
||||||
|
}: Props & React.ComponentProps<typeof NextLink>) => { |
||||||
|
return ( |
||||||
|
<div className={cn(s.root, className, `theme-${theme}`)}> |
||||||
|
<NextLink target="_blank" href={href} > |
||||||
|
<a {...linkProps} onClick={onClick} className={cn({ [s.wide]: wide })}> |
||||||
|
{children} |
||||||
|
</a> |
||||||
|
</NextLink> |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
export default Link |
@ -0,0 +1 @@ |
|||||||
|
export { default } from "./Link" |
@ -0,0 +1,40 @@ |
|||||||
|
.root { |
||||||
|
text-decoration: none; |
||||||
|
display: inline-block; |
||||||
|
|
||||||
|
/* size */ |
||||||
|
font-size: 18px; |
||||||
|
font-weight: 500px; |
||||||
|
} |
||||||
|
.root a { |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
.root a.wide::before { |
||||||
|
content: ""; |
||||||
|
position: absolute; |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.root:active { |
||||||
|
transform: scale(0.95); |
||||||
|
} |
||||||
|
|
||||||
|
.root:global(.theme-primary) a { |
||||||
|
color: var(--button_primary); |
||||||
|
} |
||||||
|
|
||||||
|
.root:global(.theme-primary) a:hover { |
||||||
|
color: var(--button_primary_hover); |
||||||
|
} |
||||||
|
|
||||||
|
.root:global(.theme-primary) a:active { |
||||||
|
color: var(--button_primary_pressed); |
||||||
|
} |
||||||
|
|
||||||
|
.root:global(.theme-clear) a { |
||||||
|
color: inherit; |
||||||
|
} |
@ -1,311 +1,31 @@ |
|||||||
.wrapper { |
.root{ |
||||||
/* position: absolute; |
flex: 1; |
||||||
top: 50%; |
display: flex; |
||||||
left: 50%; |
justify-content: flex-end; |
||||||
transform: translate(-50%, -50%); */ |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox { |
|
||||||
opacity: 0; |
|
||||||
height: 0; |
|
||||||
width: 0; |
|
||||||
} |
|
||||||
|
|
||||||
.toggle { |
|
||||||
position: relative; |
|
||||||
cursor: pointer; |
|
||||||
display: inline-block; |
|
||||||
width: 200px; |
|
||||||
height: 100px; |
|
||||||
background: #211042; |
|
||||||
border-radius: 50px; |
|
||||||
transition: 500ms; |
|
||||||
overflow: hidden; |
|
||||||
} |
|
||||||
|
|
||||||
.toggleButton { |
|
||||||
position: absolute; |
|
||||||
display: inline-block; |
|
||||||
top: 7px; |
|
||||||
left: 6px; |
|
||||||
width: 86px; |
|
||||||
height: 86px; |
|
||||||
border-radius: 50%; |
|
||||||
background: #faeaf1; |
|
||||||
overflow: hidden; |
|
||||||
box-shadow: 0 0 35px 4px rgba(255, 255, 255); |
|
||||||
transition: all 500ms ease-out; |
|
||||||
} |
|
||||||
|
|
||||||
.crater { |
|
||||||
position: absolute; |
|
||||||
display: inline-block; |
|
||||||
background: #faeaf1; |
|
||||||
border-radius: 50%; |
|
||||||
transition: 500ms; |
|
||||||
} |
|
||||||
|
|
||||||
.crater1 { |
|
||||||
background: #fffff9; |
|
||||||
width: 86px; |
|
||||||
height: 86px; |
|
||||||
left: 10px; |
|
||||||
bottom: 10px; |
|
||||||
} |
|
||||||
|
|
||||||
.crater2 { |
|
||||||
width: 20px; |
|
||||||
height: 20px; |
|
||||||
top: -7px; |
|
||||||
left: 44px; |
|
||||||
} |
|
||||||
|
|
||||||
.crater3 { |
|
||||||
width: 16px; |
|
||||||
height: 16px; |
|
||||||
top: 20px; |
|
||||||
right: -4px; |
|
||||||
} |
|
||||||
|
|
||||||
.crater4 { |
|
||||||
width: 10px; |
|
||||||
height: 10px; |
|
||||||
top: 24px; |
|
||||||
left: 30px; |
|
||||||
} |
|
||||||
|
|
||||||
.crater5 { |
|
||||||
width: 15px; |
|
||||||
height: 15px; |
|
||||||
top: 40px; |
|
||||||
left: 48px; |
|
||||||
} |
|
||||||
|
|
||||||
.crater6 { |
|
||||||
width: 10px; |
|
||||||
height: 10px; |
|
||||||
top: 48px; |
|
||||||
left: 20px; |
|
||||||
} |
|
||||||
|
|
||||||
.crater7 { |
|
||||||
width: 12px; |
|
||||||
height: 12px; |
|
||||||
bottom: 5px; |
|
||||||
left: 35px; |
|
||||||
} |
|
||||||
|
|
||||||
.star { |
|
||||||
position: absolute; |
|
||||||
display: inline-block; |
|
||||||
border-radius: 50%; |
|
||||||
background: #fff; |
|
||||||
box-shadow: 1px 0 2px 2px rgba(255, 255, 255); |
|
||||||
} |
|
||||||
|
|
||||||
.star1 { |
|
||||||
width: 6px; |
|
||||||
height: 6px; |
|
||||||
right: 90px; |
|
||||||
bottom: 40px; |
|
||||||
} |
|
||||||
|
|
||||||
.star2 { |
|
||||||
width: 8px; |
|
||||||
height: 8px; |
|
||||||
right: 70px; |
|
||||||
top: 10px; |
|
||||||
} |
|
||||||
|
|
||||||
.star3 { |
|
||||||
width: 5px; |
|
||||||
height: 5px; |
|
||||||
right: 60px; |
|
||||||
bottom: 15px; |
|
||||||
} |
|
||||||
|
|
||||||
.star4 { |
|
||||||
width: 3px; |
|
||||||
height: 3px; |
|
||||||
right: 40px; |
|
||||||
bottom: 50px; |
|
||||||
} |
|
||||||
|
|
||||||
.star5 { |
|
||||||
width: 4px; |
|
||||||
height: 4px; |
|
||||||
right: 10px; |
|
||||||
bottom: 35px; |
|
||||||
} |
|
||||||
|
|
||||||
.star6, |
|
||||||
.star7, |
|
||||||
.star8 { |
|
||||||
width: 10px; |
|
||||||
height: 2px; |
|
||||||
border-radius: 2px; |
|
||||||
transform: rotate(-45deg); |
|
||||||
box-shadow: 5px 0px 4px 1px #fff; |
|
||||||
animation-name: travel; |
|
||||||
animation-duration: 1.5s; |
|
||||||
animation-timing-function: ease-out; |
|
||||||
animation-iteration-count: infinite; |
|
||||||
} |
|
||||||
|
|
||||||
.star6 { |
|
||||||
right: 30px; |
|
||||||
bottom: 30px; |
|
||||||
animation-delay: -2s; |
|
||||||
} |
|
||||||
|
|
||||||
.star7 { |
|
||||||
right: 50px; |
|
||||||
bottom: 60px; |
|
||||||
} |
|
||||||
|
|
||||||
.star8 { |
|
||||||
right: 90px; |
|
||||||
top: 10px; |
|
||||||
animation-delay: -4s; |
|
||||||
} |
|
||||||
|
|
||||||
@keyframes travel { |
|
||||||
0% { |
|
||||||
transform: rotate(-45deg) translateX(70px); |
|
||||||
} |
|
||||||
|
|
||||||
50% { |
|
||||||
transform: rotate(-45deg) translateX(-20px); |
|
||||||
box-shadow: 5px 0px 6px 1px #fff; |
|
||||||
} |
|
||||||
|
|
||||||
100% { |
|
||||||
transform: rotate(-45deg) translateX(-30px); |
|
||||||
width: 2px; |
|
||||||
height: 2px; |
|
||||||
opacity: 0; |
|
||||||
box-shadow: none; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle { |
|
||||||
background: #24d7f7; |
|
||||||
} |
} |
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .toggleButton { |
.wrapper{ |
||||||
background: #f7ffff; |
width: 35px; |
||||||
transform: translateX(102px); |
background: var(--background_secondary); |
||||||
box-shadow: 0 0 35px 5px rgba(255, 255, 255); |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .toggleButton .crater { |
|
||||||
transform: rotate(-45deg) translateX(70px); |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star { |
|
||||||
animation: move 2s infinite; |
|
||||||
transform: none; |
|
||||||
box-shadow: none; |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star1 { |
|
||||||
width: 40px; |
|
||||||
height: 10px; |
|
||||||
border-radius: 10px; |
border-radius: 10px; |
||||||
background: #fff; |
height: 20px; |
||||||
left: 20px; |
display: flex; |
||||||
top: 25px; |
align-items: center; |
||||||
box-shadow: none; |
padding: 2px; |
||||||
} |
cursor: pointer; |
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star2 { |
|
||||||
width: 12px; |
|
||||||
height: 12px; |
|
||||||
background: #fff; |
|
||||||
left: 26px; |
|
||||||
top: 23px; |
|
||||||
box-shadow: -1px 0 2px 0 rgba(0, 0, 0, 0.1); |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star3 { |
|
||||||
width: 16px; |
|
||||||
height: 16px; |
|
||||||
background: #fff; |
|
||||||
left: 35px; |
|
||||||
top: 19px; |
|
||||||
box-shadow: -1px 0 2px 0 rgba(0, 0, 0, 0.1); |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star4 { |
|
||||||
width: 14px; |
|
||||||
height: 14px; |
|
||||||
background: #fff; |
|
||||||
left: 46px; |
|
||||||
top: 21px; |
|
||||||
box-shadow: -1px 0 2px 0 rgba(0, 0, 0, 0.1); |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star5 { |
|
||||||
width: 60px; |
|
||||||
height: 15px; |
|
||||||
border-radius: 15px; |
|
||||||
background: #fff; |
|
||||||
left: 30px; |
|
||||||
bottom: 20px; |
|
||||||
box-shadow: none; |
|
||||||
} |
} |
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star6 { |
.content{ |
||||||
width: 18px; |
width: 18px; |
||||||
height: 18px; |
height: 18px; |
||||||
background: #fff; |
|
||||||
border-radius: 50%; |
|
||||||
left: 38px; |
|
||||||
bottom: 20px; |
|
||||||
box-shadow: -1px 0 2px 0 rgba(0, 0, 0, 0.1); |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star7 { |
|
||||||
width: 24px; |
|
||||||
height: 24px; |
|
||||||
background: #fff; |
|
||||||
border-radius: 50%; |
|
||||||
left: 52px; |
|
||||||
bottom: 20px; |
|
||||||
box-shadow: -1px 0 2px 0 rgba(0, 0, 0, 0.1); |
|
||||||
} |
|
||||||
|
|
||||||
.hideCheckbox:checked + .toggle .star8 { |
|
||||||
width: 21px; |
|
||||||
height: 21px; |
|
||||||
background: #fff; |
|
||||||
border-radius: 50%; |
border-radius: 50%; |
||||||
left: 70px; |
background: var(--background_main); |
||||||
top: 59px; |
font-size: 15px; |
||||||
box-shadow: -1px 0 2px 0 rgba(0, 0, 0, 0.1); |
|
||||||
} |
|
||||||
|
|
||||||
@keyframes move { |
|
||||||
0% { |
|
||||||
transform: none; |
|
||||||
} |
|
||||||
|
|
||||||
25% { |
|
||||||
transform: translateX(2px); |
|
||||||
} |
|
||||||
|
|
||||||
100% { |
|
||||||
transform: translateX(-2px); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/* p { |
|
||||||
text-align: center; |
text-align: center; |
||||||
letter-spacing: 15px; |
transition: transform .1s linear; |
||||||
background: #34495e; |
pointer-events: none; |
||||||
color: #fff; |
|
||||||
} |
} |
||||||
|
|
||||||
p.morning { |
.content.light { |
||||||
background: #e67e22; |
transform: translateX(16px); |
||||||
} */ |
} |
@ -1,3 +1,5 @@ |
|||||||
export const count = (event:string) => { |
export const count = (event:string) => { |
||||||
yaCounter90644479.reachGoal(event) |
yaCounter90644479.reachGoal(event) |
||||||
|
gtag('event', event); |
||||||
|
console.log(event) |
||||||
} |
} |
@ -1,14 +1,9 @@ |
|||||||
import { useContext } from "react" |
import { useContext } from "react" |
||||||
import { ServerSidePropsContext } from "../contextProviders/serverSidePropsProvider" |
import { ServerSidePropsContext } from "../contextProviders/serverSidePropsProvider" |
||||||
import jsCookies from "js-cookie" |
|
||||||
|
|
||||||
const COOKIE_NAME = "theme" |
|
||||||
|
|
||||||
export const useCurrentTheme = () => { |
export const useCurrentTheme = () => { |
||||||
const { cookies } = useContext(ServerSidePropsContext) |
const { theme, setTheme } = useContext(ServerSidePropsContext) |
||||||
if (cookies) { |
return { theme, setTheme } |
||||||
return jsCookies.get(COOKIE_NAME) || cookies[COOKIE_NAME] || "light" |
|
||||||
} else { |
|
||||||
return "light" |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,51 @@ |
|||||||
|
import { Routes } from "@blitzjs/next" |
||||||
|
import { NftDomain } from "@prisma/client" |
||||||
|
import Button from "app/auth/components/Button" |
||||||
|
import Link from "app/core/components/Link" |
||||||
|
import { getDomainFromUrl } from "app/core/helpers/common" |
||||||
|
import { count } from "app/core/helpers/metrika" |
||||||
|
import { motion } from "framer-motion" |
||||||
|
import s from "./styles.module.css" |
||||||
|
|
||||||
|
interface Props { |
||||||
|
lastWeekNewSites: NftDomain[] |
||||||
|
} |
||||||
|
|
||||||
|
const LastSitesWidget = (props: Props) => { |
||||||
|
|
||||||
|
return ( |
||||||
|
<div className={s.root}> |
||||||
|
<div className={s.heading}> |
||||||
|
New sites{" "} |
||||||
|
<Link onClick={()=>count('from_main_new_sites_widget_to_state_page')} className={s.link} theme="primary" href={Routes.StatePage()}> |
||||||
|
See all |
||||||
|
</Link> |
||||||
|
</div> |
||||||
|
<div className={s.sitesWrapperShadows}> |
||||||
|
<div className={s.sitesWrapper}> |
||||||
|
{props.lastWeekNewSites.map((i) => ( |
||||||
|
<div className={s.sitesItem}> |
||||||
|
<Link |
||||||
|
className={s.siteAddress} |
||||||
|
target="_blank" |
||||||
|
theme="clear" |
||||||
|
href={i.address + "?from=Searching.ton"} |
||||||
|
onClick={()=>count('from_main_new_sites_widget_to_site')} |
||||||
|
> |
||||||
|
{getDomainFromUrl(i.address)} |
||||||
|
<Button onClick={console.log} className={s.siteButton} theme="primary"> |
||||||
|
.ton |
||||||
|
</Button> |
||||||
|
</Link> |
||||||
|
</div> |
||||||
|
))} |
||||||
|
</div> |
||||||
|
<Button onClick={console.log} className={s.button} theme="primary"> |
||||||
|
.ton |
||||||
|
</Button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
export default LastSitesWidget |
@ -0,0 +1 @@ |
|||||||
|
export {default} from './LastSitesWidget'; |
@ -0,0 +1,170 @@ |
|||||||
|
.root { |
||||||
|
margin-top: 100px; |
||||||
|
|
||||||
|
overflow: hidden; |
||||||
|
position: relative; |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.link{ |
||||||
|
margin-left: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.heading { |
||||||
|
margin-bottom: 25px; |
||||||
|
font-size: 16px; |
||||||
|
line-height: 20px; |
||||||
|
|
||||||
|
color: var(--text_secondary) |
||||||
|
} |
||||||
|
|
||||||
|
.sitesWrapperShadows { |
||||||
|
position: relative; |
||||||
|
display: flex; |
||||||
|
overflow: hidden; |
||||||
|
justify-content: end; |
||||||
|
} |
||||||
|
.sitesWrapper { |
||||||
|
|
||||||
|
height: 140px; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
transition: transform 1s ease-in-out; |
||||||
|
animation: animateLastSites 40s ease-in-out 2s infinite alternate; |
||||||
|
} |
||||||
|
|
||||||
|
.sitesWrapperShadows:before { |
||||||
|
content: ""; |
||||||
|
height: 83px; |
||||||
|
width: 100%; |
||||||
|
position: absolute; |
||||||
|
bottom: 0; |
||||||
|
background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, var(--background_main) 89%); |
||||||
|
z-index: 1; |
||||||
|
pointer-events: none; |
||||||
|
} |
||||||
|
|
||||||
|
.sitesWrapper { |
||||||
|
} |
||||||
|
|
||||||
|
.siteButton, |
||||||
|
.button { |
||||||
|
width: 52px; |
||||||
|
height: 41px; |
||||||
|
font-size: 20px; |
||||||
|
line-height: 25px; |
||||||
|
border-radius: 16px; |
||||||
|
transition: opacity 0.2s ease-in-out; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.button { |
||||||
|
position: absolute; |
||||||
|
top: 2px; |
||||||
|
|
||||||
|
background-color: var(--background_secondary) !important; |
||||||
|
} |
||||||
|
|
||||||
|
.sitesWrapperShadows:hover .button { |
||||||
|
opacity: 0; |
||||||
|
pointer-events: none; |
||||||
|
} |
||||||
|
|
||||||
|
.sitesItem { |
||||||
|
height: 25px; |
||||||
|
position: relative; |
||||||
|
padding: 10px 0; |
||||||
|
cursor: pointer; |
||||||
|
display: flex; |
||||||
|
justify-content: right; |
||||||
|
align-items: center; |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.sitesItem:hover { |
||||||
|
z-index: 3; |
||||||
|
} |
||||||
|
|
||||||
|
.siteButton { |
||||||
|
top: 0; |
||||||
|
right: -62px; |
||||||
|
opacity: 0; |
||||||
|
pointer-events: none; |
||||||
|
margin-left: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
.sitesItem:hover .siteButton { |
||||||
|
opacity: 1; |
||||||
|
pointer-events: all; |
||||||
|
} |
||||||
|
|
||||||
|
.siteAddress { |
||||||
|
text-align: right; |
||||||
|
|
||||||
|
font-size: 16px; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@keyframes animateLastSites { |
||||||
|
0% { |
||||||
|
transform: translateY(0); |
||||||
|
} |
||||||
|
5% { |
||||||
|
transform: translateY(0); |
||||||
|
} |
||||||
|
10% { |
||||||
|
transform: translateY(-45px); |
||||||
|
} |
||||||
|
15% { |
||||||
|
transform: translateY(-45px); |
||||||
|
} |
||||||
|
20% { |
||||||
|
transform: translateY(-90px); |
||||||
|
} |
||||||
|
25% { |
||||||
|
transform: translateY(-90px); |
||||||
|
} |
||||||
|
30% { |
||||||
|
transform: translateY(-135px); |
||||||
|
} |
||||||
|
35% { |
||||||
|
transform: translateY(-135px); |
||||||
|
} |
||||||
|
40% { |
||||||
|
transform: translateY(-180px); |
||||||
|
} |
||||||
|
45% { |
||||||
|
transform: translateY(-180px); |
||||||
|
} |
||||||
|
50% { |
||||||
|
transform: translateY(-225px); |
||||||
|
} |
||||||
|
55% { |
||||||
|
transform: translateY(-225px); |
||||||
|
} |
||||||
|
60% { |
||||||
|
transform: translateY(-270px); |
||||||
|
} |
||||||
|
65% { |
||||||
|
transform: translateY(-270px); |
||||||
|
} |
||||||
|
70% { |
||||||
|
transform: translateY(-315px); |
||||||
|
} |
||||||
|
75% { |
||||||
|
transform: translateY(-315px); |
||||||
|
} |
||||||
|
80% { |
||||||
|
transform: translateY(-360px); |
||||||
|
} |
||||||
|
85% { |
||||||
|
transform: translateY(-360px); |
||||||
|
} |
||||||
|
90% { |
||||||
|
transform: translateY(-405px); |
||||||
|
} |
||||||
|
100% { |
||||||
|
transform: translateY(-405px); |
||||||
|
} |
||||||
|
} |
@ -1,9 +1,5 @@ |
|||||||
.root { |
.root { |
||||||
/* display: flex; */ |
|
||||||
/* flex-direction: column; |
|
||||||
justify-content: center; */ |
|
||||||
/* align-items: center; */ |
|
||||||
/* height: 100%; */ |
|
||||||
width: 100%; |
width: 100%; |
||||||
max-width: 604px; |
max-width: 600px; |
||||||
|
margin: 0 auto; |
||||||
} |
} |
||||||
|
@ -0,0 +1,16 @@ |
|||||||
|
import { subDays } from "date-fns" |
||||||
|
import db from "db" |
||||||
|
|
||||||
|
export default async function getLastWeekNewSites() { |
||||||
|
const weekAgo = subDays(new Date(), 7) |
||||||
|
|
||||||
|
const lastWeekNewSites = await db.nftDomain.findMany({ |
||||||
|
orderBy: { firstAvailableDate: "desc" }, |
||||||
|
take: 10, |
||||||
|
where: { available: true, AND: { firstAvailableDate: { gt: weekAgo } } }, |
||||||
|
}) |
||||||
|
console.log(lastWeekNewSites) |
||||||
|
return { |
||||||
|
lastWeekNewSites, |
||||||
|
} |
||||||
|
} |
@ -1,46 +0,0 @@ |
|||||||
import Layout from "app/core/layouts/Layout" |
|
||||||
import { LabeledTextField } from "app/core/components/LabeledTextField" |
|
||||||
import { Form, FORM_ERROR } from "app/core/components/Form" |
|
||||||
import { ForgotPassword } from "app/auth/validations" |
|
||||||
import forgotPassword from "app/auth/mutations/forgotPassword" |
|
||||||
import { useMutation } from "@blitzjs/rpc" |
|
||||||
import { BlitzPage } from "@blitzjs/next" |
|
||||||
|
|
||||||
const ForgotPasswordPage: BlitzPage = () => { |
|
||||||
const [forgotPasswordMutation, { isSuccess }] = useMutation(forgotPassword) |
|
||||||
|
|
||||||
return ( |
|
||||||
<Layout title="Forgot Your Password?"> |
|
||||||
<h1>Forgot your password?</h1> |
|
||||||
|
|
||||||
{isSuccess ? ( |
|
||||||
<div> |
|
||||||
<h2>Request Submitted</h2> |
|
||||||
<p> |
|
||||||
If your email is in our system, you will receive instructions to reset your password |
|
||||||
shortly. |
|
||||||
</p> |
|
||||||
</div> |
|
||||||
) : ( |
|
||||||
<Form |
|
||||||
submitText="Send Reset Password Instructions" |
|
||||||
schema={ForgotPassword} |
|
||||||
initialValues={{ email: "" }} |
|
||||||
onSubmit={async (values) => { |
|
||||||
try { |
|
||||||
await forgotPasswordMutation(values) |
|
||||||
} catch (error: any) { |
|
||||||
return { |
|
||||||
[FORM_ERROR]: "Sorry, we had an unexpected error. Please try again.", |
|
||||||
} |
|
||||||
} |
|
||||||
}} |
|
||||||
> |
|
||||||
<LabeledTextField name="email" label="Email" placeholder="Email" /> |
|
||||||
</Form> |
|
||||||
)} |
|
||||||
</Layout> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
export default ForgotPasswordPage |
|
@ -1,21 +0,0 @@ |
|||||||
import { BlitzPage } from "@blitzjs/next" |
|
||||||
import Layout from "app/core/layouts/Layout" |
|
||||||
import { LoginForm } from "app/auth/components/LoginForm" |
|
||||||
import { useRouter } from "next/router" |
|
||||||
|
|
||||||
const LoginPage: BlitzPage = () => { |
|
||||||
const router = useRouter() |
|
||||||
|
|
||||||
return ( |
|
||||||
<Layout title="Log In"> |
|
||||||
<LoginForm |
|
||||||
onSuccess={(_user) => { |
|
||||||
const next = router.query.next ? decodeURIComponent(router.query.next as string) : "/" |
|
||||||
return router.push(next) |
|
||||||
}} |
|
||||||
/> |
|
||||||
</Layout> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
export default LoginPage |
|
@ -1,66 +0,0 @@ |
|||||||
import Layout from "app/core/layouts/Layout" |
|
||||||
import { LabeledTextField } from "app/core/components/LabeledTextField" |
|
||||||
import { Form, FORM_ERROR } from "app/core/components/Form" |
|
||||||
import { ResetPassword } from "app/auth/validations" |
|
||||||
import resetPassword from "app/auth/mutations/resetPassword" |
|
||||||
import { BlitzPage, Routes } from "@blitzjs/next" |
|
||||||
import { useRouter } from "next/router" |
|
||||||
import { useMutation } from "@blitzjs/rpc" |
|
||||||
import Link from "next/link" |
|
||||||
|
|
||||||
const ResetPasswordPage: BlitzPage = () => { |
|
||||||
const router = useRouter() |
|
||||||
const [resetPasswordMutation, { isSuccess }] = useMutation(resetPassword) |
|
||||||
|
|
||||||
return ( |
|
||||||
<div> |
|
||||||
<h1>Set a New Password</h1> |
|
||||||
|
|
||||||
{isSuccess ? ( |
|
||||||
<div> |
|
||||||
<h2>Password Reset Successfully</h2> |
|
||||||
<p> |
|
||||||
Go to the <Link href={Routes.Home()}>homepage</Link> |
|
||||||
</p> |
|
||||||
</div> |
|
||||||
) : ( |
|
||||||
<Form |
|
||||||
submitText="Reset Password" |
|
||||||
schema={ResetPassword} |
|
||||||
initialValues={{ |
|
||||||
password: "", |
|
||||||
passwordConfirmation: "", |
|
||||||
token: router.query.token as string, |
|
||||||
}} |
|
||||||
onSubmit={async (values) => { |
|
||||||
try { |
|
||||||
await resetPasswordMutation(values) |
|
||||||
} catch (error: any) { |
|
||||||
if (error.name === "ResetPasswordError") { |
|
||||||
return { |
|
||||||
[FORM_ERROR]: error.message, |
|
||||||
} |
|
||||||
} else { |
|
||||||
return { |
|
||||||
[FORM_ERROR]: "Sorry, we had an unexpected error. Please try again.", |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
}} |
|
||||||
> |
|
||||||
<LabeledTextField name="password" label="New Password" type="password" /> |
|
||||||
<LabeledTextField |
|
||||||
name="passwordConfirmation" |
|
||||||
label="Confirm New Password" |
|
||||||
type="password" |
|
||||||
/> |
|
||||||
</Form> |
|
||||||
)} |
|
||||||
</div> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
ResetPasswordPage.redirectAuthenticatedTo = "/" |
|
||||||
ResetPasswordPage.getLayout = (page) => <Layout title="Reset Your Password">{page}</Layout> |
|
||||||
|
|
||||||
export default ResetPasswordPage |
|
@ -1,16 +0,0 @@ |
|||||||
import { useRouter } from "next/router" |
|
||||||
import Layout from "app/core/layouts/Layout" |
|
||||||
import { SignupForm } from "app/auth/components/SignupForm" |
|
||||||
import { BlitzPage, Routes } from "@blitzjs/next" |
|
||||||
|
|
||||||
const SignupPage: BlitzPage = () => { |
|
||||||
const router = useRouter() |
|
||||||
|
|
||||||
return ( |
|
||||||
<Layout title="Sign Up"> |
|
||||||
<SignupForm onSuccess={() => router.push(Routes.Home())} /> |
|
||||||
</Layout> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
export default SignupPage |
|
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 33 KiB |
Loading…
Reference in new issue