refactor into own widget for reuse