{"record":{"id":"9ff5460c4bfa2154","repo":"laurent22/joplin","slug":"unsupported-folder-icon-type-icon-type","errorCode":null,"errorMessage":"Unsupported folder icon type: ${icon.type}","messagePattern":"Unsupported folder icon type: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/app-mobile/components/SideMenuContent/SidebarIcon.tsx","lineNumber":33,"sourceCode":"\t\treturn <View style={styles.emptyIcon}/>;\n\t}\n\n\tif (typeof icon === 'string') {\n\t\ticon = {\n\t\t\ttype: FolderIconType.FontAwesome,\n\t\t\tname: icon,\n\t\t\temoji: '',\n\t\t\tdataUrl: '',\n\t\t};\n\t}\n\tif (icon.type === FolderIconType.Emoji) {\n\t\treturn <Text style={[styles.baseTextIcon, styles.emojiIcon, style]}>{icon.emoji}</Text>;\n\t} else if (icon.type === FolderIconType.DataUrl) {\n\t\treturn <Image style={[styles.imageIcon, style]} source={{ uri: icon.dataUrl }}/>;\n\t} else if (icon.type === FolderIconType.FontAwesome) {\n\t\treturn <Icon style={[styles.baseTextIcon, styles.fontIcon, style]} name={icon.name} accessibilityLabel={null}/>;\n\t} else {\n\t\tthrow new Error(`Unsupported folder icon type: ${icon.type}`);\n\t}\n};\n\nconst iconWidth = 20;\nconst styles = StyleSheet.create({\n\tbaseTextIcon: {\n\t\ttextAlign: 'center',\n\t\ttextAlignVertical: 'center',\n\t\tminWidth: iconWidth,\n\t},\n\timageIcon: {\n\t\theight: 20,\n\t\tresizeMode: 'contain',\n\t\twidth: iconWidth,\n\t},\n\tfontIcon: {\n\t\tfontSize: 18,\n\t},","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/laurent22/joplin/blob/981a03c5c9e88130bccff4db47c411d35ec7ae2c/packages/app-mobile/components/SideMenuContent/SidebarIcon.tsx#L15-L51","documentation":"SidebarIcon renders a folder icon based on icon.type; it supports Emoji, DataUrl, and FontAwesome types. If the icon object's type property holds any other value, the component throws this Error rather than rendering a broken icon. It is an exhaustive-branch guard over the FolderIconType enum.","triggerScenarios":"Passing an icon whose type is not one of FolderIconType.Emoji/DataUrl/FontAwesome — e.g. an old persisted icon record with a removed enum value, a typo like 'fontawesome' as a raw string, a new FolderIconType added without updating SidebarIcon, or icon being undefined/garbage data.","commonSituations":"Migrating or syncing notes between app versions where the icon enum changed; user-edited or imported data containing an unknown type value; adding a new FolderIconType case in the enum but forgetting the renderer branch in SidebarIcon.tsx.","solutions":["Add a rendering branch (or map the unknown value onto a default icon) for the missing FolderIconType in SidebarIcon.tsx","Normalize legacy icon data on load: map or strip icons whose type is no longer in FolderIconType","Validate the icon object with a type guard before rendering and fall back to a default icon","Log the offending icon.type value to identify which data/enum version produced it"],"exampleFix":"// before\n} else {\n\tthrow new Error(`Unsupported folder icon type: ${icon.type}`);\n}\n// after\n} else if (icon.type === FolderIconType.NewType) {\n\treturn <NewIconComponent .../>;\n} else {\n\treturn <Icon style={[styles.baseTextIcon, styles.fontIcon, style]} name=\"far fa-folder\" accessibilityLabel={null}/>;\n}","handlingStrategy":"validation","validationCode":"const RENDERABLE_ICON_TYPES = [FolderIconType.Emoji, FolderIconType.DataUrl, FolderIconType.FontAwesome];\nconst isRenderableIcon = (icon: any) => icon && RENDERABLE_ICON_TYPES.includes(icon.type);","typeGuard":"const isFolderIcon = (v: unknown): v is FolderIcon =>\n\t!!v && typeof v === 'object' && 'type' in v &&\n\t[FolderIconType.Emoji, FolderIconType.DataUrl, FolderIconType.FontAwesome].includes((v as FolderIcon).type);","tryCatchPattern":"let content;\ntry {\n\tcontent = <SidebarIcon icon={icon}/>;\n} catch (e) {\n\tconsole.warn('Falling back to default folder icon:', e);\n\tcontent = <Icon name=\"far fa-folder\" accessibilityLabel={null}/>;\n}","preventionTips":["Wrap unknown-icon rendering in a type guard and render a default folder icon as fallback","Normalize icon data on load/import: drop or remap records whose type is not in FolderIconType","When adding a FolderIconType value, update SidebarIcon's branch chain in the same commit","Keep legacy enum values migrated during app-version upgrades so persisted data never carries stale types"],"tags":["react-native","ui","enum","folder-icon"],"backgroundTag":"unsupported-enum-value","analyzedSha":"981a03c5c9e88130bccff4db47c411d35ec7ae2c","analyzedAt":"2026-09-17T14:49:40.960Z","contentChangedAt":"2026-09-17T14:49:40.960Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}