From 4c8b70a22860cd360a219b025656feb5b215e18c Mon Sep 17 00:00:00 2001 From: andthezhang Date: Sun, 17 Mar 2024 15:36:29 -0700 Subject: [PATCH] Resend --- .env | 3 +- bun.lockb | Bin 258411 -> 268320 bytes kirimase.config.json | 3 +- package.json | 1 + src/app/(app)/resend/page.tsx | 124 +++++++++++++++++++++++++++ src/app/api/email/route.ts | 22 +++++ src/components/emails/FirstEmail.tsx | 27 ++++++ src/lib/email/index.ts | 4 + src/lib/email/utils.ts | 6 ++ src/lib/env.mjs | 5 +- 10 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 src/app/(app)/resend/page.tsx create mode 100644 src/app/api/email/route.ts create mode 100644 src/components/emails/FirstEmail.tsx create mode 100644 src/lib/email/index.ts create mode 100644 src/lib/email/utils.ts diff --git a/.env b/.env index f734baa..7d05487 100644 --- a/.env +++ b/.env @@ -4,4 +4,5 @@ STRIPE_WEBHOOK_SECRET= NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= NEXT_PUBLIC_STRIPE_PRO_PRICE_ID= NEXT_PUBLIC_STRIPE_MAX_PRICE_ID= -NEXT_PUBLIC_STRIPE_ULTRA_PRICE_ID= \ No newline at end of file +NEXT_PUBLIC_STRIPE_ULTRA_PRICE_ID= +RESEND_API_KEY= \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index f8c077a011e94c6a0523e009d337dc58ef43dd19..6dbc53aa17fe6e814669b2a6bdf80763b1b04fd0 100755 GIT binary patch delta 46504 zcmeEvcU%#jlF*DXE*b6r^vWp3UvQ6^Yg*Y>GIp-@w;Xfv(oWe9N)Q&v`lOnF~Z6%A~-U5 zV31DdUPY%Xq|-&u1^)mZI4FDweFJ;-iU=O2)3tNZ>5R~uILIdpR5CBjp_&~Wb-KKe z>mWK0IAmZ5Q|a{8bh_NIW04*8$l%bR;E3Sh@W2QJgQJ3-)cDZgz~1z~4}TULJa94j3TmsxzuZ?Z+2xV*&8|ZY!p+|#l!F|B= zYo+NP;9{^#X}T4de$Tyiy29Wa;G*Dt;N0~PxY|f9Abe2dklvAzx^0NysICIDi+c@? z>@_G#r*mnd+A}nLlDB*)r}MWFjP}v#iopHFmJ`p>tBq zgHC@3*d@S|U~@yc1)G!XB$$)sCymeaR4cL_%=m>0V;09Cz#2t>nZO&1l{H-eX2H|I z?3qMl#PvA_%%15AW`*3bo0S7^)T!wggSp%+`@_GTRc1K;7YqGAomT(RtTO%A3;o|s zE4f+j(&pCT>gt*gX2%6b_8J-z8l-y~p?2U+Fh}M%m{VlCrYCFm3@v`NruWnIc3=*O zNwX`1IpPI0{mWn_Uvu@%3-9YRBq}^OvfwDr3{0UBLzH`(&H#b8f_Ed;x%NO~ zBnTNe#8dYNGUTFw9X@DKsO}S3t7`KjrLv*?i(du34nZ_H(srGU* zr%-6{uz^UUn*)JE5QICQQ%Iz46l`1Aw~&x?vPn+$-ZV0oYCoHxW^@_x+%PwRD}wt+ zIzo&aV8Li!FI6cMb`#lh~w+hX6)LA?S)BX!dzs|EB485ra= zG+bvhMNMGPINT|8Q18GYs9k7CSjZ5aAx4cKgN#`51lYWfM}&k$1oqMCn6D03^H}+0 zo=Rr#Sk-+%aMUo$cc-d$pU}V|LxO{J1EbY;1xG4(b6s%c;Gw}0QM#hj)ogAJv=Gh!BWRzI-!pa^zgYv}BUlsHxQg3SR68q|A8M94sSP+nW9;7oaH-b&`XGu5b5 zVD3K^;L6#V6U>|8Ba92Ti=4ByjTAOpb^*+mzJ|^!+y}GBrLxL%!JI=bbJQyAgg=Kc z3Cw(*Rofi>a;%!crv%mEoKW{E$9ZbSQekuU&(id2iE3Z1hs^?#!5qtS3)FOD!JH#~ z21PjGl+^E8k{a&-WK5-mju5>m$T-P!C}LKBXl|(eg}mP3)bCDPz#DcKM%n=y#|{VJ*9Cf znE9^*vxgRGdg3~DXg{yRuEWWbM{^hjru|~Qny~c-wFRkQX4GM$TCp8qws5`1=()&X zY%t)kz;K{)k{Fti9lAnm!K93Z6hdTzFHqtNu1S)VURg1AkaZ?2#P@;D3IqlB8rm1>rjM2T7bxxH3z^56RVdFM zd?8iss3C#jfxSY5b&=4y`mA=VXWtXM)b`v0SAbr1k6OHZzd)5b_IuSzu7}8pz8X$t z!7Y#pJINi)-fM{R8E@H*%kP()6|7|5ykAXz<$&4;B@e20aAZv)p2&L- za?o8yJZBBgAIg;gn|-I9wsmO-)Vkq?$)J#t!NJ20tNDe3>DLp?uIm>#uzv_&mkETIyK{73B2JtyR?WqO5nnz|aAxf?m@f?o-?Q$1#R+2eW~V!R+Ay7u3lZ z9N9ZCG%zT*J8X_zvkUUb!liS2T~hni@zS=Xg@;*r4qkNYdgFUrdd_}$-Z!I0wTsJ2 zPd-vM@^ZP<++!O%o(lZg-F)VNSDY^5!eL19jqegoV-AMC1m9qL^ zljP+#Z__#?ek{Fl^|m$x?-hQy?55Z^w@zKpX`3QbW{fjQ_NE{Dy$^9;dwyxFyLXDl zm)oBH^=kF@()~n}Z}-0UCoHo%IVH{SQ~C0B3%qJ{^>E^y{lz!wZ5B+cy#7PyZN+VG z<=JLasYNA&JKCH>&Zy>*w<%ty{|HN&xUzlIs2Ur)`zNxoL|mxQB-3e2fTuV znu{ro39y)tBnOW0FrI`}2UZT*-sE8{?5NXuGrgP)&w;S$iFA%0#-*_6nNvyk3#?kO ztQ4zYRW;5i2ReBeTfp){TyDjh0;@JGot#|N!*~Ez16X?5-q9oP57l%!XIiLl4mmke zsjs0n)VgwdRWIXEgjgRVYiD=`tF~Oq*(+}~CoNB;%k!rW zv6AhpdKebN>de|1-y+1^kzX?pqcbYOdZ14`d+J@}8!b!*lbcT0QBH4LSMMeVv@}U2 zYsg70O~y_&)C|!%CJ$*=4Y@=slXRhm901DUE+@4z8Ggio)Rq^v@-mD9gZ13NnMg*F|bE=uSgLcvO?1qMt_vF=+aw}&NdUxfS>zXO(#(H70njO$=!X25CI{F`TU zSgpTVNwCy8i8W-q~F zM@$v&g^DHh?%+&ql+x~h8{EW{1hETy)FEwDPt>1ahREN8Ah=+!-pjbW*6;_YZYEG#R= zp&4Ib_55aaN3GQ+GHxR*ObyNRBP`ZKZGH=ECTfl0X_y78m7G4Xt~COfiEu(uhAPOp zncS_Rm+>Y-+~d_kiv+^`o7MX}YYQx`@mMDx0_CJIlhme{d?U} zdMcr}2z6IN9r{>e*CNza(Q@|10|+G)ijbP(^tVv8ewMUT5eiWJ?tBZGLM*u?A>^mT zzC@@4LsFCea#EzpFafixqr5QE%Ww^$9!kh#02dRrIS8q-4-o32XpKU-5E;7$AvJ|{ zm?hK~AvNt0g!~o1QUfg^KE+XUxqwh-CAP{SE=1&K9EFfN6EMiq^+9sdaGcD-sJ8FZ04U1NFS2rolpgqkX$=?M8Mp)22FOAN7Sy%AFV)*_^) zefBNZb1442p`@LJkebU`gjy?FsbQAb{s^hLY(Yr%`-qU5U;W`0Ee0Vqzbgo-DeOkz zKBDB;7a=w6W`tC~&)>8rQCfb|v?w`gtjU;bq-A|^+xLa#u1+{izcHGH0~1!_7FeE$ z!&-(_ew1Z0(h7s+hBzx8vH@G@i|)JX0&!pm53w7LS-184}WT1q)skJ94N z@(o9mls;Nc8fP*T8iQ3Wcf(<)H$unRnd~Hp@50n~XWeeLDwY znCp*|116Y^JHLs^%{`2-H4FO|_9mC{mZM^_gNLyvEG}eqgIo=Z^~3!QH_>0m%Qq&P z3{@s5+ir6&<3NP!AR6~dR}X3R1UYGv$@l?cT_p{7qnZ=djT=YhRvyNoup$trZYXbH zF?aNQ?+9QWmu(&HKbuiwA#gV}Q6^8-a$*6$55LIc95Jx4i z9N5G|nlo7rh%p(@L1Y2A!K1rMPEj*bPwoDirJm>oEGAby&%t6k^-OFNW2pd7$gN

x&u)*v1-5OQg-t$u$W9~xnUXOSZ~86gxr;TSgxs-d4=_9 ztgl({cl0m}hlNdUgqO5^s+=_4WPDCRDGIfaoTteps+x>J)6`p54&}VI78V;J@x~|J znkL_fGa1WHx16N{G0nTeVug)z@;DD;A}sFj>dE~cERL-~&hYjyG>X&dYRC)6dKrf! zGB?3lX{Gk}W-yjPg3dVjS8B zYolhVZGQ^uM@tFD+H)-H1a*-j=g3KOO~ySC+rb4*Y3^Zkn2TGCVrAegx_7P|kYF;_ z6xh&JmtYU$Em+N9DHSxD=6$>AITD7rH&{q5FtOcK4I{H)kIlGUzf@y7MYA~m#Ire zIUX4VEKhl%i zEN{8gxVqK|G(lqQ5jbi+gM}CSi|bmgWcQ-#l6j>ZkZdwufj~cX2pv|bD+AR;1;Svl zZ@3oLhJm6O}4G;@u7W0}c# z8e%<&`DJ_T*~Yc%2-(QVo*q)ewQ|yOlVK7>%p#l-k0Yd3CeXpdP-q=0Dlc5_W$cU) zdkGD#$$|cs}(6vnt zSZ6Yh+-5mXCx>B*!%};KH|0D(Wv#b2EY<;A1zxp`fJIO2b4a%b78{Q{7e?^?PjZP3 zCTah6IbegyXuCrlI%Nkow1^2W&L`Wg5KOAtyOuZKPN_-hQd4 z6^tNdmQ~)VRvTT)J31^k6ptbjJ)~7T?uQEg!;=1$9YK^ zsdCa5lhJXPWzn%idcxvt&M9Zq_b}GjZRu88Q($qesBvdtb+=dsk3C#?-Ku)Y#hs#! z!(r7#+z-ktwiH-e-7(M)V6l_Y5-beIy=vE~+j$Ty6XKLfU|b4|gRPWjcn_;NU+Nkg z?o%g}@)Sf$*e56LFiF++%QtqIjKlV;`Qb%S3lC!|ES7~KjPx+Ppr!P!!vVF;@WL&n z2P_xG3w>*x35z=`wtw8heuGt4&0)ERvBE($4$BKSnC=JV5~(J`5{T}~fhq$bW`rT@ z>0u~vh--IYEgYHq; zW+!_XLt$|O;B*q_Vce_5DKp#nPP2?koa-^Q9A!lqd&6QbIIrNgzVMiww9jPt4AECk z_x6(fj>{$Xn~b}Tf9p=1gxHED5TM%lhgx({BoDi92 ziJXiOB)FYJ2(L>H*0nlmiR^-q8o3;ymWtbpZ(5yGd^yCVu?VTLR}oUnDs`G^7ap!_ zg@9U-b&A9UuMt85ROF1sKL(-ZN^X}BQcJZvYsohRAw`q6o|Ti1nv7o{s1u9}uJJj` z{%vpe)Sr_Bj+vx==j0?%j`Q-3V^Xjt0B*qT74;K3j&x5@@jGtgNP^}go(zpxq zjpHWcZx<{p3<;!S7v+ExCMn>eoCI2bQN96sc2O>oW->Ovq^<)DZ$l)%Bqybrq{Elw z8)I0jzCes8^{GT1$brU9I%@K^lz?l3ox(j*Z{pPAOW~dC>Pjl2`CwL zfW-`Pnp7?_6LeNhg>xd@4PXU&0`w0Ac#)|G(ZH3J=@$%;`vAQ9uzV&60T|IA;6_IqafcugnMZ!W+JBmlfJ zx#V93wF2`f%V$m(lPhG{=ymev)5Vm=FM!O976P1FO95VF>dOFDV1;I{1oI+OUk%W2 z4Z!Q)u{GkiC|(Mim4rBnD7;OJATvXpACv-iXnIy=JZ}7oA8z!@MP`L|0gT7(R_Uqz zU|wW4@CXfDNBCw2HIT`4NCR@pEq^cO%4{wI9Jnh0?W+JUGK;$gF#aZ>mlyu7&c9!2 z0lxtpuG;|fz7J4;0PxDn^m_s@{;9^#z`V%RpVPpVm063IimI?Os*1n@-vLbc9-!k# zfLB&#!Cw?rWj05TL`)~~m&Vi$noVYYxip(h+o(tR`4A`uff<(s)5lKZQZ#Up87!^Y zWCqJMg8v`ctYpNDn`s%6 zId&~IJ1bLarRih_TWfY!rqo7@ZwqGr?ZNE1Kuzxj&cQ7;7y(}YKbRGW)G9E9<#PTj zf&XP@4-7+r#lUe|gUQPLo1qD0c6~gU31m$tbFv97J_(!?_7aU(g7d)M3Z~xg+;%|a^fz68JuMoKYZ-W_kM{^)E!~2^40L(6Yr|Ex!SVEnhNwXo6Oe ziK=eaF~CVOUlsm8GsgdaqF|2ka;*VmwtR(VlR3H9YWg}&SD5SnJK=9^X1HEUm>vIs z_!Puf0;g+!WX|^6V5YyL>0}1~z%O6068Jl2!h2eR2TX-4JJ!o_kBZ3)9$8zU>@1J8 z6l4aUXf~NSKh^k|#?Q5QGUH!>Icr{P_8Typ^e31XnSP%%I}4kY0>5YxWIBG;?0?7f zQ%cpC70AI~8Z+KXv&qadCzyIJP0y7>+gYr&2%{E3W`Z9yJ&&f7xntO9dI3%U?=W2p zYyRKZ41v?Kloml|!DTd?%o>-~?5s?`a$0Wz|5~cm=$dZ=0&F66ilg^rkfdH zxFvo$gGYh64x+&RT{6=cmtRf*$8F@wrcuzFbhi2^xa@yWcuv~Gu;7&G5!ZN2QniL zftkS(%{~gokM0D1F@w{ZeGW|j^O}80=|H%=Zs4FEZz!?g0bf$65rL z!Dslz1TQrEwZ`wjtjM1le+9E56xm}2Fz+UXG`l#M_ti3B9ssI>@uRDbU&@Wdl@_k- zm>Ihvo?Js?ca3X;SzsM7esm^{f7JA*-~!P7z)bHC=9Puj*J}YOtdS8BY__C&xS%Iq>U(@&om>J&$v*2IBZ1EqOehiwn&TVI@!v5se5d(;(D+X+T~;m%zXB}eJ66ljCgQJ- z|4X*{UuyKP1+hm8!jD`?&|D#8fo=7kVU`GG#XOr;#=g}k{QU3F2 zQk^*eJeuT2@z0~lvfM>*{X6D?!5MzMDf}l-7Mbr~{r`D1`TymSB)guEJ~?#%JevIH z(d0jmCMWVh$Oi}v{PSp%eev%eQS!Es-6Kh+qyEpMN%ln6N0k3On*8U{s`=6Q{jVO{*q3`$%BDi`*ZtED42qxhQ^J&l@Q5Q@3OV~2 z!0ahWEBmdnc6=E;G|fjy_)%i-Fu@-p8CSKcknx%boP1+lt&CA*x@=RVE# z_i2@*>)EC!&8t%9R-ogX!bNL;DOCK2Cv$TbAC=-N*+HkK*008TMA+KVwg>SnCFN*Ls_i^iRA;73$GX1P!Z} z{Am*EW9dEFQa7+wxKFH&zKZ?!#m0o(0Y$=#K04RK&#Gn7{D+s`4RKq2q~7Ce#$so^ zm)R~_lzgH4pUdj5o#}I9_Rp~yQzulc?{Vot$C9F6MSby>)i0O6bSR-!z&zJ3rw6-L zcgYoe<-q0CJr`<@|Kk7LGj#LmQco+7?6rJlpBi%QBbU4W;P}L5|zM?*_sJBJmToO7lbqkc$mGpVd7i%V0n)TK7TI(J;p2pfrVQg|YowVvIGdGdAj)*g31CY@}yJ7YrkQD-VuKmNIIlJRY=RqY?POnl}(MSTpV zPNT%E9dT+x*&A0LPflzUX20$Dj+LiB<*ssT@~(;T^`9>*@QaJwpjC;ECD*NKX5KY@ zLU0ZL*`ZB`%n!L2({0Smw00@YpA1h|--xJYoRl@=?vH1eZ0qr2;sT$fJPB*7JMZ4< zP&02c&mt{iUQXFHy~oNpkN9hMszx~%_8nem_v`uXPp^8_`R%=c1z*mto40=A`u$nD zWTu~^j~pp(4d>OJIuZHXWEbL{Xf<0eIfTB?q}9sf3);$ z(~TX|Z0>Cx+r>A&O!Bj74{D!3YuwdsZsRN&^KGG)%c^3Jm%9wZcGpaeInpk6mRr8d zr9O@hYd7Lo=kyZcKbynfrR8?s{j_n{aj%+(HflKWS=D2ma;})PD86R+N}H&{RSIqy zg`6yNjqfwHTvq!o?teFV`LQFXCq1b@IORdpM{cG^H6k9{uklM;H*oyU^S283`}nGV z0Yl`>JBLE{_y4ofg}QDh7A^1PxbKym%lLK=GQ#@})h=FS$rWt1X2wrN-5ZVT)cn$@ zwDwEOxOUH(&vjh630wDNbX#t7qQ@`toVxC<>UK2b9$WwLpcNO3xzGR2uke{&-GAF` zWn357awRj?@?D%Y-@C43#jX+WA62e@;K$srxAv(pGtxYL#Mh5eJ3r-q;j*g3OTQ+; zwL->EUw-%5;nSz@ZuH&vXngVX-bsgDQd=fm8nAqHmW-EV&3M$>DGpC=ydJvl;)DVn z+%HUARreU`EgLkt{&ZICnp^FBhUfD6eM;@g3vOKC+jT8Hu{3MGr|zsRxTnj@()Y}T-u+%+ zjMt1~Pbcqc^|sxosAIc7$MsDO9+osAxVzoLd)Fq|9_jJ0e~}Y4N+#BbtR7dez2njL zpC)AO;$>Mgww==3Z^@mof_M7PE4_16?V52RI~ULFk>k$~FU~csSEr!k<3TrrZh2?@m`iR#BHMA z{UZHSbjzlgHkF@!>A4hj$GmgGZ}0bRd2xBhh%rvZQq!7GbUm>CwG?yW@UdFcUc7oS zB}=|5vgF&qs?2_8w;-qTJ?*32di&q0R7Uc>zV%%G!PDnGy&kvedY>|$hkW<_{%EYd z@8zLI_w2M6uMYg)xm54_9lBo`{-U7uksuLP75jNao{IZF_bOsNX<_S;-9{9sQ^vLB zy$xFde-~r++=!Zun83jYW>N{M_Ya4$>s zR%NN4mFJd1IZd0-KPnMzSE_qtx<}K>t}n(cl}ElgX?l`$bM%XK!{jUOMar8m4RDyY zWT?j;Y2r`iOk*V<^Q%g4p5I$tsZ5rPS7*)mK&)<4m9;4!uH0#qdrj_s=@st#+#OTd z`(9|$=BnE_eXjG%yU-K*$s>xkcYZG)?b7DA;$22xnRBRw?np?=Z{2=>St(1tYrfmY zem&|KdeH9K_J=DjwR+qkqDhP?D(u0OjCsbLU)FEh*t_zI>~*Wdf|tTH*R*GVJ;W4=<1ux}|sBj{&WV^qX_?)rR9s zM%EpBKD2u8^^-sM`BFFk>FBcg&$n_1RW5ANe4w5>5#Cm3OX#J zNJqp4(ox}14RlP5BOMplNhgG>6DUo@l1_>Y(kW5f8FX62lg@|-q_d(ybe1uAnPo4e6@TyMcZd{-kSS3+cKr)&SiQfux%vmGp}!;0{U` zA*5f$LDFx+wkGJ77);6#X{6tUeJ#*!5kDug!DxmBz+aO-uljx zPA?+7^_?WWUYsOLdQq+cIEP-0BwOjlMY2IJ9DfAo)Qj=tTzYYXY^@h=4Z%jemqSyyDEFy+rcyvJnl*tkuMLz9 zO`sIgi;q-%+Cu5p6iN}jSlblJdn$Q-pcK=K03Rr;+dGEXwU{!T_loR#0!$E@NEln6Un3+;seQD zv~35fDb|o`34MEzhwvwPiY=tt!q@>+M+B0*L@KGSD9{m9PlS+6;vlKMulQwVc!|lP(+a$i3_C0!od&JM2sUf71v2V!qp$-D`H8_Lv6b#RHJ= z3`PgH?1Bz%EfTvxZzEoi+6v#Upmrje)Lwibbr5a4fjWvcq)tNL9n@L)gT(579L?^? z$X^(HaAt>aFnd7gB2p<>_vcvlgwRcd^hC<;;vlJqunh$D6oW~DB8}8b*!KeU7Ez=i zae)*p9D0NLh;gL8;yS6Ha18>5h*(m8kwF?DY6pWtMLa1?JRl7e4f=ovi9}MkctIL0 zeEWhTL^3H-d;kfb2voIOKU8(7Skn)}dkT3&APg7&ArMwaLfA_oN*Mb?@EZaltUrWN zB9(&mPza?4Ko}!J20++J;S2?{unmRKZy1Czp%BK2Gz!IsLvRX%FhN9xK{!Dnox&vH zFc89s5fI`ALYN}1Q>YRJq23?}u_AU5gliO@P?#oaheL=N31MM4ggEhlg6Aj*EeAuG zDG~=mxKH6Tg?Ql`0b$-~2pb|G$l?P9pD_@+MM9V>)fhZKQn}|p%CVaR0`J75K0Y$uuy~ygRqmr848Pq?QjVF#z7b}973{4qfmT21g8-Y zmWikl5Kd4?r?5geL_rua0YY39gjM1?g(?#v)Efz5jffoy;TnY}6xNB_qaeggg0OHD zgbm^W1<%P4T8@UWNhFSjaG%0w3R{Hl7zp#GK-e$_!Zz`Nf=>*DZet;A7i-2scuyg( z8A6KiH$zw*3t=yXRAG#U;5QXQSTuy)B9(&mGzg`}LD(xo#zELg;S7cS!gf4_e$ye0 z84uy0NTX0Z4uaDJ2!}<~1PCW6q*FL5940~-F+-nE%$TTe#v3?=Dl_3xZxTGxMC>F8 z*C;%pa7xsk3?XI~goTqKoDmNwc*a9$IR(NwkvIjyeF~o`ToAr75a!K>uptJ*CGmlR zj|`z(EQBj!O)P}>6!K1m@U!rr3Sspe2zx197shE2{N_Rkn+D;gNTpz%0HM@$2T zkxIcj8A2%m;j;)45Oz{HL*c8iod==cQV3(_;dZH)#L0Qskc%&a;*hn8Iv>h4Do^G^`9TtO7C?zv31#5|D0wCE zkc#IjC@mL4$uEhdg;4HO`AnsNB$_RPGH*4M4U3=@lEgbrD7|I+{sY<)IEdJl z5Ux>pLZPaty$V9i76=PhL2wceD0ps#&~i0|>LPJ9g!>deQ*af&Yaqmhilf^`Z6rM2}`VJC$% z8{ko2*lt9Uemm*05kdozMxl5r1gA|98j7e*5Kd4?r_fk9Y=$sm7lgRY5SogNEfA{g z*5{R1yl;+^Mf_IS*Ij= zR#Ux{1N5xUqK^X`~*)eix{xh$01w3#4AcVK=C^7)J^c*Ga*`bq}bI zh$ZzE8Ki!q_Fhnkh$r`dUfy1DYB7`(b93+hvwnso?#9-1` zkw!8L`=g*}5k(p&E|A6xhhv}#VjO9rxK5fRT#th$i&)YWkwJhzcw;j@FcEF#sQ%k&zK0?Z;k+qrf7UO{kz#XGUrjIC{HnJyH1*cxNIjE^ z^S|k>4Ue0A=j*Mcc&+E>Gj#bx>V17lLlL~;H;=e*S z;#CD2ev~(wr?N+JIck0!;8aH9s;X%$dbg%k)3n^su4!Q>mCedKVJz>Ian>UFv6)Q> z^Qx|Cc@f^CX)a)8RH1FvG#IAHn6MK>+6EwqvtGInowO)G(LA!zL09-3AXVSYe`??l7JvJwGYo#5l7%hN5_7_I1b8JwL*6=(_tqr>aS7Fu!SMIt)Yq*)px|fX%87bO~mkNuXpcqgbum$)zsI9;@;3r@^umeZ|b^_cXb^*JAJ-}Wd1*Pu< zxKr!`xI63t_5%APti=5Y90U#lhk+x&QQ#PG95?}_0Vjb|z-izNa27ZRoChud7lBK_ zW#9^M75Evr4%`540>1$4+YJEwbCZNg%nsug!!3nd$WJ0}f>hpVDmn$XA!X1xCY%Hu z2M#j(nPbDTVBgmgffJ>YdAVPVLk{DCaFKVSRK7qIf+K-Zz-VBMh@T{R)#HcZ{eb|W z3(yr*Ls0*3&8 zAnpmuw#61<2k;ZR%U~}D@*D z4}tk`_eJS$3GtTc)WWKAD-TLTKfZjn_=^F&pm*i01sXL0Uorfz=ww`Hy`|}0jxu&i-BoC z1K>x1rz)PJ_`iV40`@>Tpgd3ks0dU7Dg#x-g=tbTvk}4Ezz;wkATN*)$Pd^61%QG; zA)qi&1Sksd48}SWtx$9_?9o{?i_VY8^a1(;{eTdlKQI6YFc267gad@c51ofOe;@$h*^E693JwP%fI&bX zpdY~VR}Ubp2!4eCfq=Jm_`0@R?3<1o?R;dwo9k>K9%u_pLJKDXLjdmfmao9M797+x=hnPdnA?MI@op77sc5?~12=F$9*_B&26@ge_MoLJW^hh%E zKC}p!1z6&E)13q41!N!|m<@0taTRm(ZjR0~>%tz(L>uAl&1n3g#UMZ3MOhKLJ~TO~7Vg3$QH< zE+Bj!I0u{s&H$%@Q@}|e4LAWD2aW+pfg`|Q^R{%;UA|Je1Bc&%4B!^<8;~ySa=+m=#ciuNzfN84&j(`KeJh&BdF%$#1HQEA7Me)lrP~0~8U+dWCyaANZd>CI+ z)8XD*NkAuNz(|J6z@c=O1k<2dGRx}64#=(ntTZdi3Th43R}i*yq#AiG?PPQTab}KG zGAE@9TDNH3SkVPqbs(!dbK~ys3^)PRl;i=FER|w~s{O@gNsQ-Z=^a;SmT(P(-885p zYN@<3lK8`tl&7F&I4!NhlQIsoGwWo@n29;u79UH+Eb*~AF+M>mSE4?AOh7%LF5m^! z0Uql_lLV=bJ!d5MGu{<=hX_NMcZo3OU>+cVZqO3Ia{!tD%yB9Lvw@kw3}6aS98QzLalmw78bH5TAVyw)FK3Sb?(b}g_5UlaEcU9I2D^{l#4b7wuxsdW3OEa#0nPy|7-OcO z5XO-Qd>-`60ro&ypfJD+*?^fxesDe@FOUbw4HyAy;4;Ub8AhYl*T6S{(Fl(LZXoO$m zhGFJwX2xt8Ys^fuE7%fmNt87WHTEFWGi(_~OPD>&c#F*;rbb)oe0CcROARgK|5nqP zAzQ(2q#t1^jJ}Mg#zJT_Y^en23VTbBVP$Wy4Em70!O=WtFd@e<8k}926Nqt^Of3a* z{5jr?`y|fH$7cG&UtBFovL??O<{~NpaC&fYWQ{8b+gta&#=3K4v-+_*oVpEIdpdlE z!+5Y|zH+V>fdl6rD?}f5Xi;cfIME1ODr#vP^C*V+uV8jo8HCx1r2)RY=b*g@I7pm& z#i9Me&6KbIO9CYTTY#BcdYoZq#=VN+tc9|*S+)PlW<}}48>kbQJz3t2U)6xBfCEqk zs00V@N#0=YNtJ-C`x3XG%FrA&Fe4MdVd37!SHpZ&%zKz8zMs&L2m$V1vCO00}TNrRw_;HCxpos-4|iDwkdcnxCz(~K0aXH_gaFR z13mfIuz83GgxCy13&4_5UTAT`X$cldSGa^Csz1;dXb-dlm^Y%7mq~uGI{_VljzDLi z2f$~*y@1|;zh(z$T2F9SfVRcAJHp)nrqeXDBG3rbA}!9$z!L6*FcSv@K>#zg6ln2b zMVKZ8=m)Gr?Jf860kC;5=W9N8E*l*IEr5$;7y^;NP+$l!9he481!931UU+2F3zofYHDxU?dO)i~xoMGk}@EEMP8>fy&I`aLNE*WwisE0E|e4HV;Su zgci?4^MOUcLSO-4y$8Q=-D!~W`x2=>-i+J5hO>*atBY`0CT%q8ySq5osOjnKB5o~{ zb`-&Prw0!V!U0tKa%ApQIuXBIa)GC-yR)0CvrEd!<)y3rZD$>sBk5f|o!$7g zxDgl%Bhrj2?)5QbN{2pLOie`9aZn4geEYJRowI8Vo#n6ZmM?8qVqBcv#gbKcMOH)C z4k?+b<;$HB&t5?tEq}|md<`^WJk*K=_UaW8j1A24#n6aB1zE)oj>=PoXv?=jvn$Xp zG-qKBwH(X$MYA3*R!k+fJjRP@mm)c=O3~5s&FV#b?{>;NyTWay*qY8YbYfDG9Iegz zYJAFpuWi%5S6b4Kbw#a^5?|Gh64f zMJirvJ9>cgX5OH?=ig20c-Ttss&>Eb0%A%dX3NW0+k13x+B-AmnTz)Gfj(Ge&k3cBxWvX|bD_z8k#JO|*es_ykhmHW@u7-`5#2%Dw=L3)ONbB79{_W*uZ#KyE7*Iz%XYFF)!9EEYY2Tx2 z^K%O_J(eSe<%XvZsT`Ny%qlbHa2?@&NGe>GwY#mQzc%R8c8^U%8fJR^O`p1E*Qe^j z{_Fk0M(^&8`;QoWRVtEO38FfayhXk}7@`^8qRJl0&2AN3@<6XKyZ6Y03zv+M^hr=S zXxqHSFna8R&3!{!`TS&`emkp5`kLC#eZpHD*(3FlZg`7od(mCb;aM1-<6N%{DO^?d zLt}8?;tpfgK=g!1tx^rt;r5xVYgTQQpPcF8ftX@Q`}6psTa1^gvAeXits01pOxs6G z+v56~sHW|t(wQF7h_OZ5zHvh@O^@#vof(tZKzu@4>1rcUbf4sCozX}garyxc%K_}{E&dZ_DJt;;%BQThPtlKl#%_Z@BfsB*th{`-xKzs#&l z4mS~sw07CAV5W`s5li49{mrcVn{~>R>N-{H7++h|J&1C$Uzzk)S7z~A*{@1^WWOpI zgH^eYxo5vB>7lMlwJx!BM4m(N&VC)zTV036?Xq8k^w4@mOg|(QlwP+JOAbk8?drBy z9;QVb`ZgQz+YePU3hPbvFvW3oXfJ+Ykzw%Q387q@Vy|)U=w4Wl!;f-}YAZQSH#rpM#<;ug#Qq}A}nn`&z(TO}*ydno1S z?w}ndANM^IQ}9u_%(R6%q&OeJ2iv3)9fjLbDM@Fe6x3xYYBnqBNn&%B~?iIf5fQ_Q@6Bqri046T_tI>MyFDM19A=gJ*NOb7o$a zw!ilmpH50{lGawc!U5`0^i+xG6$TX%t8g}ArraU|M9`_sUaFA4le+UpBL#QhBlBI3 zz8`O05h-|btbqe)K*DKEtMzcOfrH21Tq(QlS|3-kRF0N=0z|9RlB0AyK)9TdiswEK zPwtB4x`+j*F+*IsC_3X?oyANkdlu_SbGC?5)vh8Gi6!^0V)B{H%oumFo9z0Pd8bYyjPGA3wOOfrSKPhMQ{q-*GUA06PmT+EiGn|4C0JIhWrbwf1xg6- ztLj$p-L~}I2KLwO=r7qw?m^=8wSQ@8SxcXNx7mE#%l?|lU&ixWYw+1|P2Cp-oGHrIRGgOc4jwEUfjwE$&qIa`Z@Y+qui9@!mG z)EKC34k_J{Hrqpr>R~ygtWB5PrPkr% zRyy|T`QhqbUAjh-!22WTmQ(g>O)_ z;q9oM>3mhYQUz9J#zYJjqmkBbGCX($Sya+x*QE!&12R444;Gu5`$jE~yu}(lShR82 z@l1~+TDgaGPn%YHAbDrTTpKLDFzrLl3ujwr9?uQt@eCbv6 zlQDmp!f!KUMn{OVOgjS}EI-C-eZL+B>Ws+rNY>KIUXRQ7k4uWljM*L`>~5iE$2E@= zZ==hMUfvNeeJthPj1X<$QR^u@3L^JfEl%%9p8eCvOpl#W>VYofO`2{({D8OW(T9`% zXp~rlw9>^WvGW!-y+5MF<6BY-yBAuDwL3nw-eju!+3MTv|4WqUkO7YeBh^Fdk(kS8 z174rE#p5!br;zEpkz!8i;FVw9uhoI!vjLpa+G+EJS6wA!t^_8 z-eRoU>jm|`zr0TAyG%P7;MNj}7+d7g=X(9E9i2SyO8VYVY@kdZE0*NTQKU>QJXMBd z59xW@MyJB%a$ZF88qPKOD(b{oaR3GQ`~nXS+Plqjn&#*->@hrQ;W>dT{_Kbt4$1G& zE2TSn47!OJ59b;+kk}cIrCD^RAy1?HzZN+x=?!L4_BJ}Jsae#yjT1$ZS#*VMw^Q@X zh`BjrORJOC$iv;ama@y5#VmN#%76!70~a;;mugjNLYk!abgrp9r+9=IJ^-lKDm<#x zq(gO)7UPP8mV3@<@#}32Nrh-p@D7g4UeRLX9hBBOT7AVmKe58Tmh!6CN{!vv+Ah)J z_d9qfG7uj5k*Dp6cw_pc&FkQSCyzXdjfoaPckzllE?S(vi@Xz}6aD}tM+=l?*1pGAv@v_C|P()VDG8YevO!Jactgp!w!6HB1mZ5*dI(=)+oj{V_+ zXeJt?JnqvxES}QFal-mOX27!vqSJlJt=6>3>dS_M1-;(%XfgYglG2TjJ`GdUgJ`F= zr&-o_}Qe~3oRnl5fVL^kNfj}Ils-1c$mSw1CBI6p$;icVJ> zH=y2}n8BBRVMQ>k)dj;7oDy5po(BExs_tshMgH6YF0t+3fs@rbwYJk-Ia6 z+hbHc=WG%ESUM}+pDo%vf&F^6So8$*Wv;9)opttpOFvHfS^+7!bWqk(#PE5`znZNJ*H%j9QqcJ#rUX*#2wu~2U$^Odlo&i6$Df@N z#Ga>U^QZ*z9C^5B+e^wJe-ZNFcF^JG$SPIsJn=_{8BlDXh_d-}l(1U|i?4d$t?t!g z;`K7oS{Zm*nVKN#=0`nGC5Y+I(86m8BAoW!1aaUQPWsOh#N%gJkDn4mzUQ!u2vO%b z>{&v%e1(6q5YPX_>$e%tC3m~^Laj#CcBzZoR2u246r=oEB2|cApTqr}5bvL3I34GS zo-Z&c$fixM9L2@47kGynBJF5=e1W@VwM60a5}t1pMQMGG;&%Cx)GmJ>eX5OPr4LD3 z-dK1JNute1bW{DLgjZa{aO4f}e67d&R;P+I(;TrM1tkghS12?pNgViu%ETmz%?4zh zgcMxUPlE0|cpEdSg_1(~>%^KQasCx<*$3cJ6dw7l7X9AC%}(t<<&OtflSJv)Qc|tI zX*zoNmX>>1(jNQxzSsyf>1)*ZBRn|oY+9V|R5zkZY-Wvf&KKq0p!}lq z)$)r^I+3`~Zw>#vqP_U7HeZClL0f9h7d^j#8_pNYkwWXf;!?}`!p15`5kpN3wGesU zqPPHLRsh9~aH{%fv}1|;N@mK08!%sZ!=u(nc(4mszZ@~eFVQ|l@o;nY#NYQ2!&e#M z-lNwYFni_GDuQONnlENB?Ll}HgvX_a!>`>g(R!2Sf$4k+F~ty5xIxVyhaNh|+W{Ma zfq6Jz{KA^)7pQ3s1&8chGQWvsj8XSO3xv%(c$9+&>+ZL{>r4C4c9)eru%p-1W8T%)-jlI z#&p6=v@L#062>?&F-lj4@)$4*B*tii0;9>$X>=TGZ3o+`W1XR?lK##)_re91hJW^+ zbH3O4UiX~ueuEGR!hYFEyGFq9Dj+z+@SAzVKl<%~c`8HXgugaYGawAo0z$(N8|l^v zl)w93>Y0lmlE33)$-8#USgK&t?kY#!m4;!XQ~xn+QqgVo#1hqKWY`JuD8@XnG+(Em zK0-{X(WVA%9POXULRE-bRahIn`q;2tgQVm4pfVYXW=bCg4e4kias#7yBTQs$RwEnl zHKBata`<_|M>6{;>-JRteaMhJZup1LF8`8uql*D@YXxt0$?sFW-RtH9C{Irc2!j?E6hrI}2HI`m~`kpuSlw zM|tu0GF8nOC^+|c{a>_H1vilCeX>d7X!mTkjLU&MYF0Xd&eO+*=eqkl-u~f6HQtcs zWiA$Rrp1>jKq+&WId>WdL*7^vkU1ywkY(}k>eS3}2YV(!o;ffw66R6-{-0E^IY9To z#gO_gh0SI8N)u@E1Lu)HmPY@xEA$tj$&ViJg7yIU05Li4DI!c7N@oV?iL;Ra(L!~S z_J=`~;C2q;Uz!U{)}V-B+iiBHE6HBm0)Y z4tkmYPK+>Nh1|*3RE~AXs?bRP&7n(uZEY$$7(t8HEl;rFV6;pVEE)n@f{ELM}m+%uac6loXGNIaFjz!kQHLW%l-iuF$4Y8O%-bI)B_(B&o#zB8Ky3kpR zy?vZ`?ZQ_rYjJT#3FnF4J;^9IAacn+qjDs!GPD`#D?$2=)K38kWCDPNzJiSqRI z_&@Jx{lE_fIFDy$FP|}dmLg5Sz<+&OWP(Y;x~bZP?ZtM}2|iBirV$g2-P}z(&8*dM zv4`wWV*RTgTA?s|Qci9{uYC8+xb{wVMP)H=wy?bTld!n-^im(kN$5Q|A0)5#c5Ix_ zln_3DR)J#nCLrH!{Y)O-E{zT?KJ#{aCq(4g014}AF9F_cDF2N9l>kjw1Cqb&if-S} z-?G*>C^jP!fM8%&Wpk;r3jUl=Zs|FBKJ9<-^toM2tDgfR|NaVbtFgjU(a}3QGyGc~ z?86E_QX$IZMeTf8>*tc`?ep|aB7~7eC?ka@vBcbUU&v&8FuHbi_A7z4LLywemdrSY z72Ykg_q(>n|C)^+l`x#O`3ovcf>1$gROorK2d`0y71XGjfE&C|s02jN8kJZ{D*u6*`*Avcl|Zm`*iCOwX^Tg!Qa%q=s(cbgfYL? zd6zeqfA~~Y{ihi7ovqxo!1eO4ziH{m*o5)JJHsb7EPcZ~x&QAr){R*2d-B1)?$H_R z=tvr~CtUJMUG81Bv@c{wPQz-afnt_s*Q)?a`XN^ox;{DkN}m@7 zEO%G=$?_pfjBo=K(f}emlb$GIDGB2cSQ;MyB8#Fjn59_n1pv_xt)h`tY*Xu~vsIS= zvefOdaxl^E=*uc`Ix8!jzEUT853N;BpW9LH-s$w|AjooxDKTo>BzS1VsQW3laFNzE z$>mcUDB+}VQQ-=e&LXF;0#!2yIaV^oJT~OuV*_Z-{u9`p_gP|r|9}SmJ?!($vRo$# z)^sB)zPcckpht*~#?1=!8v1K0`9{hdo|1AAO(v}Y5xCl;H79eapl#IpEwQLQTC>S= zouwscR7CKN53K0aq}6MfB^h%%rjmkgf>y0y3pkKYsS-#x!99DSS+f9N)}A3_Hif*- mQtg_$gV+uTQw=K2(vgwRHq_9UJ6J*o{8)+Yc;!zl()>T2l2oz) delta 40845 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 N6taAKo=iEy{|_;^0W|;s diff --git a/kirimase.config.json b/kirimase.config.json index 9a70cf2..eed193e 100644 --- a/kirimase.config.json +++ b/kirimase.config.json @@ -3,8 +3,9 @@ "packages": [ "drizzle", "lucia", + "stripe", "shadcn-ui", - "stripe" + "resend" ], "preferredPackageManager": "bun", "t3": false, diff --git a/package.json b/package.json index de03151..1d5e181 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "postgres": "^3.4.3", "react": "^18", "react-dom": "^18", + "resend": "^3.2.0", "sonner": "^1.4.3", "stripe": "^14.21.0", "tailwind-merge": "^2.2.2", diff --git a/src/app/(app)/resend/page.tsx b/src/app/(app)/resend/page.tsx new file mode 100644 index 0000000..f59d358 --- /dev/null +++ b/src/app/(app)/resend/page.tsx @@ -0,0 +1,124 @@ +"use client"; +import Link from "next/link" +import { emailSchema } from "@/lib/email/utils"; +import { useRef, useState } from "react"; +import { z } from "zod"; + +type FormInput = z.infer; +type Errors = { [K in keyof FormInput]: string[] }; + +export default function Home() { + const [sending, setSending] = useState(false); + const [errors, setErrors] = useState(null); + const nameInputRef = useRef(null); + const emailInputRef = useRef(null); + const sendEmail = async () => { + setSending(true); + setErrors(null); + try { + const payload = emailSchema.parse({ + name: nameInputRef.current?.value, + email: emailInputRef.current?.value, + }); + console.log(payload); + const req = await fetch("/api/email", { + method: "POST", + body: JSON.stringify(payload), + headers: { + "Content-Type": "application/json", + }, + }); + const { id } = await req.json(); + if (id) alert("Successfully sent!"); + } catch (err) { + if (err instanceof z.ZodError) { + setErrors(err.flatten().fieldErrors as Errors); + } + } finally { + setSending(false); + } + }; + return ( +

+
+

Send Email with Resend

+
+
    +
  1. + + Sign up + {" "} + or{" "} + + Login + {" "} + to your Resend account +
  2. +
  3. Add and verify your domain
  4. +
  5. + Create an API Key and add to{" "} + + .env + +
  6. +
  7. + Update "from:" in{" "} + + app/api/email/route.ts + +
  8. +
  9. Send email 🎉
  10. +
+
+
+
e.preventDefault()} + className="space-y-3 pt-4 border-t mt-4" + > + {errors && ( +

{JSON.stringify(errors, null, 2)}

+ )} +
+ + +
+
+ + +
+ +
+
+ ); +} + diff --git a/src/app/api/email/route.ts b/src/app/api/email/route.ts new file mode 100644 index 0000000..f3920e2 --- /dev/null +++ b/src/app/api/email/route.ts @@ -0,0 +1,22 @@ +import { EmailTemplate } from "@/components/emails/FirstEmail"; +import { resend } from "@/lib/email/index"; +import { emailSchema } from "@/lib/email/utils"; +import { NextResponse } from "next/server"; + +export async function POST(request: Request) { + const body = await request.json(); + const { name, email } = emailSchema.parse(body); + try { + const data = await resend.emails.send({ + from: "Kirimase ", + to: [email], + subject: "Hello world!", + react: EmailTemplate({ firstName: name }), + text: "Email powered by Resend.", + }); + + return NextResponse.json(data); + } catch (error) { + return NextResponse.json({ error }); + } +} diff --git a/src/components/emails/FirstEmail.tsx b/src/components/emails/FirstEmail.tsx new file mode 100644 index 0000000..cecff1b --- /dev/null +++ b/src/components/emails/FirstEmail.tsx @@ -0,0 +1,27 @@ +import * as React from "react"; + +interface EmailTemplateProps { + firstName: string; +} + +export const EmailTemplate: React.FC> = ({ + firstName, +}) => ( +
+

Welcome, {firstName}!

+

+ Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim + labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. + Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum + Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. + Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex + occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat + officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in + Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non + excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco + ut ea consectetur et est culpa et culpa duis. +

+
+

Sent with help from Resend and Kirimase 😊

+
+); diff --git a/src/lib/email/index.ts b/src/lib/email/index.ts new file mode 100644 index 0000000..82b7264 --- /dev/null +++ b/src/lib/email/index.ts @@ -0,0 +1,4 @@ +import { Resend } from "resend"; +import { env } from "@/lib/env.mjs"; + +export const resend = new Resend(env.RESEND_API_KEY); diff --git a/src/lib/email/utils.ts b/src/lib/email/utils.ts new file mode 100644 index 0000000..8b1eec3 --- /dev/null +++ b/src/lib/email/utils.ts @@ -0,0 +1,6 @@ +import { z } from "zod"; + +export const emailSchema = z.object({ + name: z.string().min(3), + email: z.string().email(), +}); diff --git a/src/lib/env.mjs b/src/lib/env.mjs index 2b4f3cd..c3546c5 100644 --- a/src/lib/env.mjs +++ b/src/lib/env.mjs @@ -10,9 +10,10 @@ export const env = createEnv({ STRIPE_SECRET_KEY: z.string().min(1), STRIPE_WEBHOOK_SECRET: z.string().min(1), + RESEND_API_KEY: z.string().min(1), }, client: { - NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: z.string().min(1), + NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: z.string().min(1), NEXT_PUBLIC_STRIPE_PRO_PRICE_ID: z.string().min(1), NEXT_PUBLIC_STRIPE_MAX_PRICE_ID: z.string().min(1), NEXT_PUBLIC_STRIPE_ULTRA_PRICE_ID: z.string().min(1), // NEXT_PUBLIC_PUBLISHABLE_KEY: z.string().min(1), @@ -24,7 +25,7 @@ export const env = createEnv({ // }, // For Next.js >= 13.4.4, you only need to destructure client variables: experimental__runtimeEnv: { - NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY, + NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY, NEXT_PUBLIC_STRIPE_PRO_PRICE_ID: process.env.NEXT_PUBLIC_STRIPE_PRO_PRICE_ID, NEXT_PUBLIC_STRIPE_MAX_PRICE_ID: process.env.NEXT_PUBLIC_STRIPE_MAX_PRICE_ID, NEXT_PUBLIC_STRIPE_ULTRA_PRICE_ID: process.env.NEXT_PUBLIC_STRIPE_ULTRA_PRICE_ID, // NEXT_PUBLIC_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_PUBLISHABLE_KEY,