Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Login with phone number #93

Merged
merged 20 commits into from
Jun 3, 2024
Merged
11 changes: 11 additions & 0 deletions .changeset/itchy-owls-obey.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@zemble/auth-otp": patch
"@zemble/auth": patch
"@zemble/cms-users": patch
"@zemble/cms": patch
"cms-ui": patch
"minimal": patch
"supplement-stack": patch
---

Login with phone number
8 changes: 4 additions & 4 deletions apps/cms-ui/app/(auth)/login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ type TextInputHandles = Pick<TextInputNative, 'focus' | 'clear' | 'blur' | 'isFo

export const LoginConfirmMutation = graphql(`
mutation LoginConfirm($email: String!, $code: String!) {
loginConfirm(email: $email, code: $code) {
loginConfirmWithEmail(email: $email, code: $code) {
__typename
... on LoginConfirmSuccessfulResponse {
bearerToken
Expand All @@ -32,7 +32,7 @@ export const LoginConfirmMutation = graphql(`

export const LoginRequestMutation = graphql(`
mutation LoginRequest($email: String!) {
loginRequest(email: $email) {
loginRequestWithEmail(email: $email) {
__typename
... on Error {
message
Expand All @@ -55,8 +55,8 @@ const Login = () => {
const doConfirm = useCallback(async () => {
const { data } = await loginConfirm({ email, code })

if (data?.loginConfirm.__typename === 'LoginConfirmSuccessfulResponse') {
setToken(data.loginConfirm.bearerToken)
if (data?.loginConfirmWithEmail.__typename === 'LoginConfirmSuccessfulResponse') {
setToken(data.loginConfirmWithEmail.bearerToken)
}
}, [
email, code, loginConfirm, setToken,
Expand Down
67 changes: 67 additions & 0 deletions apps/minimal/.env.dev
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@

PUBLIC_KEY='-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArRjgBxq2WSsxHvXeM0Gu
fa1s1Ovoo3UQfd239dO+vxc8H4FbO60KYkVwSPwTfqOvre5pp5XkyFFhHonNNrQa
qAzPCihYhIwvL0H7CvOaQqDCDGt5+UZnQ1gHxng9zTDOP3NKtmZ6d9VDHydK+5tW
3sObf2aLXA19W1r4s++SzWtr1zkHs+NJ2L8m0Jm/mDu45n1pz4eKZK43iTwUcpRz
SPfreK8lzKulhP+Ehr+1o6Px3y5C4uHdl0FN6B6bdbR/OfQuCDQ+KBIeW13epEep
0W675WIUF7c7lCyzstskRPkB9SITYTjvzEesWarQo9C9vr22AGCF70JJbuGoDAk2
TpPEA1S4bZWZxwdTTV6Ys9iQd4dSWh39G+rnt7I2QMJhHmGnYA/PSDGxyDd9y5ub
prKGX5UERdGAPEZxgJjCRFhOZgCsYXMewg246oUpMe8Efvi67DqZqPHJmJK2++Cz
nEhrZXqEvSSpVvnP89RXutLCvOdFeWxx4NlPpjwI0Whs+JPrpFuqXKhRX7cbk33X
zD79jNdVXZEWDCwOkENeDqfPM5KiQD3y6geDAFghBge9Xwb9FMPCJ9GV2Zt2cbFL
PmS5NlwkjP5O9jHswPFZdsPT5oud/zrNB5OYf2J1qyUl0y6tu7ryH697p9PJECXP
pduX76EzFL7Qe9r9jlUNCm8CAwEAAQ==
-----END PUBLIC KEY-----'
PRIVATE_KEY='-----BEGIN PRIVATE KEY-----
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
DmxKOUbG7CHn8nB21sC7cvKKEIxoCg==
-----END PRIVATE KEY-----'
67 changes: 67 additions & 0 deletions apps/minimal/.env.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@

PUBLIC_KEY='-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArRjgBxq2WSsxHvXeM0Gu
fa1s1Ovoo3UQfd239dO+vxc8H4FbO60KYkVwSPwTfqOvre5pp5XkyFFhHonNNrQa
qAzPCihYhIwvL0H7CvOaQqDCDGt5+UZnQ1gHxng9zTDOP3NKtmZ6d9VDHydK+5tW
3sObf2aLXA19W1r4s++SzWtr1zkHs+NJ2L8m0Jm/mDu45n1pz4eKZK43iTwUcpRz
SPfreK8lzKulhP+Ehr+1o6Px3y5C4uHdl0FN6B6bdbR/OfQuCDQ+KBIeW13epEep
0W675WIUF7c7lCyzstskRPkB9SITYTjvzEesWarQo9C9vr22AGCF70JJbuGoDAk2
TpPEA1S4bZWZxwdTTV6Ys9iQd4dSWh39G+rnt7I2QMJhHmGnYA/PSDGxyDd9y5ub
prKGX5UERdGAPEZxgJjCRFhOZgCsYXMewg246oUpMe8Efvi67DqZqPHJmJK2++Cz
nEhrZXqEvSSpVvnP89RXutLCvOdFeWxx4NlPpjwI0Whs+JPrpFuqXKhRX7cbk33X
zD79jNdVXZEWDCwOkENeDqfPM5KiQD3y6geDAFghBge9Xwb9FMPCJ9GV2Zt2cbFL
PmS5NlwkjP5O9jHswPFZdsPT5oud/zrNB5OYf2J1qyUl0y6tu7ryH697p9PJECXP
pduX76EzFL7Qe9r9jlUNCm8CAwEAAQ==
-----END PUBLIC KEY-----'
PRIVATE_KEY='-----BEGIN PRIVATE KEY-----
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
DmxKOUbG7CHn8nB21sC7cvKKEIxoCg==
-----END PRIVATE KEY-----'
1 change: 1 addition & 0 deletions apps/minimal/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.env*
5 changes: 5 additions & 0 deletions apps/minimal/app.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Bull from '@zemble/bull'
import { createApp } from '@zemble/core'
import Resend from '@zemble/email-resend'
import GraphQL from '@zemble/graphql'
import GraphQLLogger from '@zemble/logger-graphql'
import Migrations from '@zemble/migrations'
Expand All @@ -26,5 +27,9 @@ export default createApp({
Migrations.configure({
createAdapter: () => dryrunAdapter,
}),
Resend.configure({
RESEND_API_KEY: process.env['RESEND_API_KEY'],
disable: false,
}),
],
})
5 changes: 5 additions & 0 deletions apps/minimal/graphql/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ type Query {

type Mutation {
randomNumber: Int!
# sendSms(
# from: String!,
# to: String!,
# message: String!,
# ): Boolean!
}

type Subscription {
Expand Down
14 changes: 9 additions & 5 deletions apps/minimal/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,19 @@
},
"license": "ISC",
"dependencies": {
"@zemble/auth": "workspace:*",
"@zemble/auth-otp": "workspace:*",
"@zemble/bull": "workspace:*",
"@zemble/bun": "workspace:*",
"@zemble/core": "workspace:*",
"@zemble/email-resend": "workspace:*",
"@zemble/graphql": "workspace:*",
"@zemble/logger-graphql": "workspace:*",
"@zemble/migrations": "workspace:*",
"@zemble/bun": "workspace:*",
"@zemble/auth": "workspace:*",
"@zemble/routes": "workspace:*",
"@zemble/pino": "workspace:*",
"@zemble/bull": "workspace:*",
"@zemble/logger-graphql": "workspace:*"
"@zemble/routes": "workspace:*",
"@zemble/sms-46elks": "workspace:*",
"@zemble/sms-twilio": "workspace:*"
},
"devDependencies": {
"@tsconfig/node20": "^20.1.4",
Expand Down
2 changes: 1 addition & 1 deletion apps/supplement-stack/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void bunRunner({
},
}),
AuthOTP.configure({
from: { email: '[email protected]' },
fromEmail: { email: '[email protected]' },
generateTokenContents: async ({ email }) => {
const user = await Users.findOneAndUpdate({ email }, {
$set: {
Expand Down
Loading