{"record":{"id":"248c02f00c55ab87","repo":"twentyhq/twenty","slug":"failed-to-create-view-248c02","errorCode":null,"errorMessage":"Failed to create view","messagePattern":"Failed to create view","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts","lineNumber":162,"sourceCode":"                : undefined,\n            calendarEndFieldMetadataId:\n              viewType === ViewType.CALENDAR\n                ? calendarEndFieldMetadataId\n                : undefined,\n            visibility,\n          },\n        },\n        objectMetadataItem.id,\n      );\n\n      if (result.status === 'failed') {\n        return undefined;\n      }\n\n      const newViewId = result.response.data?.createView.id;\n\n      if (isUndefinedOrNull(newViewId)) {\n        throw new Error('Failed to create view');\n      }\n\n      const fieldResult = await performViewFieldAPICreate({\n        inputs: sourceView.viewFields.map((viewField) => ({\n          id: v4(),\n          fieldMetadataId: viewField.fieldMetadataId,\n          position: viewField.position,\n          isVisible: viewField.isVisible,\n          size: viewField.size,\n          aggregateOperation: viewField.aggregateOperation,\n          viewFieldGroupId: viewField.viewFieldGroupId,\n          viewId: newViewId,\n        })),\n      });\n\n      if (fieldResult.status === 'failed') {\n        return undefined;\n      }","sourceCodeStart":144,"sourceCodeEnd":180,"githubUrl":"https://github.com/twentyhq/twenty/blob/1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts#L144-L180","documentation":"Thrown in useCreateViewFromCurrentView after performViewAPICreate returned a non-failed status, but `result.response.data.createView.id` is null/undefined. It is a defensive guard for the case where the persist layer reported success yet the created view id is missing from the response.","triggerScenarios":"performViewAPICreate resolves with status 'successful' but the inner mutation data is absent or createView has no id. Race between optimistic update and server response. Codegen drift on the CreateView selection set omitting id.","commonSituations":"Mutation resolved with errors but the persist operation still classified the result as successful. Schema change removed id from the createView payload.","solutions":["Inspect result.response.data shape and the errors array for the createView mutation.","Re-run graphql codegen to ensure id is selected on CreateView.","Have performViewAPICreate propagate a failed status when createView is null instead of relying on this downstream guard."],"exampleFix":"// before: if (isUndefinedOrNull(newViewId)) { throw new Error('Failed to create view'); }\n// after:  if (isUndefinedOrNull(newViewId)) {\n//           throw new Error(result.response.errors?.[0]?.message ?? 'Failed to create view');\n//         }","handlingStrategy":"try-catch","validationCode":"const hasCreatedViewId = (r: MetadataRequestResult<any>): boolean =>\n  r.status === 'successful' && isDefined(r.response?.data?.createView?.id);","typeGuard":"const isCreateViewId = (v: unknown): v is string =>\n  typeof v === 'string' && v.length > 0;","tryCatchPattern":"try {\n  await createViewFromCurrentView({...}, true);\n} catch (e) {\n  showError((e as Error).message); // 'Failed to create view'\n}","preventionTips":["Make performViewAPICreate return a failed status when createView is null so the downstream guard is unreachable.","Re-run metadata graphql:generate after CreateView selection-set changes.","Surface mutation errors to the user instead of relying on a generic throw."],"tags":["views","graphql","apollo","metadata"],"backgroundTag":null,"analyzedSha":"1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6","analyzedAt":"2026-08-12T15:37:27.593Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}