diff --git a/README.md b/README.md
index 6efa1cc..b5d3934 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,6 @@
[](https://app.netlify.com/sites/force-orange/deploys)
+
# ForceOrange
Le site des bénévoles de Paris est Ludique !
diff --git a/modules/app/app.vue b/modules/app/app.vue
index dfd464f..0313bfe 100644
--- a/modules/app/app.vue
+++ b/modules/app/app.vue
@@ -11,4 +11,8 @@ auth.onAuthStateChange(async (event) => {
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/modules/app/assets/main.css b/modules/app/assets/main.css
new file mode 100644
index 0000000..316f1ae
--- /dev/null
+++ b/modules/app/assets/main.css
@@ -0,0 +1,3 @@
+.position-unset {
+ position: unset;
+}
\ No newline at end of file
diff --git a/modules/app/components/FOHeader.vue b/modules/app/components/FOHeader.vue
index 443b19a..6a45952 100644
--- a/modules/app/components/FOHeader.vue
+++ b/modules/app/components/FOHeader.vue
@@ -14,7 +14,7 @@ const links = computed(() => {
if (!user.value) {
tmp.push({
- label: 'Rejoindre FO',
+ label: 'S\'inscrire sur FO',
to: '/join'
})
} else {
@@ -31,6 +31,8 @@ const signOut = async () => {
const { error } = await auth.signOut()
if (error) console.log(error)
router.push('/')
+
+ // TOFIX
}
diff --git a/modules/app/components/profile/EmailUpdateForm.vue b/modules/app/components/profile/EmailUpdateForm.vue
index eb65faa..8ab4348 100644
--- a/modules/app/components/profile/EmailUpdateForm.vue
+++ b/modules/app/components/profile/EmailUpdateForm.vue
@@ -2,6 +2,7 @@
import { object, string, type InferType } from 'yup'
import type { Database } from '@pel/supabase/types'
import type { FormSubmitEvent } from '#ui/types'
+import { lowerString } from '~/utils/commons';
definePageMeta({
name: 'EmailUpdateForm',
@@ -15,7 +16,7 @@ const { inputStyle, formGroupStyle } = useFoStyle()
const loading = ref(false)
const schema = object({
- email: string().lowercase().trim().email('Il semble que l\'email ne soit pas bon').required('Champ obligatoire'),
+ email: string().lowercase().trim().email('Il semble que l\'email ne soit pas bon').max(500, 'hmmmm c\'est un peu beaucoup là non ?').required('Champ obligatoire'),
})
type Schema = InferType
@@ -29,7 +30,7 @@ async function onSave(event: FormSubmitEvent) {
const formSubmit = event.data
const { data, error } = await auth.updateUser({
- email: formSubmit.email,
+ email: lowerString(formSubmit.email),
})
if (error) {
diff --git a/modules/app/components/profile/PasswordUpdateForm.vue b/modules/app/components/profile/PasswordUpdateForm.vue
index bf2bd43..8134f73 100644
--- a/modules/app/components/profile/PasswordUpdateForm.vue
+++ b/modules/app/components/profile/PasswordUpdateForm.vue
@@ -17,7 +17,7 @@ const { inputStyle, formGroupStyle } = useFoStyle()
const loading = ref(false)
const schema = object({
- password: string().min(6, 'Il faudrait un minimum de 6 charactères').test({
+ password: string().min(6, 'Il faudrait un minimum de 6 charactères').max(500, 'hmmmm c\'est un peu beaucoup là non ?').test({
name: 'password',
message: 'Le mot de passe n\'est pas assez fort ~~',
test: (value) => {
diff --git a/modules/app/composables/auth.ts b/modules/app/composables/auth.ts
deleted file mode 100644
index 50f48d6..0000000
--- a/modules/app/composables/auth.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export const useAuth = () => {
- const user = useSupabaseUser()
- const { auth } = useSupabaseClient()
-
- auth.onAuthStateChange(async (event) => {
- if (event === 'SIGNED_OUT')
- navigateTo('/')
- })
-
- return {
- user
- }
-}
\ No newline at end of file
diff --git a/modules/app/composables/foStyle.ts b/modules/app/composables/foStyle.ts
index b3ae324..35344a7 100644
--- a/modules/app/composables/foStyle.ts
+++ b/modules/app/composables/foStyle.ts
@@ -2,7 +2,7 @@ export const useFoStyle = () => {
return {
inputStyle: {
ui: {
- placeholder: 'placeholder-transparent',
+ placeholder: 'placeholder-transparent dark:placeholder-transparent',
},
attrs: {
variant: 'none'
@@ -10,10 +10,11 @@ export const useFoStyle = () => {
},
formGroupStyle: {
ui: {
- wrapper: 'flex flex-col md:flex-row rounded-lg py-1 px-4 border-b-2 border-orange-500 has-[:focus]:bg-orange-100 has-[:focus]:border-t-2 has-[:focus]:border-x-2 has-[:focus]:border-b-0 mb-6',
+ wrapper: 'flex flex-col relative md:flex-row rounded-lg py-1 px-4 border-b-2 border-orange-500 has-[:focus]:bg-orange-100 dark:border-orange-500 dark:has-[:focus]:bg-orange-800 has-[:focus]:border-t-2 has-[:focus]:border-x-2 has-[:focus]:border-b-0 mb-6',
inner: 'flex-2 content-center',
- container: 'flex-1 mt-auto relative',
+ container: 'flex-1 mt-auto position-unset',
error: 'text-red-500 text-sm absolute top[-100%] left-0 mt-2 pointer-events-none',
+ help: 'absolute top[-100%] left-0 mt-2 pointer-events-none',
},
},
}
diff --git a/modules/app/composables/profile.ts b/modules/app/composables/profile.ts
index 02cbeef..33412e3 100644
--- a/modules/app/composables/profile.ts
+++ b/modules/app/composables/profile.ts
@@ -7,7 +7,9 @@ export const useProfile = () => {
const profile = ref<{
firstname: string
lastname: string
- displayname?: string
+ displayname: string | null
+ email: string
+ is_validated: boolean
} | null>(null)
const displayName = computed(() => {
@@ -37,8 +39,13 @@ export const useProfile = () => {
return
}
- const { data, error } = await client.from('profiles').select('id,firstname,lastname,displayname,mail').eq('id', user.value.id).single()
- return data
+ const { data, error } = await client.from('profiles').select('id,firstname,lastname,displayname,email,is_validated').eq('id', user.value.id).single()
+
+ if (!error) {
+ return data
+ }
+
+ return null
})
if (error.value) {
@@ -53,6 +60,8 @@ export const useProfile = () => {
watch(user, (user) => {
if (user && !loading.value) {
getProfile()
+ } else {
+ profile.value = null
}
}, { immediate: true })
diff --git a/modules/app/pages/join/index.vue b/modules/app/pages/join/index.vue
index 6debae8..a088b82 100644
--- a/modules/app/pages/join/index.vue
+++ b/modules/app/pages/join/index.vue
@@ -2,6 +2,7 @@
import { object, string, boolean, type InferType } from 'yup'
import type { Database } from '@pel/supabase/types'
import type { FormSubmitEvent, FormErrorEvent } from '#ui/types'
+import { lowerString } from '~/utils/commons';
definePageMeta({
name: 'Join',
@@ -16,8 +17,8 @@ const toast = useToast()
const { auth } = useSupabaseClient()
const schema = object({
- email: string().lowercase().trim().email('Il semble que l\'email ne soit pas bon').required('Champ obligatoire'),
- password: string().min(6, 'Il faudrait un minimum de 6 charactères').test({
+ email: string().lowercase().trim().max(500, 'hmmmm c\'est un peu beaucoup là non ?').email('Il semble que l\'email ne soit pas bon').required('Champ obligatoire'),
+ password: string().min(6, 'Il faudrait un minimum de 6 charactères').max(500, 'hmmmm c\'est un peu beaucoup là non ?').test({
name: 'password',
message: 'Le mot de passe n\'est pas assez fort ~~',
test: (value) => {
@@ -25,9 +26,10 @@ const schema = object({
return testPassword(value).score >= 3
},
}).required('Champ obligatoire'),
- firstname: string().lowercase().trim().required('Champ obligatoire'),
- lastname: string().lowercase().trim().required('Champ obligatoire'),
+ firstname: string().trim().max(500, 'hmmmm c\'est un peu beaucoup là non ?').required('Champ obligatoire'),
+ lastname: string().trim().max(500, 'hmmmm c\'est un peu beaucoup là non ?').required('Champ obligatoire'),
isAdult: boolean().oneOf([true], 'Pour pouvoir t\'inscrire tu dois être majeur (ou bientôt)'),
+ lastEdition: boolean(),
})
type Schema = InferType
@@ -40,6 +42,7 @@ const state = reactive({
firstname: undefined,
lastname: undefined,
isAdult: false,
+ lastEdition: false,
})
async function onSubmit(event: FormSubmitEvent) {
@@ -48,13 +51,14 @@ async function onSubmit(event: FormSubmitEvent) {
// Do something with event.data
const formSubmit = event.data
const { data, error } = await auth.signUp({
- email: formSubmit.email,
+ email: lowerString(formSubmit.email),
password: formSubmit.password,
options: {
data: {
- firstname: formSubmit.firstname,
- lastname: formSubmit.lastname,
+ firstname: lowerString(formSubmit.firstname),
+ lastname: lowerString(formSubmit.lastname),
is_adult: formSubmit.isAdult,
+ last_edition: formSubmit.lastEdition,
},
emailRedirectTo: `${config.public.baseUrl}/join/valid`,
},
@@ -96,7 +100,7 @@ async function onError(event: FormErrorEvent) {
formulaire ci-dessous:
-
+
-
+
+
+ Attention pas de pseudos/surnom ici ! (sinon nous ne pouvons pas valider ton profil)
+
@@ -139,11 +146,19 @@ async function onError(event: FormErrorEvent) {
+
+
+
+ Dis nous si tu étais déjà bénévole à la dernière édition.
+ Surtout ne mens pas, on vous connait ! (et on a les photos)
+
+
+
- S'inscrire
+ S'inscrire
\ No newline at end of file
diff --git a/modules/app/pages/profile/index.vue b/modules/app/pages/profile/index.vue
index 1dca4c1..a33ed4a 100644
--- a/modules/app/pages/profile/index.vue
+++ b/modules/app/pages/profile/index.vue
@@ -17,13 +17,19 @@ const isEmailModalOpen = ref(false)
{{ displayName }}
+
+
+ Ton compte sera bientôt validé pour les organisateurs du festival Paris Est Ludique.
+
+
+ Ton compte a été validé ! Prêt pour Paris Est Ludique 2025 ?
Authentification
Gérer mes manières de me connecter au site de Force Orange.
- {{ profile.mail }}
+ {{ profile?.email }}
Modifier mon adresse de couriel
diff --git a/modules/app/pages/signin/forgot.vue b/modules/app/pages/signin/forgot.vue
index b91919e..7361eed 100644
--- a/modules/app/pages/signin/forgot.vue
+++ b/modules/app/pages/signin/forgot.vue
@@ -2,6 +2,7 @@
import { object, string, type InferType } from 'yup'
import type { Database } from '@pel/supabase/types'
import type { FormSubmitEvent } from '#ui/types'
+import { lowerString } from '~/utils/commons';
definePageMeta({
name: 'SigninForgot',
@@ -31,7 +32,7 @@ async function onSend(event: FormSubmitEvent) {
loading.value = true
const formSubmit = event.data
- const { data, error } = await auth.resetPasswordForEmail(formSubmit.email, {
+ const { data, error } = await auth.resetPasswordForEmail(lowerString(formSubmit.email), {
redirectTo: `${config.public.baseUrl}/profile/auth/reset`,
})
@@ -59,7 +60,7 @@ async function onSend(event: FormSubmitEvent) {
- C’est partit
+ C’est parti
Si nous avons connaissance de cette adresse, vous devriez recevoir un courriel contenant les instructions pour
récupérer votre compte Force Orange.
diff --git a/modules/app/pages/signin/index.vue b/modules/app/pages/signin/index.vue
index 0c6f2e3..2e30561 100644
--- a/modules/app/pages/signin/index.vue
+++ b/modules/app/pages/signin/index.vue
@@ -17,7 +17,7 @@ const { inputStyle, formGroupStyle } = useFoStyle()
const schema = object({
email: string().lowercase().trim().email('Invalid email').required('Required'),
- password: string().lowercase().trim().required('Required'),
+ password: string().trim().required('Required'),
})
type Schema = InferType
diff --git a/modules/app/utils/commons.ts b/modules/app/utils/commons.ts
new file mode 100644
index 0000000..8bbba9e
--- /dev/null
+++ b/modules/app/utils/commons.ts
@@ -0,0 +1,10 @@
+export const stringToSlug = (str: string) => {
+ return str
+ .toLowerCase()
+ .replace(/ /g, '-')
+ .replace(/[^\w-]+/g, '')
+}
+
+export const lowerString = (str: string) => {
+ return str.trim().toLowerCase()
+}
\ No newline at end of file
diff --git a/modules/shared/app.config.ts b/modules/shared/app.config.ts
index 20eba1f..8896917 100644
--- a/modules/shared/app.config.ts
+++ b/modules/shared/app.config.ts
@@ -1,22 +1,40 @@
+const preset = {
+ border: ''
+}
+
export default defineAppConfig({
ui: {
primary: 'orange',
+ gray: 'slate',
button: {
+ colors: {
+ orange: {
+ solid: 'border-x-2 border-b-2 border-orange-600 dark:border-orange-900 active:border-t-2 active:border-b-0',
+ }
+ },
+ variant: {
+ solid: 'border-x-2 border-b-2 border-{color}-600 dark:border-{color}-900 active:border-t-2 active:border-b-0',
+ },
default: {
- color: 'primary',
+ size: 'md',
},
},
input: {
- base: 'focus:bg-orange-100',
+ colors: {
+ orange: {
+ base: 'dark:focus:bg-orange-800 focus:bg-orange-100',
+ }
+ },
+ base: 'dark:focus:bg-{color}-800 focus:bg-{color}-100',
default: {
size: 'md',
- color: 'primary',
},
},
formGroup: {
label: {
base: 'font-thin'
},
+ help: 'text-gray-400 text-xs leading-tight',
default: {
size: 'md',
},
diff --git a/modules/shared/nuxt.config.ts b/modules/shared/nuxt.config.ts
index 0f39701..0f022b5 100644
--- a/modules/shared/nuxt.config.ts
+++ b/modules/shared/nuxt.config.ts
@@ -5,8 +5,6 @@ const currentDir = dirname(fileURLToPath(import.meta.url))
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
- compatibilityDate: '2024-09-11',
-
devtools: { enabled: true },
extends: ['@nuxt/ui-pro'],
@@ -44,6 +42,10 @@ export default defineNuxtConfig({
},
],
+ ui: {
+ safelistColors: ['orange', 'slate']
+ },
+
fonts: {
families: [
{
diff --git a/modules/shared/tailwind.config.ts b/modules/shared/tailwind.config.ts
index ff86b37..518222c 100644
--- a/modules/shared/tailwind.config.ts
+++ b/modules/shared/tailwind.config.ts
@@ -9,25 +9,25 @@ export default >{
sans: ['Londrina Solid', 'DM Sans', ...defaultTheme.fontFamily.sans]
},
colors: {
- 'orange': {
- '50': '#fffbec',
- '100': '#fff6d3',
- '200': '#ffe9a5',
- '300': '#ffd76d',
- '400': '#ffba32',
- '500': '#ffa20a',
- '600': '#ff8a00',
- '700': '#cc6502',
- '800': '#a14e0b',
- '900': '#82410c',
- '950': '#461f04',
+ orange: {
+ 50: '#fffbec',
+ 100: '#fff6d3',
+ 200: '#ffe9a5',
+ 300: '#ffd76d',
+ 400: '#ffba32',
+ 500: '#ffa20a',
+ 600: '#ff8a00',
+ 700: '#cc6502',
+ 800: '#a14e0b',
+ 900: '#82410c',
+ 950: '#461f04',
},
- 'black': {
- '500': '#303030',
+ black: {
+ 500: '#303030',
}
},
fontSize: {
- 'hlogo': '45px',
+ hlogo: '45px',
},
boxShadow: {
'input-orange': 'inset 0 0 0 1px #ffa20a',
diff --git a/modules/supabase/types.ts b/modules/supabase/types.ts
index 2e9783f..1b04906 100644
--- a/modules/supabase/types.ts
+++ b/modules/supabase/types.ts
@@ -27,7 +27,7 @@ export type Database = {
is_validated: boolean
last_validation_date: string | null
lastname: string | null
- mail: string
+ email: string
pel_editions: number[]
phone_number: number | null
picture_url: string | null
@@ -49,7 +49,7 @@ export type Database = {
is_validated?: boolean
last_validation_date?: string | null
lastname?: string | null
- mail: string
+ email: string
pel_editions?: number[]
phone_number?: number | null
picture_url?: string | null
@@ -71,7 +71,7 @@ export type Database = {
is_validated?: boolean
last_validation_date?: string | null
lastname?: string | null
- mail?: string
+ email?: string
pel_editions?: number[]
phone_number?: number | null
picture_url?: string | null