From ddc91c645604d0d00f0a538a2635db20c89bcae1 Mon Sep 17 00:00:00 2001 From: Alder Whiteford Date: Tue, 18 Jun 2024 01:06:35 -0400 Subject: [PATCH 1/5] oauth impl --- backend/server/server.go | 2 +- frontend/lib/package.json | 2 +- frontend/lib/src/api/authApi.ts | 21 +- frontend/lib/src/types/auth.ts | 9 +- frontend/mobile/package.json | 2 +- .../src/app/(app)/(tabs)/mockClubPageData.ts | 257 ------------------ .../src/app/(auth)/components/wordmark.tsx | 13 - frontend/mobile/src/app/(auth)/index.tsx | 160 ----------- frontend/mobile/src/app/_layout.tsx | 12 +- .../src/app/{(app) => app}/(tabs)/_layout.tsx | 6 +- .../app/{(app) => app}/(tabs)/calendar.tsx | 11 +- .../src/app/{(app) => app}/(tabs)/index.tsx | 0 .../src/app/{(app) => app}/(tabs)/profile.tsx | 4 +- .../mobile/src/app/{(app) => app}/_layout.tsx | 0 .../src/app/{(app) => app}/club/[id].tsx | 18 +- .../src/app/{(app) => app}/club/_layout.tsx | 0 .../club/components/skeleton.tsx | 2 +- .../src/app/{(app) => app}/event/[id].tsx | 10 +- .../src/app/{(app) => app}/event/_layout.tsx | 0 .../{(app) => app}/event/components/about.tsx | 8 +- .../event/components/description.tsx | 2 +- .../event/components/divider.tsx | 2 +- .../event/components/location.tsx | 4 +- .../event/components/overview.tsx | 2 +- .../event/components/register.tsx | 6 +- .../event/components/share-event.tsx | 4 +- .../event/components/skeleton.tsx | 2 +- .../event/components/upcoming-events.tsx | 4 +- .../src/app/{(app) => app}/user/_layout.tsx | 0 .../{(app) => app}/user/components/save.tsx | 2 +- .../src/app/{(app) => app}/user/detail.tsx | 10 +- .../src/app/{(app) => app}/user/interest.tsx | 4 +- .../src/app/{(auth) => auth}/_layout.tsx | 8 + frontend/mobile/src/app/auth/callback.tsx | 30 ++ .../components/notification.tsx | 8 +- .../components/small-text.tsx | 2 +- .../components/splash-screen.tsx | 2 +- frontend/mobile/src/app/auth/index.tsx | 66 +++++ .../assets/fonts/DMSans-Bold.ttf | Bin .../assets/fonts/DMSans-Medium.ttf | Bin .../assets/fonts/DMSans-Regular.ttf | Bin .../assets/svg/Error.svg | 0 .../components/AboutSection/AboutSection.tsx | 0 .../AnimatedImageHeader.tsx | 0 .../components/Arrow/Arrow.tsx | 0 .../components/Box/Box.tsx | 0 .../components/Button/Button.tsx | 6 +- .../components/Calendar/Calendar.tsx | 10 +- .../components/Calendar/Day.tsx | 6 +- .../components/Calendar/DayTimeSection.tsx | 8 +- .../Calendar/parser/calendarParser.ts | 4 +- .../components/ClubIcon/ClubIcon.tsx | 0 .../RecruitmentInfo/ClubRecruitmentInfo.tsx | 0 .../RecruitmentItem/ClubRecruitmentItem.tsx | 0 .../components/Dropdown/Multiselect.tsx | 2 +- .../components/Dropdown/SelectOne.tsx | 2 +- .../components/EventCard/EventCard.tsx | 0 .../components/EventCard/EventCardList.tsx | 0 .../EventCard/EventCardTags/EventCardTags.tsx | 2 +- .../Skeletons/EventCardCalendarSkeleton.tsx | 2 +- .../EventCard/Variants/EventCardBig.tsx | 2 +- .../EventCard/Variants/EventCardCalendar.tsx | 2 +- .../EventCard/Variants/EventCardClub.tsx | 2 +- .../EventCard/Variants/EventCardSmall.tsx | 2 +- .../components/EventCard/index.ts | 0 .../components/EventCard/shared/styles.ts | 2 +- .../components/GlobalLayout/GlobalLayout.tsx | 0 .../components/Icon/Icon.tsx | 0 .../components/Kebab/Kebab.tsx | 0 .../components/PageError/PageError.tsx | 2 +- .../PointOfContactCard/PointOfContactCard.tsx | 0 .../PointofContactsList.tsx | 0 .../components/Preview/Club/ClubPreview.tsx | 0 .../Preview/Club/ClubPreviewSkeleton.tsx | 0 .../components/Preview/Event/EventPreview.tsx | 0 .../Preview/Event/EventPreviewSkeleton.tsx | 0 .../components/Preview/PreviewError.tsx | 0 .../components/Tag/Tag.tsx | 0 .../components/Tag/Tags.tsx | 0 .../components/Text/ExpandableText.tsx | 0 .../components/Text/Text.tsx | 0 .../components/Text/TextVariants.ts | 0 .../components/Textbox/Textbox.tsx | 10 +- .../index.ts | 0 .../shared/border.ts | 0 .../shared/colors.ts | 0 .../shared/spacing.ts | 0 .../shared/types.ts | 0 .../theme.ts | 0 frontend/mobile/src/assets/gif/loading.gif | Bin 0 -> 81572 bytes frontend/mobile/src/store/slices/userSlice.ts | 14 +- frontend/mobile/src/types/index.d.ts | 1 + frontend/mobile/yarn.lock | 8 +- .../old_mobile/app/(app)/(tabs)/discover.tsx | 6 +- frontend/old_mobile/app/_layout.tsx | 6 +- 95 files changed, 241 insertions(+), 553 deletions(-) delete mode 100644 frontend/mobile/src/app/(app)/(tabs)/mockClubPageData.ts delete mode 100644 frontend/mobile/src/app/(auth)/components/wordmark.tsx delete mode 100644 frontend/mobile/src/app/(auth)/index.tsx rename frontend/mobile/src/app/{(app) => app}/(tabs)/_layout.tsx (94%) rename frontend/mobile/src/app/{(app) => app}/(tabs)/calendar.tsx (95%) rename frontend/mobile/src/app/{(app) => app}/(tabs)/index.tsx (100%) rename frontend/mobile/src/app/{(app) => app}/(tabs)/profile.tsx (95%) rename frontend/mobile/src/app/{(app) => app}/_layout.tsx (100%) rename frontend/mobile/src/app/{(app) => app}/club/[id].tsx (93%) rename frontend/mobile/src/app/{(app) => app}/club/_layout.tsx (100%) rename frontend/mobile/src/app/{(app) => app}/club/components/skeleton.tsx (96%) rename frontend/mobile/src/app/{(app) => app}/event/[id].tsx (97%) rename frontend/mobile/src/app/{(app) => app}/event/_layout.tsx (100%) rename frontend/mobile/src/app/{(app) => app}/event/components/about.tsx (90%) rename frontend/mobile/src/app/{(app) => app}/event/components/description.tsx (96%) rename frontend/mobile/src/app/{(app) => app}/event/components/divider.tsx (67%) rename frontend/mobile/src/app/{(app) => app}/event/components/location.tsx (92%) rename frontend/mobile/src/app/{(app) => app}/event/components/overview.tsx (97%) rename frontend/mobile/src/app/{(app) => app}/event/components/register.tsx (97%) rename frontend/mobile/src/app/{(app) => app}/event/components/share-event.tsx (94%) rename frontend/mobile/src/app/{(app) => app}/event/components/skeleton.tsx (96%) rename frontend/mobile/src/app/{(app) => app}/event/components/upcoming-events.tsx (92%) rename frontend/mobile/src/app/{(app) => app}/user/_layout.tsx (100%) rename frontend/mobile/src/app/{(app) => app}/user/components/save.tsx (88%) rename frontend/mobile/src/app/{(app) => app}/user/detail.tsx (96%) rename frontend/mobile/src/app/{(app) => app}/user/interest.tsx (98%) rename frontend/mobile/src/app/{(auth) => auth}/_layout.tsx (62%) create mode 100644 frontend/mobile/src/app/auth/callback.tsx rename frontend/mobile/src/app/{(auth) => auth}/components/notification.tsx (83%) rename frontend/mobile/src/app/{(auth) => auth}/components/small-text.tsx (94%) rename frontend/mobile/src/app/{(auth) => auth}/components/splash-screen.tsx (95%) create mode 100644 frontend/mobile/src/app/auth/index.tsx rename frontend/mobile/src/app/{(design-system) => design-system}/assets/fonts/DMSans-Bold.ttf (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/assets/fonts/DMSans-Medium.ttf (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/assets/fonts/DMSans-Regular.ttf (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/assets/svg/Error.svg (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/AboutSection/AboutSection.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/AnimatedImageHeader/AnimatedImageHeader.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Arrow/Arrow.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Box/Box.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Button/Button.tsx (95%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Calendar/Calendar.tsx (98%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Calendar/Day.tsx (89%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Calendar/DayTimeSection.tsx (91%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Calendar/parser/calendarParser.ts (96%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/ClubIcon/ClubIcon.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/ClubRecruitment/RecruitmentInfo/ClubRecruitmentInfo.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/ClubRecruitment/RecruitmentItem/ClubRecruitmentItem.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Dropdown/Multiselect.tsx (99%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Dropdown/SelectOne.tsx (98%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/EventCard.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/EventCardList.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/EventCardTags/EventCardTags.tsx (93%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/Skeletons/EventCardCalendarSkeleton.tsx (97%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/Variants/EventCardBig.tsx (97%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/Variants/EventCardCalendar.tsx (98%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/Variants/EventCardClub.tsx (97%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/Variants/EventCardSmall.tsx (96%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/index.ts (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/EventCard/shared/styles.ts (71%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/GlobalLayout/GlobalLayout.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Icon/Icon.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Kebab/Kebab.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/PageError/PageError.tsx (92%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/PointOfContactCard/PointOfContactCard.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/PointOfContactCard/PointofContactsList.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Preview/Club/ClubPreview.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Preview/Club/ClubPreviewSkeleton.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Preview/Event/EventPreview.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Preview/Event/EventPreviewSkeleton.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Preview/PreviewError.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Tag/Tag.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Tag/Tags.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Text/ExpandableText.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Text/Text.tsx (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Text/TextVariants.ts (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/components/Textbox/Textbox.tsx (84%) rename frontend/mobile/src/app/{(design-system) => design-system}/index.ts (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/shared/border.ts (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/shared/colors.ts (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/shared/spacing.ts (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/shared/types.ts (100%) rename frontend/mobile/src/app/{(design-system) => design-system}/theme.ts (100%) create mode 100644 frontend/mobile/src/assets/gif/loading.gif create mode 100644 frontend/mobile/src/types/index.d.ts diff --git a/backend/server/server.go b/backend/server/server.go index 3896d0f9b..9dc0069bd 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -58,7 +58,7 @@ func Init(db *gorm.DB, stores *store.Stores, integrations integrations.Integrati applicationURL := settings.Application.ApplicationURL() - msftProvider := msft.New(settings.Microsft.Key, settings.Microsft.Secret, fmt.Sprintf("%s/api/v1/auth/microsoftonline/callback", applicationURL), settings.Microsft.Tenant) + msftProvider := msft.New(settings.Microsft.Key, settings.Microsft.Secret, "myapp://auth/callback", settings.Microsft.Tenant) googProvider := goog.New(settings.Google.Key, settings.Google.Secret, fmt.Sprintf("%s/api/v1/auth/google/callback", applicationURL)) authMiddleware := authMiddleware.New( diff --git a/frontend/lib/package.json b/frontend/lib/package.json index fd4707354..cb1bacb53 100644 --- a/frontend/lib/package.json +++ b/frontend/lib/package.json @@ -1,6 +1,6 @@ { "name": "@generatesac/lib", - "version": "0.0.171", + "version": "0.0.177", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/frontend/lib/src/api/authApi.ts b/frontend/lib/src/api/authApi.ts index e16cd6fef..6ebc26805 100644 --- a/frontend/lib/src/api/authApi.ts +++ b/frontend/lib/src/api/authApi.ts @@ -1,5 +1,4 @@ -import { LoginRequestBody, RefreshTokenRequestBody } from "../types/auth"; -import { User, userSchema } from "../types/user"; +import { LoginResponse, RefreshTokenRequestBody } from "../types/auth"; import { EmailRequestBody, VerifyEmailRequestBody, @@ -11,14 +10,20 @@ const AUTH_API_BASE_URL = "/auth"; export const authApi = baseApi.injectEndpoints({ endpoints: (builder) => ({ - login: builder.mutation({ - query: (body) => ({ + login: builder.query({ + query: () => ({ url: `${AUTH_API_BASE_URL}/login`, - method: "POST", - body, + method: "GET", + responseHandler: 'text', }), - transformResponse: (response: User) => { - return userSchema.parse(response); + transformResponse: async (_, meta) => { + const redirectUri = meta?.response?.headers.get("Redirect") as string; + const sac_session = meta?.response?.headers.get("_sac_session") as string; + + return { + redirect_uri: redirectUri, + sac_session, + } }, }), logout: builder.mutation({ diff --git a/frontend/lib/src/types/auth.ts b/frontend/lib/src/types/auth.ts index e45d7af5f..0a5114fdb 100644 --- a/frontend/lib/src/types/auth.ts +++ b/frontend/lib/src/types/auth.ts @@ -1,9 +1,8 @@ import { z } from "zod"; -// Schemas: -export const loginRequestBodySchema = z.object({ - email: z.string().email(), - password: z.string().min(8), +export const loginResponseSchema = z.object({ + redirect_uri: z.string(), + sac_session: z.string(), }); export const updatePasswordRequestBodySchema = z.object({ @@ -21,7 +20,7 @@ export const tokensSchema = z.object({ }); // Types: -export type LoginRequestBody = z.infer; +export type LoginResponse = z.infer; export type UpdatePasswordRequestBody = z.infer< typeof updatePasswordRequestBodySchema >; diff --git a/frontend/mobile/package.json b/frontend/mobile/package.json index d2ee424e5..37b600937 100644 --- a/frontend/mobile/package.json +++ b/frontend/mobile/package.json @@ -25,7 +25,7 @@ "@fortawesome/free-solid-svg-icons": "^6.5.2", "@fortawesome/react-fontawesome": "^0.2.2", "@fortawesome/react-native-fontawesome": "^0.3.2", - "@generatesac/lib": "0.0.171", + "@generatesac/lib": "0.0.177", "@gorhom/bottom-sheet": "^4.6.3", "@hookform/resolvers": "^3.4.2", "@react-native-async-storage/async-storage": "^1.23.1", diff --git a/frontend/mobile/src/app/(app)/(tabs)/mockClubPageData.ts b/frontend/mobile/src/app/(app)/(tabs)/mockClubPageData.ts deleted file mode 100644 index 8e276f166..000000000 --- a/frontend/mobile/src/app/(app)/(tabs)/mockClubPageData.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { Club, Contact, Event, PointOfContact, Tag } from '@generatesac/lib'; - -const mockClub: Club = { - id: '1', - name: 'Mock Club', - preview: 'This is a mock club for demonstration purposes.', - description: - 'A mock club that serves as an example for the ClubPage component.', - is_recruiting: true, - recruitment_cycle: 'fall', - recruitment_type: 'application', - application_link: 'https://example.com/apply', - num_members: 50, - created_at: new Date(), - updated_at: new Date(), - logo: 'https://example.com/logo.png', - weekly_time_committment: 5, - one_word_to_describe_us: 'Innovative' -}; - -const mockTags: Tag[] = [ - { - id: '1', - name: 'Technology', - category_id: '1', - created_at: new Date(), - updated_at: new Date() - }, - { - id: '2', - name: 'Community', - category_id: '2', - created_at: new Date(), - updated_at: new Date() - }, - { - id: '3', - name: 'Social', - category_id: '3', - created_at: new Date(), - updated_at: new Date() - }, - { - id: '4', - name: 'Professional', - category_id: '4', - created_at: new Date(), - updated_at: new Date() - }, - { - id: '5', - name: 'Academic', - category_id: '5', - created_at: new Date(), - updated_at: new Date() - } -]; - -const mockEvents: Event[] = [ - { - id: '1', - name: 'Mock Event 1', - preview: 'This is the first mock event.', - content: 'Details about the first mock event.', - start_time: new Date(), - end_time: new Date(), - location: 'Online', - event_type: 'open', - is_recurring: false, - created_at: new Date(), - updated_at: new Date(), - host: 'Mock Host 1', - meeting_link: 'https://example.com/meeting1' - }, - { - id: '2', - name: 'Mock Event 2', - preview: 'This is the second mock event.', - content: 'Details about the second mock event.', - start_time: new Date(), - end_time: new Date(), - location: 'Offline', - event_type: 'membersOnly', - is_recurring: true, - created_at: new Date(), - updated_at: new Date(), - host: 'Mock Host 2', - meeting_link: 'https://example.com/meeting2' - }, - { - id: '3', - name: 'Mock Event 3', - preview: 'This is the third mock event.', - content: 'Details about the third mock event.', - start_time: new Date(), - end_time: new Date(), - location: 'Online', - event_type: 'open', - is_recurring: false, - created_at: new Date(), - updated_at: new Date(), - host: 'Mock Host 3', - meeting_link: 'https://example.com/meeting3' - }, - { - id: '4', - name: 'Mock Event 4', - preview: 'This is the fourth mock event.', - content: 'Details about the fourth mock event.', - start_time: new Date(), - end_time: new Date(), - location: 'Offline', - event_type: 'membersOnly', - is_recurring: true, - created_at: new Date(), - updated_at: new Date(), - host: 'Mock Host 4', - meeting_link: 'https://example.com/meeting4' - }, - { - id: '5', - name: 'Mock Event 5', - preview: 'This is the fifth mock event.', - content: 'Details about the fifth mock event.', - start_time: new Date(), - end_time: new Date(), - location: 'Online', - event_type: 'open', - is_recurring: false, - created_at: new Date(), - updated_at: new Date(), - host: 'Mock Host 5', - meeting_link: 'https://example.com/meeting5' - } -]; - -const mockContacts: Contact[] = [ - { - id: '1', - type: 'email', - content: 'contact@example.com', - created_at: new Date(), - updated_at: new Date() - }, - { - id: '2', - type: 'discord', - content: 'https://discord.gg/example', - created_at: new Date(), - updated_at: new Date() - } -]; - -const pointOfContactMocks: PointOfContact[] = [ - { - name: 'Jane Smith', - email: 'jane.smith@example.com', - position: 'Director', - photo_file: { - owner_id: 'd4f5a6e7-8b9c-10d1-1121-314151617181', - owner_type: 'user', - file_name: 'photo1.jpg', - file_type: 'image/jpeg', - file_size: 2048, - file_url: '/photos/photo1.jpg', - object_key: 'photos/photo1.jpg', - id: '12345', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - id: '54321', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - { - name: 'John Doe', - email: 'john.doe@example.com', - position: 'Manager', - photo_file: { - owner_id: 'd4f5a6e7-8b9c-10d1-1121-314151617182', - owner_type: 'user', - file_name: 'photo2.jpg', - file_type: 'image/jpeg', - file_size: 1024, - file_url: '/photos/photo2.jpg', - object_key: 'photos/photo2.jpg', - id: '12346', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - id: '54322', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - { - name: 'Alice Johnson', - email: 'alice.johnson@example.com', - position: 'Team Lead', - photo_file: { - owner_id: 'd4f5a6e7-8b9c-10d1-1121-314151617183', - owner_type: 'user', - file_name: 'photo3.jpg', - file_type: 'image/jpeg', - file_size: 3072, - file_url: '/photos/photo3.jpg', - object_key: 'photos/photo3.jpg', - id: '12347', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - id: '54323', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - { - name: 'Bob Brown', - email: 'bob.brown@example.com', - position: 'Senior Developer', - photo_file: { - owner_id: 'd4f5a6e7-8b9c-10d1-1121-314151617184', - owner_type: 'user', - file_name: 'photo4.jpg', - file_type: 'image/jpeg', - file_size: 4096, - file_url: '/photos/photo4.jpg', - object_key: 'photos/photo4.jpg', - id: '12348', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - id: '54324', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - { - name: 'Clara White', - email: 'clara.white@example.com', - position: 'Product Manager', - photo_file: { - owner_id: 'd4f5a6e7-8b9c-10d1-1121-314151617185', - owner_type: 'user', - file_name: 'photo5.jpg', - file_type: 'image/jpeg', - file_size: 5120, - file_url: '/photos/photo5.jpg', - object_key: 'photos/photo5.jpg', - id: '12349', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - }, - id: '54325', - created_at: new Date('2023-05-01T00:00:00Z'), - updated_at: new Date('2023-05-02T00:00:00Z') - } -]; - -export { mockClub, mockTags, mockEvents, mockContacts, pointOfContactMocks }; diff --git a/frontend/mobile/src/app/(auth)/components/wordmark.tsx b/frontend/mobile/src/app/(auth)/components/wordmark.tsx deleted file mode 100644 index 1438c2242..000000000 --- a/frontend/mobile/src/app/(auth)/components/wordmark.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Text } from '@/src/app/(design-system)'; - -interface WordmarkProps { - color?: 'black' | 'white'; -} - -export const Wordmark: React.FC = ({ color = 'black' }) => { - return ( - - Wordmark - - ); -}; diff --git a/frontend/mobile/src/app/(auth)/index.tsx b/frontend/mobile/src/app/(auth)/index.tsx deleted file mode 100644 index 870d17110..000000000 --- a/frontend/mobile/src/app/(auth)/index.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import React, { useRef, useState } from 'react'; -import { - Animated, - Dimensions, - ScrollView, - TouchableOpacity -} from 'react-native'; - -import { Stack, router } from 'expo-router'; - -import { - faCalendarDays, - faMagnifyingGlass, - faUserPlus -} from '@fortawesome/free-solid-svg-icons'; - -import { Box, Text } from '../(design-system)'; -import { Button } from '../(design-system)'; -import { Screen, ScreenProps } from './components/splash-screen'; -import { Wordmark } from './components/wordmark'; - -const WelcomePage = () => { - const [screen, setScreen] = useState(0); - const scrollX = useRef(new Animated.Value(0)).current; - const scrollViewRef = useRef(null); - - const screens: ScreenProps[] = [ - { - title: 'Discover clubs & events', - description: - 'Explore clubs and events tailored to your interests and searches', - icon: faMagnifyingGlass - }, - { - title: 'Follow & join clubs', - description: - 'Join clubs and be in the know on their upcoming events and latest news', - icon: faUserPlus - }, - { - title: 'Add events to your calendar', - description: - 'Keep track of all your upcoming events by adding them to your calendar', - icon: faCalendarDays - } - ]; - - const { width } = Dimensions.get('window'); - const handleNext = () => { - if (screen < screens.length - 1) { - setScreen(screen + 1); - scrollViewRef.current?.scrollTo({ - x: width * (screen + 1), - animated: true - }); - } else { - router.push('/(app)/'); - } - }; - - return ( - - , - headerRight: () => ( - router.push('/(app)/')} - > - Skip - - ) - }} - /> - - - - {screens.map((screenItem, index) => ( - - - - ))} - - - - - {screens.map((_, i) => { - const fillWidth = scrollX.interpolate({ - inputRange: [ - width * (i - 1), - width * i, - width * (i + 1) - ], - outputRange: [0, 20, 20], - extrapolate: 'clamp' - }) as Animated.AnimatedInterpolation; - return ( - - - - ); - })} - - - - - - ); -}; - -export default WelcomePage; diff --git a/frontend/mobile/src/app/_layout.tsx b/frontend/mobile/src/app/_layout.tsx index f35b22cc3..4ee52f3b9 100644 --- a/frontend/mobile/src/app/_layout.tsx +++ b/frontend/mobile/src/app/_layout.tsx @@ -13,7 +13,7 @@ import { ThemeProvider } from '@shopify/restyle'; import usePreview from '../hooks/usePreview'; import StoreProvider from '../store/StoreProvider'; import { useAppSelector } from '../store/store'; -import { ClubPreview, EventPreview, theme } from './(design-system)'; +import { ClubPreview, EventPreview, theme } from './design-system'; export { ErrorBoundary } from 'expo-router'; @@ -33,10 +33,10 @@ const InitalLayout = () => { } = usePreview(); useEffect(() => { - if (!accessToken) { - router.push('/(app)/'); + if (accessToken) { + router.push('/app/'); } else { - router.push('/(app)/profile'); + router.push('/auth/'); } }, [accessToken]); @@ -44,8 +44,8 @@ const InitalLayout = () => { <> - - + + { return ( diff --git a/frontend/mobile/src/app/(app)/event/[id].tsx b/frontend/mobile/src/app/app/event/[id].tsx similarity index 97% rename from frontend/mobile/src/app/(app)/event/[id].tsx rename to frontend/mobile/src/app/app/event/[id].tsx index e867f04f6..1ada97927 100644 --- a/frontend/mobile/src/app/(app)/event/[id].tsx +++ b/frontend/mobile/src/app/app/event/[id].tsx @@ -12,15 +12,15 @@ import { Stack, useLocalSearchParams } from 'expo-router'; import { EventType } from '@generatesac/lib'; import BottomSheet from '@gorhom/bottom-sheet'; -import { Arrow, Box, KebabMenu } from '@/src/app/(design-system)'; -import { SACColors } from '@/src/app/(design-system)'; -import { Button } from '@/src/app/(design-system)/components/Button/Button'; +import { Arrow, Box, KebabMenu } from '@/src/app/design-system'; +import { SACColors } from '@/src/app/design-system'; +import { Button } from '@/src/app/design-system/components/Button/Button'; import { description, events, tags } from '@/src/consts/event-page'; import useEvent from '@/src/hooks/useEvent'; import { useAppSelector } from '@/src/store/store'; -import AnimatedImageHeader from '../../(design-system)/components/AnimatedImageHeader/AnimatedImageHeader'; -import PageError from '../../(design-system)/components/PageError/PageError'; +import AnimatedImageHeader from '../../design-system/components/AnimatedImageHeader/AnimatedImageHeader'; +import PageError from '../../design-system/components/PageError/PageError'; import { AboutEvent } from './components/about'; import { Description } from './components/description'; import { Location } from './components/location'; diff --git a/frontend/mobile/src/app/(app)/event/_layout.tsx b/frontend/mobile/src/app/app/event/_layout.tsx similarity index 100% rename from frontend/mobile/src/app/(app)/event/_layout.tsx rename to frontend/mobile/src/app/app/event/_layout.tsx diff --git a/frontend/mobile/src/app/(app)/event/components/about.tsx b/frontend/mobile/src/app/app/event/components/about.tsx similarity index 90% rename from frontend/mobile/src/app/(app)/event/components/about.tsx rename to frontend/mobile/src/app/app/event/components/about.tsx index 442237dd6..2f8cfc61b 100644 --- a/frontend/mobile/src/app/(app)/event/components/about.tsx +++ b/frontend/mobile/src/app/app/event/components/about.tsx @@ -11,11 +11,11 @@ import { SACColors, Text, textColorVariants -} from '@/src/app/(design-system)'; -import { AboutSection } from '@/src/app/(design-system)/components/AboutSection/AboutSection'; -import { Button } from '@/src/app/(design-system)/components/Button/Button'; +} from '@/src/app/design-system'; +import { AboutSection } from '@/src/app/design-system/components/AboutSection/AboutSection'; +import { Button } from '@/src/app/design-system/components/Button/Button'; -import { PageTags } from '../../../(design-system)/components/Tag/Tags'; +import { PageTags } from '../../../design-system/components/Tag/Tags'; interface AboutEventProps { tags: Tag[]; diff --git a/frontend/mobile/src/app/(app)/event/components/description.tsx b/frontend/mobile/src/app/app/event/components/description.tsx similarity index 96% rename from frontend/mobile/src/app/(app)/event/components/description.tsx rename to frontend/mobile/src/app/app/event/components/description.tsx index fb6d0b3dc..a1d4c012f 100644 --- a/frontend/mobile/src/app/(app)/event/components/description.tsx +++ b/frontend/mobile/src/app/app/event/components/description.tsx @@ -2,7 +2,7 @@ import React, { forwardRef, useCallback } from 'react'; import BottomSheet, { BottomSheetBackdrop } from '@gorhom/bottom-sheet'; -import { Box, Text } from '@/src/app/(design-system)'; +import { Box, Text } from '@/src/app/design-system'; import { Divider } from './divider'; diff --git a/frontend/mobile/src/app/(app)/event/components/divider.tsx b/frontend/mobile/src/app/app/event/components/divider.tsx similarity index 67% rename from frontend/mobile/src/app/(app)/event/components/divider.tsx rename to frontend/mobile/src/app/app/event/components/divider.tsx index a824e97bc..d489c31bb 100644 --- a/frontend/mobile/src/app/(app)/event/components/divider.tsx +++ b/frontend/mobile/src/app/app/event/components/divider.tsx @@ -1,4 +1,4 @@ -import { Box } from '@/src/app/(design-system)'; +import { Box } from '@/src/app/design-system'; export const Divider = () => { return ; diff --git a/frontend/mobile/src/app/(app)/event/components/location.tsx b/frontend/mobile/src/app/app/event/components/location.tsx similarity index 92% rename from frontend/mobile/src/app/(app)/event/components/location.tsx rename to frontend/mobile/src/app/app/event/components/location.tsx index 779599655..473238879 100644 --- a/frontend/mobile/src/app/(app)/event/components/location.tsx +++ b/frontend/mobile/src/app/app/event/components/location.tsx @@ -1,8 +1,8 @@ import { Linking, Platform } from 'react-native'; import MapView, { Marker } from 'react-native-maps'; -import { Text } from '@/src/app/(design-system)'; -import { Box } from '@/src/app/(design-system)'; +import { Text } from '@/src/app/design-system'; +import { Box } from '@/src/app/design-system'; interface LocationProps { location: string; diff --git a/frontend/mobile/src/app/(app)/event/components/overview.tsx b/frontend/mobile/src/app/app/event/components/overview.tsx similarity index 97% rename from frontend/mobile/src/app/(app)/event/components/overview.tsx rename to frontend/mobile/src/app/app/event/components/overview.tsx index b26a8d40d..ebf44449c 100644 --- a/frontend/mobile/src/app/(app)/event/components/overview.tsx +++ b/frontend/mobile/src/app/app/event/components/overview.tsx @@ -9,7 +9,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'; import { EventType } from '@generatesac/lib'; import { Avatar } from '@rneui/base'; -import { Box, Colors, SACColors, Text } from '@/src/app/(design-system)'; +import { Box, Colors, SACColors, Text } from '@/src/app/design-system'; import { setClubId, setClubShouldPreview } from '@/src/store/slices/clubSlice'; import { useAppDispatch } from '@/src/store/store'; import { firstLetterUppercase } from '@/src/utils/string'; diff --git a/frontend/mobile/src/app/(app)/event/components/register.tsx b/frontend/mobile/src/app/app/event/components/register.tsx similarity index 97% rename from frontend/mobile/src/app/(app)/event/components/register.tsx rename to frontend/mobile/src/app/app/event/components/register.tsx index ec3da04a0..395867f26 100644 --- a/frontend/mobile/src/app/(app)/event/components/register.tsx +++ b/frontend/mobile/src/app/app/event/components/register.tsx @@ -7,9 +7,9 @@ import BottomSheet, { BottomSheetBackdrop } from '@gorhom/bottom-sheet'; import { zodResolver } from '@hookform/resolvers/zod'; import { ZodError, z } from 'zod'; -import { Box, Text } from '@/src/app/(design-system)'; -import { SelectOne } from '@/src/app/(design-system)'; -import { Button } from '@/src/app/(design-system)/components/Button/Button'; +import { Box, Text } from '@/src/app/design-system'; +import { SelectOne } from '@/src/app/design-system'; +import { Button } from '@/src/app/design-system/components/Button/Button'; import { CalendarLink } from '@/src/types/calendarLink'; import { Item } from '@/src/types/item'; import { createGoogleCalendarLink } from '@/src/utils/string'; diff --git a/frontend/mobile/src/app/(app)/event/components/share-event.tsx b/frontend/mobile/src/app/app/event/components/share-event.tsx similarity index 94% rename from frontend/mobile/src/app/(app)/event/components/share-event.tsx rename to frontend/mobile/src/app/app/event/components/share-event.tsx index 556c03525..d8716c2b4 100644 --- a/frontend/mobile/src/app/(app)/event/components/share-event.tsx +++ b/frontend/mobile/src/app/app/event/components/share-event.tsx @@ -3,8 +3,8 @@ import React, { forwardRef, useCallback, useState } from 'react'; import BottomSheet, { BottomSheetBackdrop } from '@gorhom/bottom-sheet'; import Clipboard from '@react-native-community/clipboard'; -import { Box, Text } from '@/src/app/(design-system)'; -import { Button } from '@/src/app/(design-system)/components/Button/Button'; +import { Box, Text } from '@/src/app/design-system'; +import { Button } from '@/src/app/design-system/components/Button/Button'; import { Divider } from './divider'; diff --git a/frontend/mobile/src/app/(app)/event/components/skeleton.tsx b/frontend/mobile/src/app/app/event/components/skeleton.tsx similarity index 96% rename from frontend/mobile/src/app/(app)/event/components/skeleton.tsx rename to frontend/mobile/src/app/app/event/components/skeleton.tsx index 5f16364f1..029b52e46 100644 --- a/frontend/mobile/src/app/(app)/event/components/skeleton.tsx +++ b/frontend/mobile/src/app/app/event/components/skeleton.tsx @@ -1,6 +1,6 @@ import { Skeleton } from '@rneui/base'; -import { Box, Colors } from '@/src/app/(design-system)'; +import { Box, Colors } from '@/src/app/design-system'; const EventPageSkeleton = () => { return ( diff --git a/frontend/mobile/src/app/(app)/event/components/upcoming-events.tsx b/frontend/mobile/src/app/app/event/components/upcoming-events.tsx similarity index 92% rename from frontend/mobile/src/app/(app)/event/components/upcoming-events.tsx rename to frontend/mobile/src/app/app/event/components/upcoming-events.tsx index aee95962a..d4253a1f1 100644 --- a/frontend/mobile/src/app/(app)/event/components/upcoming-events.tsx +++ b/frontend/mobile/src/app/app/event/components/upcoming-events.tsx @@ -5,8 +5,8 @@ import { router } from 'expo-router'; import { Event } from '@generatesac/lib'; -import { Box, Text } from '@/src/app/(design-system)'; -import { EventCard } from '@/src/app/(design-system)/components/EventCard'; +import { Box, Text } from '@/src/app/design-system'; +import { EventCard } from '@/src/app/design-system/components/EventCard'; interface UpcomingEventsProps { events: Event[]; diff --git a/frontend/mobile/src/app/(app)/user/_layout.tsx b/frontend/mobile/src/app/app/user/_layout.tsx similarity index 100% rename from frontend/mobile/src/app/(app)/user/_layout.tsx rename to frontend/mobile/src/app/app/user/_layout.tsx diff --git a/frontend/mobile/src/app/(app)/user/components/save.tsx b/frontend/mobile/src/app/app/user/components/save.tsx similarity index 88% rename from frontend/mobile/src/app/(app)/user/components/save.tsx rename to frontend/mobile/src/app/app/user/components/save.tsx index 8887906dc..f484d2d5a 100644 --- a/frontend/mobile/src/app/(app)/user/components/save.tsx +++ b/frontend/mobile/src/app/app/user/components/save.tsx @@ -1,6 +1,6 @@ import { TouchableOpacity } from 'react-native-gesture-handler'; -import { Text } from '@/src/app/(design-system)'; +import { Text } from '@/src/app/design-system'; interface SaveProps { onPress: () => void; diff --git a/frontend/mobile/src/app/(app)/user/detail.tsx b/frontend/mobile/src/app/app/user/detail.tsx similarity index 96% rename from frontend/mobile/src/app/(app)/user/detail.tsx rename to frontend/mobile/src/app/app/user/detail.tsx index 5e1fec190..638797ec8 100644 --- a/frontend/mobile/src/app/(app)/user/detail.tsx +++ b/frontend/mobile/src/app/app/user/detail.tsx @@ -7,11 +7,11 @@ import { Stack, router } from 'expo-router'; import { ZodError } from 'zod'; -import { Box, Spacing } from '@/src/app/(design-system)'; -import { MultiSelect, SelectOne } from '@/src/app/(design-system)'; -import { Text } from '@/src/app/(design-system)'; -import { Arrow } from '@/src/app/(design-system)'; -import { TextBox } from '@/src/app/(design-system)/components/Textbox/Textbox'; +import { Box, Spacing } from '@/src/app/design-system'; +import { MultiSelect, SelectOne } from '@/src/app/design-system'; +import { Text } from '@/src/app/design-system'; +import { Arrow } from '@/src/app/design-system'; +import { TextBox } from '@/src/app/design-system/components/Textbox/Textbox'; import { COLLEGE, GRADUATION_CYCLE, diff --git a/frontend/mobile/src/app/(app)/user/interest.tsx b/frontend/mobile/src/app/app/user/interest.tsx similarity index 98% rename from frontend/mobile/src/app/(app)/user/interest.tsx rename to frontend/mobile/src/app/app/user/interest.tsx index 146a9324b..f3813d1e1 100644 --- a/frontend/mobile/src/app/(app)/user/interest.tsx +++ b/frontend/mobile/src/app/app/user/interest.tsx @@ -8,8 +8,8 @@ import { Stack, router } from 'expo-router'; import { Category, Tag, categoryApi, tagApi } from '@generatesac/lib'; import { ZodError } from 'zod'; -import { Arrow, Box, Spacing, Text } from '@/src/app/(design-system)'; -import { Tag as TagComponent } from '@/src/app/(design-system)'; +import { Arrow, Box, Spacing, Text } from '@/src/app/design-system'; +import { Tag as TagComponent } from '@/src/app/design-system'; import { formatCategoryOrTag } from '@/src/utils/string'; import { Save } from './components/save'; diff --git a/frontend/mobile/src/app/(auth)/_layout.tsx b/frontend/mobile/src/app/auth/_layout.tsx similarity index 62% rename from frontend/mobile/src/app/(auth)/_layout.tsx rename to frontend/mobile/src/app/auth/_layout.tsx index 303af5423..6c15e6a00 100644 --- a/frontend/mobile/src/app/(auth)/_layout.tsx +++ b/frontend/mobile/src/app/auth/_layout.tsx @@ -13,6 +13,14 @@ const Layout = () => { headerTransparent: true }} /> + ); }; diff --git a/frontend/mobile/src/app/auth/callback.tsx b/frontend/mobile/src/app/auth/callback.tsx new file mode 100644 index 000000000..2b12499aa --- /dev/null +++ b/frontend/mobile/src/app/auth/callback.tsx @@ -0,0 +1,30 @@ +import { Linking } from "react-native"; +import { Box, Text } from "../design-system" +import { useEffect } from "react"; +import { useLocalSearchParams } from "expo-router"; +import { useAppSelector } from "@/src/store/store"; + +const OAuthCallback = () => { + const params = useLocalSearchParams(); + const { sacLoginSession } = useAppSelector((state) => state.user); + + useEffect(() => { + const { code, session_state, state } = params; + console.log(params) + console.log(sacLoginSession); + if (!code || !session_state || !state) { + console.log('failed!') + } + + }, [params]) + + return ( + + + Callback!!!!!!! + + + ) +} + +export default OAuthCallback; \ No newline at end of file diff --git a/frontend/mobile/src/app/(auth)/components/notification.tsx b/frontend/mobile/src/app/auth/components/notification.tsx similarity index 83% rename from frontend/mobile/src/app/(auth)/components/notification.tsx rename to frontend/mobile/src/app/auth/components/notification.tsx index fb238343b..76b1e8070 100644 --- a/frontend/mobile/src/app/(auth)/components/notification.tsx +++ b/frontend/mobile/src/app/auth/components/notification.tsx @@ -3,8 +3,8 @@ import { router } from 'expo-router'; import { faBell } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'; -import { Box, Text } from '../../(design-system)'; -import { Button } from '../../(design-system)/components/Button/Button'; +import { Box, Text } from '../../design-system'; +import { Button } from '../../design-system/components/Button/Button'; export const Notification = () => { return ( @@ -21,7 +21,7 @@ export const Notification = () => { diff --git a/frontend/mobile/src/app/(auth)/components/small-text.tsx b/frontend/mobile/src/app/auth/components/small-text.tsx similarity index 94% rename from frontend/mobile/src/app/(auth)/components/small-text.tsx rename to frontend/mobile/src/app/auth/components/small-text.tsx index 27ea47971..d592c173f 100644 --- a/frontend/mobile/src/app/(auth)/components/small-text.tsx +++ b/frontend/mobile/src/app/auth/components/small-text.tsx @@ -1,6 +1,6 @@ import { TouchableOpacity } from 'react-native-gesture-handler'; -import { Box, Text } from '../../(design-system)'; +import { Box, Text } from '../../design-system'; interface SmallTextProps { first: string; diff --git a/frontend/mobile/src/app/(auth)/components/splash-screen.tsx b/frontend/mobile/src/app/auth/components/splash-screen.tsx similarity index 95% rename from frontend/mobile/src/app/(auth)/components/splash-screen.tsx rename to frontend/mobile/src/app/auth/components/splash-screen.tsx index b7298d330..52d3e0751 100644 --- a/frontend/mobile/src/app/(auth)/components/splash-screen.tsx +++ b/frontend/mobile/src/app/auth/components/splash-screen.tsx @@ -1,7 +1,7 @@ import { IconDefinition } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'; -import { Box, Text } from '../../(design-system)'; +import { Box, Text } from '../../design-system'; export interface ScreenProps { title: string; diff --git a/frontend/mobile/src/app/auth/index.tsx b/frontend/mobile/src/app/auth/index.tsx new file mode 100644 index 000000000..07080c212 --- /dev/null +++ b/frontend/mobile/src/app/auth/index.tsx @@ -0,0 +1,66 @@ +import React, { useEffect } from 'react'; + +import { Box, Button, Text } from '../design-system'; +import { Image, Linking, SafeAreaView } from 'react-native'; +import { GlobalLayout } from '../design-system/components/GlobalLayout/GlobalLayout'; +import { authApi } from '@generatesac/lib'; +import Loading from '@/src/assets/gif/loading.gif'; +import { useLocalSearchParams } from 'expo-router'; +import { useAppDispatch } from '@/src/store/store'; +import { setSacLoginSession } from '@/src/store/slices/userSlice'; + +const WelcomePage = () => { + const [login, { isLoading, error, data }] = authApi.useLazyLoginQuery(); + const dispatch = useAppDispatch(); + const search = useLocalSearchParams(); + console.log(search); + + const handleLogin = async () => { + await login().then(async () => { + if (data) { + dispatch(setSacLoginSession(data.sac_session)); + await Linking.openURL(data.redirect_uri); + } + }) + }; + + return ( + + + + + + Welcome to the + + + Student Activity Calendar + + + + + + + ); +}; + +export default WelcomePage; diff --git a/frontend/mobile/src/app/(design-system)/assets/fonts/DMSans-Bold.ttf b/frontend/mobile/src/app/design-system/assets/fonts/DMSans-Bold.ttf similarity index 100% rename from frontend/mobile/src/app/(design-system)/assets/fonts/DMSans-Bold.ttf rename to frontend/mobile/src/app/design-system/assets/fonts/DMSans-Bold.ttf diff --git a/frontend/mobile/src/app/(design-system)/assets/fonts/DMSans-Medium.ttf b/frontend/mobile/src/app/design-system/assets/fonts/DMSans-Medium.ttf similarity index 100% rename from frontend/mobile/src/app/(design-system)/assets/fonts/DMSans-Medium.ttf rename to frontend/mobile/src/app/design-system/assets/fonts/DMSans-Medium.ttf diff --git a/frontend/mobile/src/app/(design-system)/assets/fonts/DMSans-Regular.ttf b/frontend/mobile/src/app/design-system/assets/fonts/DMSans-Regular.ttf similarity index 100% rename from frontend/mobile/src/app/(design-system)/assets/fonts/DMSans-Regular.ttf rename to frontend/mobile/src/app/design-system/assets/fonts/DMSans-Regular.ttf diff --git a/frontend/mobile/src/app/(design-system)/assets/svg/Error.svg b/frontend/mobile/src/app/design-system/assets/svg/Error.svg similarity index 100% rename from frontend/mobile/src/app/(design-system)/assets/svg/Error.svg rename to frontend/mobile/src/app/design-system/assets/svg/Error.svg diff --git a/frontend/mobile/src/app/(design-system)/components/AboutSection/AboutSection.tsx b/frontend/mobile/src/app/design-system/components/AboutSection/AboutSection.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/AboutSection/AboutSection.tsx rename to frontend/mobile/src/app/design-system/components/AboutSection/AboutSection.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/AnimatedImageHeader/AnimatedImageHeader.tsx b/frontend/mobile/src/app/design-system/components/AnimatedImageHeader/AnimatedImageHeader.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/AnimatedImageHeader/AnimatedImageHeader.tsx rename to frontend/mobile/src/app/design-system/components/AnimatedImageHeader/AnimatedImageHeader.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Arrow/Arrow.tsx b/frontend/mobile/src/app/design-system/components/Arrow/Arrow.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Arrow/Arrow.tsx rename to frontend/mobile/src/app/design-system/components/Arrow/Arrow.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Box/Box.tsx b/frontend/mobile/src/app/design-system/components/Box/Box.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Box/Box.tsx rename to frontend/mobile/src/app/design-system/components/Box/Box.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Button/Button.tsx b/frontend/mobile/src/app/design-system/components/Button/Button.tsx similarity index 95% rename from frontend/mobile/src/app/(design-system)/components/Button/Button.tsx rename to frontend/mobile/src/app/design-system/components/Button/Button.tsx index 3dcce098a..6b97d61ae 100644 --- a/frontend/mobile/src/app/(design-system)/components/Button/Button.tsx +++ b/frontend/mobile/src/app/design-system/components/Button/Button.tsx @@ -4,13 +4,13 @@ import { GestureResponderEvent, TouchableOpacity } from 'react-native'; import { IconDefinition } from '@fortawesome/fontawesome-svg-core'; import { BoxProps, createBox } from '@shopify/restyle'; -import { Text } from '@/src/app/(design-system)/components/Text/Text'; +import { Text } from '@/src/app/design-system/components/Text/Text'; import { SACColors, defaultColor, textColorVariants -} from '@/src/app/(design-system)/shared/colors'; -import { Theme, createStyles } from '@/src/app/(design-system)/theme'; +} from '@/src/app/design-system/shared/colors'; +import { Theme, createStyles } from '@/src/app/design-system/theme'; import { ComponentSizes } from '../../shared/types'; import { Icon } from '../Icon/Icon'; diff --git a/frontend/mobile/src/app/(design-system)/components/Calendar/Calendar.tsx b/frontend/mobile/src/app/design-system/components/Calendar/Calendar.tsx similarity index 98% rename from frontend/mobile/src/app/(design-system)/components/Calendar/Calendar.tsx rename to frontend/mobile/src/app/design-system/components/Calendar/Calendar.tsx index 5b4a9ab78..aeb46f487 100644 --- a/frontend/mobile/src/app/(design-system)/components/Calendar/Calendar.tsx +++ b/frontend/mobile/src/app/design-system/components/Calendar/Calendar.tsx @@ -10,11 +10,11 @@ import { State } from 'react-native-gesture-handler'; -import { Box } from '@/src/app/(design-system)/components/Box/Box'; -import Day from '@/src/app/(design-system)/components/Calendar/Day'; -import { EventSection } from '@/src/app/(design-system)/components/Calendar/DayTimeSection'; -import { EventCardCalendarSkeleton } from '@/src/app/(design-system)/components/EventCard/Skeletons/EventCardCalendarSkeleton'; -import { Spacing } from '@/src/app/(design-system)/shared/spacing'; +import { Box } from '@/src/app/design-system/components/Box/Box'; +import Day from '@/src/app/design-system/components/Calendar/Day'; +import { EventSection } from '@/src/app/design-system/components/Calendar/DayTimeSection'; +import { EventCardCalendarSkeleton } from '@/src/app/design-system/components/EventCard/Skeletons/EventCardCalendarSkeleton'; +import { Spacing } from '@/src/app/design-system/shared/spacing'; type SwipeDirection = 'left' | 'right'; diff --git a/frontend/mobile/src/app/(design-system)/components/Calendar/Day.tsx b/frontend/mobile/src/app/design-system/components/Calendar/Day.tsx similarity index 89% rename from frontend/mobile/src/app/(design-system)/components/Calendar/Day.tsx rename to frontend/mobile/src/app/design-system/components/Calendar/Day.tsx index 7629007ae..7bd95d888 100644 --- a/frontend/mobile/src/app/(design-system)/components/Calendar/Day.tsx +++ b/frontend/mobile/src/app/design-system/components/Calendar/Day.tsx @@ -1,8 +1,8 @@ -import { Box } from '@/src/app/(design-system)/components/Box/Box'; +import { Box } from '@/src/app/design-system/components/Box/Box'; import DayTimeSection, { EventSection -} from '@/src/app/(design-system)/components/Calendar/DayTimeSection'; -import { Text } from '@/src/app/(design-system)/components/Text/Text'; +} from '@/src/app/design-system/components/Calendar/DayTimeSection'; +import { Text } from '@/src/app/design-system/components/Text/Text'; import NoEventsIcon from '@/src/assets/svg/NoSearchResult.svg'; import { formatTime } from '@/src/utils/time'; diff --git a/frontend/mobile/src/app/(design-system)/components/Calendar/DayTimeSection.tsx b/frontend/mobile/src/app/design-system/components/Calendar/DayTimeSection.tsx similarity index 91% rename from frontend/mobile/src/app/(design-system)/components/Calendar/DayTimeSection.tsx rename to frontend/mobile/src/app/design-system/components/Calendar/DayTimeSection.tsx index 861e7e10d..cfbaa2036 100644 --- a/frontend/mobile/src/app/(design-system)/components/Calendar/DayTimeSection.tsx +++ b/frontend/mobile/src/app/design-system/components/Calendar/DayTimeSection.tsx @@ -1,9 +1,9 @@ import { Tag } from '@generatesac/lib'; -import { Box } from '@/src/app/(design-system)/components/Box/Box'; -import { Button } from '@/src/app/(design-system)/components/Button/Button'; -import { EventCard } from '@/src/app/(design-system)/components/EventCard/EventCard'; -import { Text } from '@/src/app/(design-system)/components/Text/Text'; +import { Box } from '@/src/app/design-system/components/Box/Box'; +import { Button } from '@/src/app/design-system/components/Button/Button'; +import { EventCard } from '@/src/app/design-system/components/EventCard/EventCard'; +import { Text } from '@/src/app/design-system/components/Text/Text'; export type EventSectionTimes = { [key: string]: EventSectionData; diff --git a/frontend/mobile/src/app/(design-system)/components/Calendar/parser/calendarParser.ts b/frontend/mobile/src/app/design-system/components/Calendar/parser/calendarParser.ts similarity index 96% rename from frontend/mobile/src/app/(design-system)/components/Calendar/parser/calendarParser.ts rename to frontend/mobile/src/app/design-system/components/Calendar/parser/calendarParser.ts index 60d1e96b3..0a9626804 100644 --- a/frontend/mobile/src/app/(design-system)/components/Calendar/parser/calendarParser.ts +++ b/frontend/mobile/src/app/design-system/components/Calendar/parser/calendarParser.ts @@ -1,10 +1,10 @@ import { EventPreview } from '@generatesac/lib'; -import { DAY_EPOCH_TIME } from '@/src/app/(design-system)/components/Calendar/Calendar'; +import { DAY_EPOCH_TIME } from '@/src/app/design-system/components/Calendar/Calendar'; import { EventCalendarPreview, EventSection -} from '@/src/app/(design-system)/components/Calendar/DayTimeSection'; +} from '@/src/app/design-system/components/Calendar/DayTimeSection'; const eventPreviewImages = [ 'https://storage.googleapis.com/pod_public/1300/165117.jpg', diff --git a/frontend/mobile/src/app/(design-system)/components/ClubIcon/ClubIcon.tsx b/frontend/mobile/src/app/design-system/components/ClubIcon/ClubIcon.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/ClubIcon/ClubIcon.tsx rename to frontend/mobile/src/app/design-system/components/ClubIcon/ClubIcon.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/ClubRecruitment/RecruitmentInfo/ClubRecruitmentInfo.tsx b/frontend/mobile/src/app/design-system/components/ClubRecruitment/RecruitmentInfo/ClubRecruitmentInfo.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/ClubRecruitment/RecruitmentInfo/ClubRecruitmentInfo.tsx rename to frontend/mobile/src/app/design-system/components/ClubRecruitment/RecruitmentInfo/ClubRecruitmentInfo.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/ClubRecruitment/RecruitmentItem/ClubRecruitmentItem.tsx b/frontend/mobile/src/app/design-system/components/ClubRecruitment/RecruitmentItem/ClubRecruitmentItem.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/ClubRecruitment/RecruitmentItem/ClubRecruitmentItem.tsx rename to frontend/mobile/src/app/design-system/components/ClubRecruitment/RecruitmentItem/ClubRecruitmentItem.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Dropdown/Multiselect.tsx b/frontend/mobile/src/app/design-system/components/Dropdown/Multiselect.tsx similarity index 99% rename from frontend/mobile/src/app/(design-system)/components/Dropdown/Multiselect.tsx rename to frontend/mobile/src/app/design-system/components/Dropdown/Multiselect.tsx index ba2c85ec9..e903e89b6 100644 --- a/frontend/mobile/src/app/(design-system)/components/Dropdown/Multiselect.tsx +++ b/frontend/mobile/src/app/design-system/components/Dropdown/Multiselect.tsx @@ -14,7 +14,7 @@ import { } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'; -import ErrorIcon from '@/src/app/(design-system)/assets/svg/Error.svg'; +import ErrorIcon from '@/src/app/design-system/assets/svg/Error.svg'; import { Item } from '@/src/types/item'; import { Border } from '../../shared/border'; diff --git a/frontend/mobile/src/app/(design-system)/components/Dropdown/SelectOne.tsx b/frontend/mobile/src/app/design-system/components/Dropdown/SelectOne.tsx similarity index 98% rename from frontend/mobile/src/app/(design-system)/components/Dropdown/SelectOne.tsx rename to frontend/mobile/src/app/design-system/components/Dropdown/SelectOne.tsx index 4a3685c16..f2e74edc2 100644 --- a/frontend/mobile/src/app/(design-system)/components/Dropdown/SelectOne.tsx +++ b/frontend/mobile/src/app/design-system/components/Dropdown/SelectOne.tsx @@ -4,7 +4,7 @@ import { FlatList, StyleSheet, TouchableOpacity } from 'react-native'; import { faAngleDown, faAngleUp } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'; -import ErrorIcon from '@/src/app/(design-system)/assets/svg/Error.svg'; +import ErrorIcon from '@/src/app/design-system/assets/svg/Error.svg'; import { Item } from '@/src/types/item'; import { Border } from '../../shared/border'; diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/EventCard.tsx b/frontend/mobile/src/app/design-system/components/EventCard/EventCard.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/EventCard/EventCard.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/EventCard.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/EventCardList.tsx b/frontend/mobile/src/app/design-system/components/EventCard/EventCardList.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/EventCard/EventCardList.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/EventCardList.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/EventCardTags/EventCardTags.tsx b/frontend/mobile/src/app/design-system/components/EventCard/EventCardTags/EventCardTags.tsx similarity index 93% rename from frontend/mobile/src/app/(design-system)/components/EventCard/EventCardTags/EventCardTags.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/EventCardTags/EventCardTags.tsx index 4f1d13290..2b2c8ba66 100644 --- a/frontend/mobile/src/app/(design-system)/components/EventCard/EventCardTags/EventCardTags.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/EventCardTags/EventCardTags.tsx @@ -1,6 +1,6 @@ import { Tag } from '@generatesac/lib'; -import { Box, Tag as TagComponent, Text } from '@/src/app/(design-system)'; +import { Box, Tag as TagComponent, Text } from '@/src/app/design-system'; interface EventTagProps { tags: Tag[]; diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/Skeletons/EventCardCalendarSkeleton.tsx b/frontend/mobile/src/app/design-system/components/EventCard/Skeletons/EventCardCalendarSkeleton.tsx similarity index 97% rename from frontend/mobile/src/app/(design-system)/components/EventCard/Skeletons/EventCardCalendarSkeleton.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/Skeletons/EventCardCalendarSkeleton.tsx index bb639395e..387a1e4d7 100644 --- a/frontend/mobile/src/app/(design-system)/components/EventCard/Skeletons/EventCardCalendarSkeleton.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/Skeletons/EventCardCalendarSkeleton.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Skeleton } from '@rneui/base'; -import { Box, Colors, createStyles } from '@/src/app/(design-system)'; +import { Box, Colors, createStyles } from '@/src/app/design-system'; export const EventCardCalendarSkeleton = () => { return ( diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardBig.tsx b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardBig.tsx similarity index 97% rename from frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardBig.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardBig.tsx index 1edd303d7..32c9eea06 100644 --- a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardBig.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardBig.tsx @@ -6,7 +6,7 @@ import { router } from 'expo-router'; import { Image } from '@rneui/base'; -import { Box, Text } from '@/src/app/(design-system)'; +import { Box, Text } from '@/src/app/design-system'; import { createOptions, eventTime } from '@/src/utils/time'; interface EventCardBigProps { diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardCalendar.tsx b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardCalendar.tsx similarity index 98% rename from frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardCalendar.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardCalendar.tsx index 32047c78b..77c5f5df0 100644 --- a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardCalendar.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardCalendar.tsx @@ -4,7 +4,7 @@ import { TouchableOpacity } from 'react-native'; import { Tag } from '@generatesac/lib'; import { Avatar, Image } from '@rneui/base'; -import { Box, Text, createStyles } from '@/src/app/(design-system)'; +import { Box, Text, createStyles } from '@/src/app/design-system'; import { setEventId, setEventShouldPreview diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardClub.tsx b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardClub.tsx similarity index 97% rename from frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardClub.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardClub.tsx index f95013a68..f94ba5084 100644 --- a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardClub.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardClub.tsx @@ -6,7 +6,7 @@ import { router } from 'expo-router'; import { Tag } from '@generatesac/lib'; import { Avatar, Image } from '@rneui/base'; -import { Box, Text, createStyles } from '@/src/app/(design-system)'; +import { Box, Text, createStyles } from '@/src/app/design-system'; import { createOptions, eventTime } from '@/src/utils/time'; import { EventTags } from '../EventCardTags/EventCardTags'; diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardSmall.tsx b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardSmall.tsx similarity index 96% rename from frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardSmall.tsx rename to frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardSmall.tsx index 740e71105..8375239ad 100644 --- a/frontend/mobile/src/app/(design-system)/components/EventCard/Variants/EventCardSmall.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardSmall.tsx @@ -6,7 +6,7 @@ import { router } from 'expo-router'; import { Image } from '@rneui/base'; -import { Box, Text } from '@/src/app/(design-system)'; +import { Box, Text } from '@/src/app/design-system'; import { createOptions, eventTime } from '@/src/utils/time'; interface EventCardSmallProps { diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/index.ts b/frontend/mobile/src/app/design-system/components/EventCard/index.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/EventCard/index.ts rename to frontend/mobile/src/app/design-system/components/EventCard/index.ts diff --git a/frontend/mobile/src/app/(design-system)/components/EventCard/shared/styles.ts b/frontend/mobile/src/app/design-system/components/EventCard/shared/styles.ts similarity index 71% rename from frontend/mobile/src/app/(design-system)/components/EventCard/shared/styles.ts rename to frontend/mobile/src/app/design-system/components/EventCard/shared/styles.ts index f85cc2fe4..a1b679360 100644 --- a/frontend/mobile/src/app/(design-system)/components/EventCard/shared/styles.ts +++ b/frontend/mobile/src/app/design-system/components/EventCard/shared/styles.ts @@ -1,4 +1,4 @@ -import { createStyles } from '@/src/app/(design-system)/theme'; +import { createStyles } from '@/src/app/design-system/theme'; export const sharedStyles = createStyles({ clubInfoContainer: { diff --git a/frontend/mobile/src/app/(design-system)/components/GlobalLayout/GlobalLayout.tsx b/frontend/mobile/src/app/design-system/components/GlobalLayout/GlobalLayout.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/GlobalLayout/GlobalLayout.tsx rename to frontend/mobile/src/app/design-system/components/GlobalLayout/GlobalLayout.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Icon/Icon.tsx b/frontend/mobile/src/app/design-system/components/Icon/Icon.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Icon/Icon.tsx rename to frontend/mobile/src/app/design-system/components/Icon/Icon.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Kebab/Kebab.tsx b/frontend/mobile/src/app/design-system/components/Kebab/Kebab.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Kebab/Kebab.tsx rename to frontend/mobile/src/app/design-system/components/Kebab/Kebab.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/PageError/PageError.tsx b/frontend/mobile/src/app/design-system/components/PageError/PageError.tsx similarity index 92% rename from frontend/mobile/src/app/(design-system)/components/PageError/PageError.tsx rename to frontend/mobile/src/app/design-system/components/PageError/PageError.tsx index 5fcb1ef28..1d444598f 100644 --- a/frontend/mobile/src/app/(design-system)/components/PageError/PageError.tsx +++ b/frontend/mobile/src/app/design-system/components/PageError/PageError.tsx @@ -2,7 +2,7 @@ import { SafeAreaView } from 'react-native'; import { faArrowsRotate } from '@fortawesome/free-solid-svg-icons'; -import { Box, Button, Spacing, Text } from '@/src/app/(design-system)'; +import { Box, Button, Spacing, Text } from '@/src/app/design-system'; type EventPageErrorProps = { refetch: React.Dispatch>; diff --git a/frontend/mobile/src/app/(design-system)/components/PointOfContactCard/PointOfContactCard.tsx b/frontend/mobile/src/app/design-system/components/PointOfContactCard/PointOfContactCard.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/PointOfContactCard/PointOfContactCard.tsx rename to frontend/mobile/src/app/design-system/components/PointOfContactCard/PointOfContactCard.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/PointOfContactCard/PointofContactsList.tsx b/frontend/mobile/src/app/design-system/components/PointOfContactCard/PointofContactsList.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/PointOfContactCard/PointofContactsList.tsx rename to frontend/mobile/src/app/design-system/components/PointOfContactCard/PointofContactsList.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Preview/Club/ClubPreview.tsx b/frontend/mobile/src/app/design-system/components/Preview/Club/ClubPreview.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Preview/Club/ClubPreview.tsx rename to frontend/mobile/src/app/design-system/components/Preview/Club/ClubPreview.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Preview/Club/ClubPreviewSkeleton.tsx b/frontend/mobile/src/app/design-system/components/Preview/Club/ClubPreviewSkeleton.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Preview/Club/ClubPreviewSkeleton.tsx rename to frontend/mobile/src/app/design-system/components/Preview/Club/ClubPreviewSkeleton.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Preview/Event/EventPreview.tsx b/frontend/mobile/src/app/design-system/components/Preview/Event/EventPreview.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Preview/Event/EventPreview.tsx rename to frontend/mobile/src/app/design-system/components/Preview/Event/EventPreview.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Preview/Event/EventPreviewSkeleton.tsx b/frontend/mobile/src/app/design-system/components/Preview/Event/EventPreviewSkeleton.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Preview/Event/EventPreviewSkeleton.tsx rename to frontend/mobile/src/app/design-system/components/Preview/Event/EventPreviewSkeleton.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Preview/PreviewError.tsx b/frontend/mobile/src/app/design-system/components/Preview/PreviewError.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Preview/PreviewError.tsx rename to frontend/mobile/src/app/design-system/components/Preview/PreviewError.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Tag/Tag.tsx b/frontend/mobile/src/app/design-system/components/Tag/Tag.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Tag/Tag.tsx rename to frontend/mobile/src/app/design-system/components/Tag/Tag.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Tag/Tags.tsx b/frontend/mobile/src/app/design-system/components/Tag/Tags.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Tag/Tags.tsx rename to frontend/mobile/src/app/design-system/components/Tag/Tags.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Text/ExpandableText.tsx b/frontend/mobile/src/app/design-system/components/Text/ExpandableText.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Text/ExpandableText.tsx rename to frontend/mobile/src/app/design-system/components/Text/ExpandableText.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Text/Text.tsx b/frontend/mobile/src/app/design-system/components/Text/Text.tsx similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Text/Text.tsx rename to frontend/mobile/src/app/design-system/components/Text/Text.tsx diff --git a/frontend/mobile/src/app/(design-system)/components/Text/TextVariants.ts b/frontend/mobile/src/app/design-system/components/Text/TextVariants.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/components/Text/TextVariants.ts rename to frontend/mobile/src/app/design-system/components/Text/TextVariants.ts diff --git a/frontend/mobile/src/app/(design-system)/components/Textbox/Textbox.tsx b/frontend/mobile/src/app/design-system/components/Textbox/Textbox.tsx similarity index 84% rename from frontend/mobile/src/app/(design-system)/components/Textbox/Textbox.tsx rename to frontend/mobile/src/app/design-system/components/Textbox/Textbox.tsx index 00dd39265..9537a050f 100644 --- a/frontend/mobile/src/app/(design-system)/components/Textbox/Textbox.tsx +++ b/frontend/mobile/src/app/design-system/components/Textbox/Textbox.tsx @@ -3,11 +3,11 @@ import { TextInput } from 'react-native'; import { BoxProps, createBox } from '@shopify/restyle'; -import ErrorIcon from '@/src/app/(design-system)/assets/svg/Error.svg'; -import { Box } from '@/src/app/(design-system)/components/Box/Box'; -import { Text } from '@/src/app/(design-system)/components/Text/Text'; -import { TextVariants } from '@/src/app/(design-system)/components/Text/TextVariants'; -import { Theme, createStyles } from '@/src/app/(design-system)/theme'; +import ErrorIcon from '@/src/app/design-system/assets/svg/Error.svg'; +import { Box } from '@/src/app/design-system/components/Box/Box'; +import { Text } from '@/src/app/design-system/components/Text/Text'; +import { TextVariants } from '@/src/app/design-system/components/Text/TextVariants'; +import { Theme, createStyles } from '@/src/app/design-system/theme'; type TextboxProps = { title?: string; diff --git a/frontend/mobile/src/app/(design-system)/index.ts b/frontend/mobile/src/app/design-system/index.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/index.ts rename to frontend/mobile/src/app/design-system/index.ts diff --git a/frontend/mobile/src/app/(design-system)/shared/border.ts b/frontend/mobile/src/app/design-system/shared/border.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/shared/border.ts rename to frontend/mobile/src/app/design-system/shared/border.ts diff --git a/frontend/mobile/src/app/(design-system)/shared/colors.ts b/frontend/mobile/src/app/design-system/shared/colors.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/shared/colors.ts rename to frontend/mobile/src/app/design-system/shared/colors.ts diff --git a/frontend/mobile/src/app/(design-system)/shared/spacing.ts b/frontend/mobile/src/app/design-system/shared/spacing.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/shared/spacing.ts rename to frontend/mobile/src/app/design-system/shared/spacing.ts diff --git a/frontend/mobile/src/app/(design-system)/shared/types.ts b/frontend/mobile/src/app/design-system/shared/types.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/shared/types.ts rename to frontend/mobile/src/app/design-system/shared/types.ts diff --git a/frontend/mobile/src/app/(design-system)/theme.ts b/frontend/mobile/src/app/design-system/theme.ts similarity index 100% rename from frontend/mobile/src/app/(design-system)/theme.ts rename to frontend/mobile/src/app/design-system/theme.ts diff --git a/frontend/mobile/src/assets/gif/loading.gif b/frontend/mobile/src/assets/gif/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1b07ea2e5bbd9c1ebf7d719a3892a7d2917f253 GIT binary patch literal 81572 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 literal 0 HcmV?d00001 diff --git a/frontend/mobile/src/store/slices/userSlice.ts b/frontend/mobile/src/store/slices/userSlice.ts index 30328f254..73459af09 100644 --- a/frontend/mobile/src/store/slices/userSlice.ts +++ b/frontend/mobile/src/store/slices/userSlice.ts @@ -1,9 +1,11 @@ import { createSlice } from '@reduxjs/toolkit'; +import { set } from 'react-hook-form'; export type UserState = { userId: string; email: string; accessToken?: string; + sacLoginSession?: string; }; const initialState: UserState = { @@ -26,10 +28,18 @@ export const userSlice = createSlice({ }, resetAccessToken: (state) => { state.accessToken = undefined; + }, + setSacLoginSession: (state, action) => { + state.sacLoginSession = action.payload; } } }); -export const { setUser, resetUser, setAccessToken, resetAccessToken } = - userSlice.actions; +export const { + setUser, + resetUser, + setAccessToken, + resetAccessToken, + setSacLoginSession +} = userSlice.actions; export default userSlice.reducer; diff --git a/frontend/mobile/src/types/index.d.ts b/frontend/mobile/src/types/index.d.ts new file mode 100644 index 000000000..6826c2c9c --- /dev/null +++ b/frontend/mobile/src/types/index.d.ts @@ -0,0 +1 @@ +declare module '*.gif'; diff --git a/frontend/mobile/yarn.lock b/frontend/mobile/yarn.lock index 07999f6a7..1d9d8b539 100644 --- a/frontend/mobile/yarn.lock +++ b/frontend/mobile/yarn.lock @@ -1402,10 +1402,10 @@ humps "^2.0.1" prop-types "^15.7.2" -"@generatesac/lib@0.0.171": - version "0.0.171" - resolved "https://registry.yarnpkg.com/@generatesac/lib/-/lib-0.0.171.tgz#e5ea2c800dc319e4938616e0033de6d1b2fb3ee9" - integrity sha512-/9RN79Oa5b8+bJsWaMD+8A+fyyaVdzc1KVt+9QVnHog8OaQivx6fAFu+lV2X/j25+KbKsEd/rCSWX5u6DfMe3Q== +"@generatesac/lib@0.0.177": + version "0.0.177" + resolved "https://registry.yarnpkg.com/@generatesac/lib/-/lib-0.0.177.tgz#0ed527f7dc5c8b9fb2cdd1065f74b8b519451a36" + integrity sha512-+4pqXtqslX0umNsacc8o4wHHrRC0Ay5Ius1sp2oNnmPReUUXeNH0nentLzv9Spr+nRv1FVH8LEuD6f7yDqkGrQ== dependencies: "@reduxjs/toolkit" "^2.2.3" react "^18.2.0" diff --git a/frontend/old_mobile/app/(app)/(tabs)/discover.tsx b/frontend/old_mobile/app/(app)/(tabs)/discover.tsx index ee56ebb0a..c06a14905 100644 --- a/frontend/old_mobile/app/(app)/(tabs)/discover.tsx +++ b/frontend/old_mobile/app/(app)/(tabs)/discover.tsx @@ -11,8 +11,8 @@ import { router } from 'expo-router'; import { useClubsQuery, useEventsQuery } from '@sac/lib'; -import { SearchBar } from '@/app/(app)/search/_components/search-bar'; -import { TopSearch } from '@/app/(app)/search/_components/top-search'; +import { SearchBar } from '@/src/app/search/_components/search-bar'; +import { TopSearch } from '@/src/app/search/_components/top-search'; import { ClubHomePageCard } from './_components/club-homepage-card'; import { EventHomePageCardHorizontal } from './_components/event-homepage-card'; @@ -45,7 +45,7 @@ const Discover = () => { searchBoxEditable={false} cancelOrBackButton="Back" onSearchBoxPressed={() => { - router.push('/(app)/search/recents'); + router.push('/app/search/recents'); return undefined; }} /> diff --git a/frontend/old_mobile/app/_layout.tsx b/frontend/old_mobile/app/_layout.tsx index 18541800b..e437212dd 100644 --- a/frontend/old_mobile/app/_layout.tsx +++ b/frontend/old_mobile/app/_layout.tsx @@ -42,14 +42,14 @@ const InitalLayout = () => { const handleNavigation = () => { if (isLoggedIn === null) return fetchCache(); - const inApp = segments[0] === "(app)"; + const inApp = segments[0] === "app"; console.log({ isLoggedIn, isVerified, inApp }); if (isLoggedIn && isVerified === false) { router.push("/(auth)/verification"); } else if (isLoggedIn && isVerified) { - router.push("/(app)/(tabs)/"); + router.push("/app/(tabs)/"); } else if (!isLoggedIn) { router.push("/(auth)/welcome"); } @@ -79,7 +79,7 @@ const InitalLayout = () => { - + ); From 08f5271a32c6a68d4943490f7a27dfb5b7f0f0d5 Mon Sep 17 00:00:00 2001 From: Alder Whiteford Date: Tue, 18 Jun 2024 12:54:41 -0400 Subject: [PATCH 2/5] OAuth Impl --- backend/entities/auth/base/handlers.go | 2 +- backend/integrations/oauth/crypt/crypt.go | 2 +- .../integrations/oauth/soth/sothic/sothic.go | 5 +- backend/middleware/auth/user.go | 8 +- backend/server/server.go | 2 +- frontend/lib/package.json | 2 +- frontend/lib/src/api/authApi.ts | 58 ++++---------- frontend/lib/src/api/base.ts | 2 +- frontend/lib/src/api/userApi.ts | 11 --- frontend/lib/src/types/auth.ts | 24 ++---- frontend/lib/src/types/user.ts | 8 +- frontend/mobile/package.json | 2 +- frontend/mobile/src/app/_layout.tsx | 7 +- .../mobile/src/app/app/(tabs)/calendar.tsx | 3 +- .../mobile/src/app/app/(tabs)/profile.tsx | 24 +++--- .../app/event/components/upcoming-events.tsx | 2 +- frontend/mobile/src/app/auth/callback.tsx | 71 ++++++++++++----- frontend/mobile/src/app/auth/index.tsx | 77 +++++++++++-------- .../components/EventCard/EventCardList.tsx | 2 +- .../PointofContactsList.tsx | 2 +- .../components/Preview/Club/ClubPreview.tsx | 2 +- .../components/Preview/Event/EventPreview.tsx | 4 +- frontend/mobile/src/hooks/useEvent.ts | 1 - frontend/mobile/src/store/slices/userSlice.ts | 45 +++++++---- frontend/mobile/yarn.lock | 8 +- 25 files changed, 188 insertions(+), 186 deletions(-) diff --git a/backend/entities/auth/base/handlers.go b/backend/entities/auth/base/handlers.go index b5e39179a..c7a8d95a5 100644 --- a/backend/entities/auth/base/handlers.go +++ b/backend/entities/auth/base/handlers.go @@ -89,7 +89,7 @@ func (h *Handler) ProviderCallback(c *fiber.Ctx) error { return err } - return c.SendStatus(http.StatusOK) + return c.Status(http.StatusOK).JSON(user) } func (h *Handler) ProviderLogout(c *fiber.Ctx) error { diff --git a/backend/integrations/oauth/crypt/crypt.go b/backend/integrations/oauth/crypt/crypt.go index 52352c987..20d515ed5 100644 --- a/backend/integrations/oauth/crypt/crypt.go +++ b/backend/integrations/oauth/crypt/crypt.go @@ -17,7 +17,7 @@ func Encrypt(data string, passphrase string) (string, error) { } plaintext := []byte(data) - if len(plaintext) > 1028 { + if len(plaintext) > 4096 { return "", fmt.Errorf("plaintext too long") } diff --git a/backend/integrations/oauth/soth/sothic/sothic.go b/backend/integrations/oauth/soth/sothic/sothic.go index 9768c99b6..ff7c2a3f3 100644 --- a/backend/integrations/oauth/soth/sothic/sothic.go +++ b/backend/integrations/oauth/soth/sothic/sothic.go @@ -210,6 +210,7 @@ func CompleteUserAuth(c *fiber.Ctx) (soth.User, error) { } gu, err := provider.FetchUser(sess) + return gu, err } @@ -227,6 +228,7 @@ func validateState(c *fiber.Ctx, sess soth.Session) error { } originalState := authURL.Query().Get("state") + if originalState != "" && (originalState != c.Query("state")) { return errors.New("state token mismatch") } @@ -357,13 +359,10 @@ func updateSessionValue(session *session.Session, key, value string) error { if err := gz.Close(); err != nil { return err } - encrypted, err := encrypter(b.String()) if err != nil { return err } - session.Set(key, encrypted) - return nil } diff --git a/backend/middleware/auth/user.go b/backend/middleware/auth/user.go index fd5ee7277..e4d569bf8 100644 --- a/backend/middleware/auth/user.go +++ b/backend/middleware/auth/user.go @@ -17,10 +17,10 @@ func (m *AuthMiddlewareHandler) UserAuthorizeById(c *fiber.Ctx) error { return c.SendStatus(http.StatusUnauthorized) } - user := models.UnmarshalUser(strUser) + user := *models.UnmarshalUser(strUser) if user.Role == models.Super { - locals.SetUser(c, user) + locals.SetUser(c, &user) return c.Next() } @@ -29,8 +29,8 @@ func (m *AuthMiddlewareHandler) UserAuthorizeById(c *fiber.Ctx) error { return err } - if idAsUUID == &user.ID { - locals.SetUser(c, user) + if *idAsUUID == user.ID { + locals.SetUser(c, &user) return c.Next() } diff --git a/backend/server/server.go b/backend/server/server.go index 9cb952cba..76bdf3a99 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -58,7 +58,7 @@ func Init(db *gorm.DB, stores *store.Stores, integrations integrations.Integrati applicationURL := settings.Application.ApplicationURL() - msftProvider := msft.New(settings.Microsft.Key, "myapp://auth/callback", settings.Microsft.Tenant) + msftProvider := msft.New(settings.Microsft.Key, fmt.Sprintf("%s/api/v1/auth/microsoftonline/callback", applicationURL), settings.Microsft.Tenant) googProvider := goog.New(settings.Google.Key, settings.Google.Secret, fmt.Sprintf("%s/api/v1/auth/google/callback", applicationURL)) authMiddleware := authMiddleware.New( diff --git a/frontend/lib/package.json b/frontend/lib/package.json index cb1bacb53..d6006b1ae 100644 --- a/frontend/lib/package.json +++ b/frontend/lib/package.json @@ -1,6 +1,6 @@ { "name": "@generatesac/lib", - "version": "0.0.177", + "version": "0.0.179", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/frontend/lib/src/api/authApi.ts b/frontend/lib/src/api/authApi.ts index 6ebc26805..f45f4f9b8 100644 --- a/frontend/lib/src/api/authApi.ts +++ b/frontend/lib/src/api/authApi.ts @@ -1,12 +1,9 @@ -import { LoginResponse, RefreshTokenRequestBody } from "../types/auth"; -import { - EmailRequestBody, - VerifyEmailRequestBody, - VerifyPasswordResetTokenRequestBody, -} from "../types/verification"; -import { baseApi } from "./base"; +import { User, userSchema } from "../types"; +import { LoginResponse, OAuthCallbackRequestQueryParams } from "../types/auth"; +import { baseApi, handleQueryParams } from "./base"; const AUTH_API_BASE_URL = "/auth"; +const PROVIDER = "microsoftonline"; export const authApi = baseApi.injectEndpoints({ endpoints: (builder) => ({ @@ -26,49 +23,20 @@ export const authApi = baseApi.injectEndpoints({ } }, }), - logout: builder.mutation({ + logout: builder.query({ query: () => ({ url: `${AUTH_API_BASE_URL}/logout`, - method: "POST", - }), - }), - refresh: builder.mutation({ - query: (body) => ({ - url: "refresh", - method: "POST", - body, - }), - }), - forgotPassword: builder.mutation({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/forgot-password`, - method: "POST", - body, - }), - }), - verifyPasswordResetToken: builder.mutation< - void, - VerifyPasswordResetTokenRequestBody - >({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/verify-reset`, - method: "POST", - body, - }), - }), - sendCode: builder.mutation({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/send-code`, - method: "POST", - body, + method: "GET", }), }), - verifyEmail: builder.mutation({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/verify-email`, - method: "POST", - body, + callback: builder.query({ + query: (params) => ({ + url: handleQueryParams(`${AUTH_API_BASE_URL}/${PROVIDER}/callback`, params), + method: "GET", }), + transformResponse: (response) => { + return userSchema.parse(response); + } }), }), }); diff --git a/frontend/lib/src/api/base.ts b/frontend/lib/src/api/base.ts index 9a32ddfa9..a4dfb23a3 100644 --- a/frontend/lib/src/api/base.ts +++ b/frontend/lib/src/api/base.ts @@ -11,7 +11,7 @@ export const baseApi = createApi({ // User slice existing must exist in all dependent apps: const token = (getState() as { user: { accessToken: string } })?.user?.accessToken; if (token) { - headers.set("Authorization", `Bearer ${token}`); + headers.set("_sac_session", token); } return headers; }, diff --git a/frontend/lib/src/api/userApi.ts b/frontend/lib/src/api/userApi.ts index 766491a2e..e91c205c8 100644 --- a/frontend/lib/src/api/userApi.ts +++ b/frontend/lib/src/api/userApi.ts @@ -1,6 +1,5 @@ import { z } from "zod"; -import { UpdatePasswordRequestBody } from "../types/auth"; import { Club, clubSchema } from "../types/club"; import { PaginationQueryParams } from "../types/root"; import { Tag, tagSchema } from "../types/tag"; @@ -82,16 +81,6 @@ export const userApi = baseApi.injectEndpoints({ }), invalidatesTags: (_result, _, id) => [{ type: "User", id }], }), - updatePassword: builder.mutation< - void, - { id: string; body: UpdatePasswordRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${USER_API_BASE_URL}/${id}/password`, - method: "PATCH", - body, - }), - }), userFollowing: builder.query({ query: (id) => ({ url: `${USER_API_BASE_URL}/${id}/follower/`, diff --git a/frontend/lib/src/types/auth.ts b/frontend/lib/src/types/auth.ts index 0a5114fdb..c3eaec616 100644 --- a/frontend/lib/src/types/auth.ts +++ b/frontend/lib/src/types/auth.ts @@ -5,26 +5,12 @@ export const loginResponseSchema = z.object({ sac_session: z.string(), }); -export const updatePasswordRequestBodySchema = z.object({ - old_password: z.string().min(8), - new_password: z.string().min(8), -}); - -export const refreshTokenRequestBodySchema = z.object({ - refresh_token: z.string(), -}); - -export const tokensSchema = z.object({ - access_token: z.string(), - refresh_token: z.string(), +export const oauthCallbackRequestQueryParams = z.object({ + code: z.string(), + session_state: z.string(), + state: z.string(), }); // Types: export type LoginResponse = z.infer; -export type UpdatePasswordRequestBody = z.infer< - typeof updatePasswordRequestBodySchema ->; -export type RefreshTokenRequestBody = z.infer< - typeof refreshTokenRequestBodySchema ->; -export type Tokens = z.infer; +export type OAuthCallbackRequestQueryParams = z.infer; diff --git a/frontend/lib/src/types/user.ts b/frontend/lib/src/types/user.ts index b2e9b1572..cc18f52d8 100644 --- a/frontend/lib/src/types/user.ts +++ b/frontend/lib/src/types/user.ts @@ -6,6 +6,7 @@ import { rootModelSchema } from "./root"; export const userRoleEnum = z.enum(["super", "student"]); export const collegeEnum = z.enum([ + "", "CAMD", "DMSB", "KCCS", @@ -18,6 +19,7 @@ export const collegeEnum = z.enum([ ]); export const majorEnum = z.enum([ + "", "africanaStudies", "americanSignLanguage", "americanSignLanguage-EnglishInterpreting", @@ -120,7 +122,7 @@ export const majorEnum = z.enum([ "theatre", ]); -export const graduationCycleEnum = z.enum(["december", "may"]); +export const graduationCycleEnum = z.enum(["december", "may", ""]); export const yearEnum = z.enum(["1", "2", "3", "4", "5"]); @@ -155,8 +157,7 @@ export const createUserTagsRequestBodySchema = z.object({ const userSchemaIntermediate = z.object({ role: userRoleEnum, - first_name: z.string().min(1), - last_name: z.string().min(1), + name: z.string().min(1), email: z.string().email(), major0: majorEnum.optional(), major1: majorEnum.optional(), @@ -164,7 +165,6 @@ const userSchemaIntermediate = z.object({ college: collegeEnum.optional(), graduation_cycle: graduationCycleEnum.optional(), graduation_year: z.number().optional(), - is_verified: z.boolean(), }); export const userSchema = userSchemaIntermediate.merge(rootModelSchema); diff --git a/frontend/mobile/package.json b/frontend/mobile/package.json index 37b600937..7829812e3 100644 --- a/frontend/mobile/package.json +++ b/frontend/mobile/package.json @@ -25,7 +25,7 @@ "@fortawesome/free-solid-svg-icons": "^6.5.2", "@fortawesome/react-fontawesome": "^0.2.2", "@fortawesome/react-native-fontawesome": "^0.3.2", - "@generatesac/lib": "0.0.177", + "@generatesac/lib": "0.0.179", "@gorhom/bottom-sheet": "^4.6.3", "@hookform/resolvers": "^3.4.2", "@react-native-async-storage/async-storage": "^1.23.1", diff --git a/frontend/mobile/src/app/_layout.tsx b/frontend/mobile/src/app/_layout.tsx index 4ee52f3b9..e412505d1 100644 --- a/frontend/mobile/src/app/_layout.tsx +++ b/frontend/mobile/src/app/_layout.tsx @@ -20,7 +20,7 @@ export { ErrorBoundary } from 'expo-router'; SplashScreen.preventAutoHideAsync(); const InitalLayout = () => { - const { accessToken } = useAppSelector((state) => state.user); + const { accessToken, loggedIn } = useAppSelector((state) => state.user); const { eventPreviewRef, eventId, @@ -33,12 +33,13 @@ const InitalLayout = () => { } = usePreview(); useEffect(() => { - if (accessToken) { + if (accessToken && loggedIn) { router.push('/app/'); } else { router.push('/auth/'); } - }, [accessToken]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [loggedIn]); return ( <> diff --git a/frontend/mobile/src/app/app/(tabs)/calendar.tsx b/frontend/mobile/src/app/app/(tabs)/calendar.tsx index d865b1fdd..9848bef41 100644 --- a/frontend/mobile/src/app/app/(tabs)/calendar.tsx +++ b/frontend/mobile/src/app/app/(tabs)/calendar.tsx @@ -6,6 +6,8 @@ import { } from 'react-native-calendars-sac'; import { Theme } from 'react-native-calendars-sac/src/types'; +import { eventApi } from '@generatesac/lib'; + import { Box, Colors, createStyles } from '@/src/app/design-system'; import Calendar, { DAY_EPOCH_TIME, @@ -13,7 +15,6 @@ import Calendar, { } from '@/src/app/design-system/components/Calendar/Calendar'; import { EventSection } from '@/src/app/design-system/components/Calendar/DayTimeSection'; import { parseData } from '@/src/app/design-system/components/Calendar/parser/calendarParser'; -import { eventApi } from '@generatesac/lib'; const TODAY = new Date(); diff --git a/frontend/mobile/src/app/app/(tabs)/profile.tsx b/frontend/mobile/src/app/app/(tabs)/profile.tsx index a1bdd8af0..5a79d0335 100644 --- a/frontend/mobile/src/app/app/(tabs)/profile.tsx +++ b/frontend/mobile/src/app/app/(tabs)/profile.tsx @@ -11,9 +11,10 @@ import { faUser } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-native-fontawesome'; -import { Avatar } from '@rneui/base'; import { GlobalLayout } from '@/src/app/design-system/components/GlobalLayout/GlobalLayout'; +import { resetAccessToken } from '@/src/store/slices/userSlice'; +import { useAppDispatch, useAppSelector } from '@/src/store/store'; import { Box, Colors, SACColors, Spacing, Text } from '../../design-system'; @@ -43,6 +44,9 @@ const ProfileItem = ({ icon, text, textColor, onPress }: ProfileItemProps) => ( ); const ProfilePage = () => { + const dispatch = useAppDispatch(); + const user = useAppSelector((state) => state.user); + return ( @@ -52,27 +56,20 @@ const ProfilePage = () => { gap="m" alignItems="center" > - - Quokka - quokka@northeastern.edu + {user.name} + {user.email} router.push('/user/detail/')} + onPress={() => router.push('/app/user/detail/')} icon={faUser} text="Edit Profile" /> router.push('/user/interest/')} + onPress={() => router.push('/app/user/interest/')} text="Edit Interests" /> { icon={faSignOutAlt} text="Logout" textColor="darkRed" + onPress={() => { + dispatch(resetAccessToken()); + }} /> diff --git a/frontend/mobile/src/app/app/event/components/upcoming-events.tsx b/frontend/mobile/src/app/app/event/components/upcoming-events.tsx index d4253a1f1..02f7c1f8b 100644 --- a/frontend/mobile/src/app/app/event/components/upcoming-events.tsx +++ b/frontend/mobile/src/app/app/event/components/upcoming-events.tsx @@ -15,7 +15,7 @@ interface UpcomingEventsProps { export const UpcomingEvent: React.FC = ({ events }) => { const renderEventCard = ({ item }: { item: Event }) => { return ( - router.push(`/event/${item.id}`)}> + router.push(`/app/event/${item.id}`)}> { const params = useLocalSearchParams(); - const { sacLoginSession } = useAppSelector((state) => state.user); + const [oAuthCallback] = authApi.useLazyCallbackQuery(); + const dispatch = useAppDispatch(); + const { accessToken } = useAppSelector((state) => state.user); useEffect(() => { - const { code, session_state, state } = params; - console.log(params) - console.log(sacLoginSession); - if (!code || !session_state || !state) { - console.log('failed!') + const { code, session_state, state } = + params as OAuthCallbackRequestQueryParams; + if (code || session_state || state) { + oAuthCallback({ code, session_state, state }).then( + ({ data, error }) => { + if (data) { + dispatch(setUser(data)); + dispatch(setLoggedInState(true)); + router.push('/app/'); + } + if (error) { + router.push('/auth/'); + } + } + ); } - - }, [params]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [accessToken]); return ( - - - Callback!!!!!!! - + + + Logging you in... - ) -} + ); +}; -export default OAuthCallback; \ No newline at end of file +export default OAuthCallback; diff --git a/frontend/mobile/src/app/auth/index.tsx b/frontend/mobile/src/app/auth/index.tsx index 07080c212..6daacdef8 100644 --- a/frontend/mobile/src/app/auth/index.tsx +++ b/frontend/mobile/src/app/auth/index.tsx @@ -1,61 +1,78 @@ -import React, { useEffect } from 'react'; - -import { Box, Button, Text } from '../design-system'; +import React from 'react'; import { Image, Linking, SafeAreaView } from 'react-native'; -import { GlobalLayout } from '../design-system/components/GlobalLayout/GlobalLayout'; + +import { router } from 'expo-router'; + import { authApi } from '@generatesac/lib'; + import Loading from '@/src/assets/gif/loading.gif'; -import { useLocalSearchParams } from 'expo-router'; +import { setAccessToken } from '@/src/store/slices/userSlice'; import { useAppDispatch } from '@/src/store/store'; -import { setSacLoginSession } from '@/src/store/slices/userSlice'; + +import { Box, Button, Text } from '../design-system'; +import { GlobalLayout } from '../design-system/components/GlobalLayout/GlobalLayout'; const WelcomePage = () => { - const [login, { isLoading, error, data }] = authApi.useLazyLoginQuery(); + const [login, { isLoading }] = authApi.useLazyLoginQuery(); const dispatch = useAppDispatch(); - const search = useLocalSearchParams(); - console.log(search); - const handleLogin = async () => { - await login().then(async () => { + const handleLogin = () => { + login().then(async ({ data }) => { if (data) { - dispatch(setSacLoginSession(data.sac_session)); await Linking.openURL(data.redirect_uri); + dispatch(setAccessToken(data.sac_session)); } - }) + }); }; return ( - - - Welcome to the - - + Welcome to the + Student Activity Calendar - + diff --git a/frontend/mobile/src/app/design-system/components/EventCard/EventCardList.tsx b/frontend/mobile/src/app/design-system/components/EventCard/EventCardList.tsx index 2c64bc4ec..2475f46e4 100644 --- a/frontend/mobile/src/app/design-system/components/EventCard/EventCardList.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/EventCardList.tsx @@ -17,7 +17,7 @@ export const EventCardList: React.FC = ({ }) => { const renderEventCard = ({ item }: { item: Event }) => { return ( - router.push(`/event/${item.id}`)}> + router.push(`/app/event/${item.id}`)}> = ({ }) => { const renderPointOfContact = ({ item }: { item: PointOfContact }) => { return ( - router.push(`/contact/${item.id}`)}> + router.push(`/app/contact/${item.id}`)}> ( - diff --git a/frontend/mobile/src/app/design-system/components/Calendar/DayTimeSection.tsx b/frontend/mobile/src/app/design-system/components/Calendar/DayTimeSection.tsx index cfbaa2036..e824fb9b5 100644 --- a/frontend/mobile/src/app/design-system/components/Calendar/DayTimeSection.tsx +++ b/frontend/mobile/src/app/design-system/components/Calendar/DayTimeSection.tsx @@ -40,17 +40,15 @@ function convertNumToTime(num: number) { let meridiem = num === 23 ? 'AM' : 'PM'; let minutes = num % 100; - if (num !== 0 && (num < 1000 || num > 2359)) { + if (num !== 0 && (num < 0 || num > 2359)) { throw new Error('Invalid time'); } time = time / 100; - - if (num < 12) { - time += 12; + if (time < 12) { meridiem = 'AM'; } - if (num > 12) { + if (time > 12) { time -= 12; } diff --git a/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardBig.tsx b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardBig.tsx index 32c9eea06..31bd582ac 100644 --- a/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardBig.tsx +++ b/frontend/mobile/src/app/design-system/components/EventCard/Variants/EventCardBig.tsx @@ -29,7 +29,7 @@ export const EventCardBig: React.FC = ({ return ( router.navigate(`/event/${eventId}`)} + onPress={() => router.navigate(`/app/event/${eventId}`)} > Date: Tue, 18 Jun 2024 19:34:17 -0400 Subject: [PATCH 4/5] Stuff --- backend/server/server.go | 2 +- frontend/lib/package.json | 2 +- frontend/lib/src/api/base.ts | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/server/server.go b/backend/server/server.go index 76bdf3a99..9cb952cba 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -58,7 +58,7 @@ func Init(db *gorm.DB, stores *store.Stores, integrations integrations.Integrati applicationURL := settings.Application.ApplicationURL() - msftProvider := msft.New(settings.Microsft.Key, fmt.Sprintf("%s/api/v1/auth/microsoftonline/callback", applicationURL), settings.Microsft.Tenant) + msftProvider := msft.New(settings.Microsft.Key, "myapp://auth/callback", settings.Microsft.Tenant) googProvider := goog.New(settings.Google.Key, settings.Google.Secret, fmt.Sprintf("%s/api/v1/auth/google/callback", applicationURL)) authMiddleware := authMiddleware.New( diff --git a/frontend/lib/package.json b/frontend/lib/package.json index d6006b1ae..9b9af8d87 100644 --- a/frontend/lib/package.json +++ b/frontend/lib/package.json @@ -1,6 +1,6 @@ { "name": "@generatesac/lib", - "version": "0.0.179", + "version": "0.0.180", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/frontend/lib/src/api/base.ts b/frontend/lib/src/api/base.ts index a4dfb23a3..1920a23f8 100644 --- a/frontend/lib/src/api/base.ts +++ b/frontend/lib/src/api/base.ts @@ -1,11 +1,12 @@ import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; -export const API_BASE_URL = "http://127.0.0.1:8080/api/v1"; +export const LOCAL_API_BASE_URL = "http://localhost:3000/api/v1"; +export const PROD_API_BASE_URL = "https://studentactivitycalendar.xyz/api/v1"; // BaseAPI for the entire application: export const baseApi = createApi({ baseQuery: fetchBaseQuery({ - baseUrl: API_BASE_URL, + baseUrl: PROD_API_BASE_URL, credentials: "include", prepareHeaders: async (headers, { getState }) => { // User slice existing must exist in all dependent apps: From b8790d5a34e816f6c5fbe334fda876ec8953654c Mon Sep 17 00:00:00 2001 From: Alder Whiteford Date: Tue, 18 Jun 2024 19:36:48 -0400 Subject: [PATCH 5/5] Linting --- frontend/mobile/src/app/auth/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/mobile/src/app/auth/index.tsx b/frontend/mobile/src/app/auth/index.tsx index 8fba23f15..b1c6d7891 100644 --- a/frontend/mobile/src/app/auth/index.tsx +++ b/frontend/mobile/src/app/auth/index.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { Image, Linking, SafeAreaView } from 'react-native'; -import { router } from 'expo-router'; - import { authApi } from '@generatesac/lib'; import Loading from '@/src/assets/gif/loading.gif';