{"version":3,"file":"services-BanluofB.js","sources":["../../src/graphql/mutations.ts","../../src/lib/api-client.ts","../../src/services/api.ts"],"sourcesContent":["export const createContactForm = /* GraphQL */ `\n mutation CreateContactForm($input: CreateContactFormInput!) {\n createContactForm(input: $input) {\n id\n name\n email\n message\n service\n createdAt\n status\n }\n }\n`\n\nexport const createBlogPost = /* GraphQL */ `\n mutation CreateBlogPost($input: CreateBlogPostInput!) {\n createBlogPost(input: $input) {\n slug\n title\n excerpt\n content\n author\n publishedAt\n createdAt\n updatedAt\n tags\n readingTime\n featuredImage\n status\n }\n }\n`\n\nexport const updateBlogPost = /* GraphQL */ `\n mutation UpdateBlogPost($input: UpdateBlogPostInput!) {\n updateBlogPost(input: $input) {\n slug\n title\n excerpt\n content\n author\n publishedAt\n createdAt\n updatedAt\n tags\n readingTime\n featuredImage\n status\n }\n }\n`\n\nexport const deleteBlogPost = /* GraphQL */ `\n mutation DeleteBlogPost($input: DeleteBlogPostInput!) {\n deleteBlogPost(input: $input) {\n slug\n title\n excerpt\n content\n author\n publishedAt\n createdAt\n updatedAt\n tags\n readingTime\n featuredImage\n status\n }\n }\n`\n\nexport const createProject = /* GraphQL */ `\n mutation CreateProject($input: CreateProjectInput!) {\n createProject(input: $input) {\n id\n title\n slug\n projectType\n status\n excerpt\n content\n author\n publishedAt\n createdAt\n updatedAt\n tags\n featuredImage\n thumbnailImage\n contentImage\n projectStatus\n githubUrl\n liveUrl\n techStack\n }\n }\n`\n\nexport const updateProject = /* GraphQL */ `\n mutation UpdateProject($input: UpdateProjectInput!) {\n updateProject(input: $input) {\n id\n title\n slug\n projectType\n status\n excerpt\n content\n author\n publishedAt\n createdAt\n updatedAt\n tags\n featuredImage\n thumbnailImage\n contentImage\n projectStatus\n githubUrl\n liveUrl\n techStack\n }\n }\n`\n\nexport const deleteProject = /* GraphQL */ `\n mutation DeleteProject($slug: String!) {\n deleteProject(slug: $slug)\n }\n`\n","/**\n * Simple GraphQL API Client for AppSync\n * Uses fetch for direct GraphQL operations\n */\nimport { GraphQLError } from 'graphql'\n\ninterface GraphQLResponse {\n data?: T\n errors?: GraphQLError[]\n}\n\n// Debug mode for detailed logging\nconst DEBUG = true\nconst log = {\n info: (...args: unknown[]) => DEBUG && console.log('[API]', ...args),\n error: (...args: unknown[]) => DEBUG && console.error('[API Error]', ...args)\n}\n\n// Validate environment variables\nif (\n !import.meta.env.VITE_APPSYNC_ENDPOINT ||\n !import.meta.env.VITE_APPSYNC_API_KEY\n) {\n console.error('Missing required environment variables for API client:', {\n hasEndpoint: !!import.meta.env.VITE_APPSYNC_ENDPOINT,\n hasApiKey: !!import.meta.env.VITE_APPSYNC_API_KEY,\n mode: import.meta.env.MODE,\n baseUrl: import.meta.env.BASE_URL\n })\n throw new Error('Missing required environment variables')\n}\n\nconst API_ENDPOINT = import.meta.env.VITE_APPSYNC_ENDPOINT\nconst API_KEY = import.meta.env.VITE_APPSYNC_API_KEY\n\nconsole.log(\n 'API client initialized with endpoint:',\n API_ENDPOINT.substring(0, 20) + '...'\n)\n\n// Execute a GraphQL query\nexport async function query(\n query: string,\n variables?: Record\n): Promise {\n log.info('Executing GraphQL query:', {\n queryName: query.split('{')[0].trim(),\n variables,\n endpoint: API_ENDPOINT.substring(0, 20) + '...',\n apiKeyLength: API_KEY ? API_KEY.length : 0\n })\n\n try {\n const response = await fetch(API_ENDPOINT, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': API_KEY\n },\n body: JSON.stringify({\n query,\n variables\n })\n })\n\n // Log detailed response info\n log.info('GraphQL response status:', response.status, response.statusText)\n\n if (!response.ok) {\n const errorText = await response.text()\n console.error(\n `HTTP error from AppSync! Status: ${response.status}`,\n errorText\n )\n\n // Detailed error handling based on status codes\n if (response.status === 401 || response.status === 403) {\n console.error(\n 'API Key authentication failed! Check your API key validity and expiration'\n )\n } else if (response.status === 400) {\n console.error(\n 'Bad request to AppSync! Check your query syntax and variables'\n )\n } else if (response.status >= 500) {\n console.error(\n 'AppSync server error! The service might be experiencing issues'\n )\n }\n\n throw new Error(\n `HTTP error from AppSync! Status: ${response.status} - ${errorText}`\n )\n }\n\n const result = (await response.json()) as GraphQLResponse\n\n if (DEBUG) {\n console.log('GraphQL response:', {\n hasData: !!result.data,\n hasErrors: !!result.errors,\n errorCount: result.errors?.length,\n dataKeys: result.data ? Object.keys(result.data) : []\n })\n }\n\n if (result.errors?.length) {\n console.error('GraphQL errors from AppSync:', result.errors)\n\n // Check for specific error types\n const authErrors = result.errors.filter(\n (e) =>\n e.message.includes('auth') ||\n e.message.includes('token') ||\n e.message.includes('unauthorized') ||\n e.message.includes('permission')\n )\n\n if (authErrors.length > 0) {\n console.error(\n 'Authentication errors detected! Check your API key validity and permissions'\n )\n }\n\n throw new Error(result.errors[0].message)\n }\n\n if (!result.data) {\n console.error('No data returned from AppSync API')\n throw new Error('No data returned from AppSync API')\n }\n\n log.info('Successfully received data from AppSync')\n return result.data\n } catch (error) {\n console.error('GraphQL query failed:', error)\n\n // More detailed error logging\n if (error instanceof TypeError && error.message.includes('fetch')) {\n console.error('Network error: Could not connect to AppSync endpoint', {\n endpoint: API_ENDPOINT.substring(0, 20) + '...',\n error\n })\n } else if (error instanceof SyntaxError) {\n console.error('Invalid JSON in response from AppSync', {\n error\n })\n }\n\n // Rethrow with more details\n if (error instanceof Error) {\n throw new Error(`AppSync API error: ${error.message}`)\n }\n\n throw error\n }\n}\n\n// Execute a GraphQL mutation\nexport async function mutate(\n mutation: string,\n variables?: Record\n): Promise {\n return query(mutation, variables)\n}\n","import { createContactForm } from '../graphql/mutations'\nimport { mutate } from '../lib/api-client'\n\nexport interface ContactFormData {\n name: string\n email: string\n message: string\n service?: string\n}\n\ninterface CreateContactFormResponse {\n id: string\n name: string\n email: string\n message: string\n service?: string\n createdAt: string\n status: string\n}\n\nexport const submitContactForm = async (formData: ContactFormData) => {\n try {\n const response = await mutate<{\n createContactForm: CreateContactFormResponse\n }>(createContactForm, { input: formData })\n\n if (!response?.createContactForm) {\n throw new Error('Invalid response format')\n }\n\n return response.createContactForm\n } catch (error: unknown) {\n console.error('Error submitting contact form:', error)\n\n if (error instanceof Error) {\n // Provide user-friendly error messages\n if (error.message.includes('Network error')) {\n throw new Error(\n 'Unable to connect to the server. Please check your internet connection.'\n )\n } else if (error.message.includes('not found')) {\n throw new Error(\n 'Service temporarily unavailable. Please try again later.'\n )\n } else if (\n error.message.includes('401') ||\n error.message.includes('403')\n ) {\n throw new Error(\n 'Service temporarily unavailable. Please try again later.'\n )\n } else if (error.message.includes('Validation error')) {\n throw new Error('Please check your input and try again.')\n }\n }\n\n throw new Error('Failed to submit form. Please try again.')\n }\n}\n"],"names":["log","args","console","API_ENDPOINT","API_KEY","async","mutate","mutation","variables","query","_a","_b","queryName","split","trim","endpoint","substring","apiKeyLength","response","fetch","method","headers","body","JSON","stringify","status","statusText","ok","errorText","text","error","Error","result","json","hasData","data","hasErrors","errors","errorCount","length","dataKeys","Object","keys","filter","e","message","includes","TypeError","SyntaxError","submitContactForm","formData","input","createContactForm"],"mappings":"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"}